diff build.xml @ 39:89d7f4d91f67

Got a working, non-bloated Apple Mac bundle!
author David Barts <n5jrn@me.com>
date Fri, 01 May 2020 23:06:04 -0700
parents 4fdd2f7e2cec
children 4076f1bbf21d
line wrap: on
line diff
--- a/build.xml	Fri May 01 11:52:46 2020 -0700
+++ b/build.xml	Fri May 01 23:06:04 2020 -0700
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project name="JpegWasher" default="help" basedir="."
   xmlns:contrib="antlib:net.sf.antcontrib"
-  xmlns:jarbundler="antlib:com.ultramixer.jarbundler"
   xmlns:launch4j="antlib:net.sf.launch4j.ant">
   <!-- import all environment variables as env.* -->
   <property environment="env"/>
@@ -58,7 +57,8 @@
   <!-- Define the properties used by the build -->
   <property name="app.name"      value="${ant.project.name}"/>
   <property name="app.version"   value="1.03"/>
-  <property name="app.entry"     value="name.blackcap.exifwasher.MainKt"/>
+  <property name="app.domain"    value="name.blackcap.exifwasher"/>
+  <property name="app.entry"     value="${app.domain}.MainKt"/>
   <toLowerCase target="lc.app.name" value="${app.name}"/>
   <property name="jar.name"      value="${basedir}/${lc.app.name}.jar"/>
   <property name="work.jar"      value="${basedir}/work.jar"/>
@@ -68,8 +68,10 @@
   <property name="pf.home"       value="${basedir}/package-files"/>
   <property name="nat.dir"       value="${src.home}/name/blackcap/exifwasher/exiv2"/>
   <property name="bin.dir"       value="${src.home}/name/blackcap/exifwasher/binaries"/>
+  <property name="jvm.version"   value="1.8"/>
 
   <!-- load the ant-contrib tasks -->
+  <!-- TODO: see if we need this, remove if not (also see xmlns above) -->
   <taskdef resource="net/sf/antcontrib/antlib.xml"
            uri="antlib:net.sf.antcontrib">
     <classpath>
@@ -77,18 +79,6 @@
     </classpath>
   </taskdef>
 
-  <!-- load jarbundler (Mac app bundler) tasks -->
-  <contrib:if>
-    <os family="mac"/>
-    <contrib:then>
-      <taskdef name="create"
-               classname="com.ultramixer.jarbundler.JarBundler"
-               classpath="${lib.home}/jarbundler-core-3.3.0.jar"
-               uri="antlib:com.ultramixer.jarbundler">
-      </taskdef>
-    </contrib:then>
-  </contrib:if>
-
   <!-- load launch4j (Windows app bundler) tasks -->
   <contrib:if>
     <os family="windows"/>
@@ -151,7 +141,7 @@
 
   <!-- remove old cruft -->
   <target name="clean">
-    <delete includeEmptyDirs="true">
+    <delete includeEmptyDirs="true" failonerror="false">
       <fileset dir="${dist.home}" includes="**/*"/>
       <fileset dir="${bin.dir}"/>
     </delete>
@@ -159,7 +149,7 @@
 
   <!-- rename files containing OS-dependant code -->
   <target name="osdep">
-    <exec executable="${env.JRE_HOME}/bin/java">
+    <exec executable="${env.JRE_HOME}/bin/java" failonerror="true">
       <arg value="-jar"/>
       <arg value="../Osdep/osdep.jar"/>
       <arg value="${src.home}"/>
@@ -175,7 +165,7 @@
           description="Compile Java sources to ${work.home}">
     <kotlinc src="${src.home}" output="${work.jar}"
              classpathref="compile.classpath">
-      <compilerarg line="-jvm-target 1.8"/>
+      <compilerarg line="-jvm-target ${jvm.version}"/>
     </kotlinc>
   </target>
 
@@ -196,7 +186,73 @@
   <!-- the packaging logic here is cribbed from what jEdit does -->
 
   <target name="macapp" depends="jar" description="Create MacOS app bundle.">
-    <!-- not finished -->
+    <fail message="Macintosh packages can only be built on a Mac.">
+      <condition>
+        <not><os family="mac"/></not>
+      </condition>
+    </fail>
+    <sequential>
+      <property name="mac.disk.image.filename"
+                value="${lc.app.name}_${app.version}.dmg"/>
+      <property name="app.bundle" value="${dist.home}/${app.name}.app"/>
+      <mkdir dir="${app.bundle}/Contents"/>
+      <copy todir="${app.bundle}/Contents" encoding="UTF-8" overwrite="true">
+        <fileset file="${pf.home}/osx/Info.plist"/>
+        <!-- XXX will break if any tokens contain <, >, or & -->
+        <filterset>
+          <filter token="app.domain" value="${app.domain}"/>
+          <filter token="app.entry" value="${app.entry}"/>
+          <filter token="app.name" value="${app.name}"/>
+          <filter token="app.version" value="${app.version}"/>
+          <filter token="jar.filename" value="${lc.app.name}.jar"/>
+          <filter token="jvm.version" value="${jvm.version}"/>
+          <filter token="lc.app.name" value="${lc.app.name}"/>
+        </filterset>
+      </copy>
+      <mkdir dir="${app.bundle}/Contents/MacOS"/>
+      <copy todir="${app.bundle}/Contents/MacOS" encoding="UTF-8"
+            overwrite="true">
+        <fileset file="${pf.home}/osx/JavaApplicationStub"/>
+        <filterset>
+          <filter token="app.domain" value="${app.domain}"/>
+          <filter token="app.name" value="${app.name}"/>
+        </filterset>
+      </copy>
+      <chmod file="${app.bundle}/Contents/MacOS/JavaApplicationStub"
+             perm="755"/>
+      <mkdir dir="${app.bundle}/Contents/Resources"/>
+      <copy file="${basedir}/${app.name}.icns"
+            todir="${app.bundle}/Contents/Resources"/>
+      <mkdir dir="${app.bundle}/Contents/Java"/>
+      <copy file="${jar.name}" todir="${app.bundle}/Contents/Java"/>
+      <echo file="${app.bundle}/Contents/PkgInfo" message="APPL????"/>
+      <exec executable="hdiutil" failonerror="true">
+        <arg value="create"/>
+        <arg value="-volname"/>
+        <arg value="${app.name}"/>
+        <arg value="-srcfolder"/>
+        <arg file="${app.bundle}"/>
+        <arg file="${dist.home}/orig-${mac.disk.image.filename}"/>
+      </exec>
+      <exec executable="hdiutil" failonerror="true">
+        <arg value="convert"/>
+        <arg file="${dist.home}/orig-${mac.disk.image.filename}"/>
+        <arg value="-format"/>
+        <arg value="UDRW"/>
+        <arg value="-o"/>
+        <arg file="${dist.home}/udrw-${mac.disk.image.filename}"/>
+      </exec>
+      <exec executable="hdiutil" failonerror="true">
+        <arg value="convert"/>
+        <arg file="${dist.home}/udrw-${mac.disk.image.filename}"/>
+        <arg value="-format"/>
+        <arg value="UDZO"/>
+        <arg value="-imagekey"/>
+        <arg value="zlib-level=9"/>
+        <arg value="-o"/>
+        <arg file="${dist.home}/${mac.disk.image.filename}"/>
+      </exec>
+    </sequential>
   </target>
 
   <target name="winapp" depends="jar" description="Create app bundle.">
@@ -204,6 +260,11 @@
   </target>
 
   <target name="deb" depends="jar" description="Create Debian package.">
+    <fail message="Linux packages can only be built on Linux.">
+      <condition>
+        <not><os family="unix"/></not>
+      </condition>
+    </fail>
     <sequential>
       <mkdir dir="${dist.home}/data/usr/share/applications"/>
       <copy file="${pf.home}/linux/deb/jpegwasher.desktop"
@@ -246,7 +307,7 @@
       <chmod perm="755">
         <filelist dir="${dist.home}/control" files="postinst,postrm"/>
       </chmod>
-      <exec executable="${basedir}/make-debian-package">
+      <exec executable="${basedir}/make-debian-package" failonerror="true">
         <arg value="${dist.home}"/>
         <arg value="${lc.app.name}_${app.version}.deb"/>
       </exec>