Fixed chmod issue when building on Win32. I completely redid how the distros get packaged.
Instead of building a staging directory which then gets packaged, the packaging all happens
"in place". Then the staging directory is expanded out from the final distro, but only for the
platform you're currently running on. This actually builds faster. The only downside I know
of is that I can't share much code between the linux, mac, and windows distro build files.
Maybe there's a more elegant solution to this.
I also redid how the samples are built, to make it easier to package up the final distros.
While I was in there I made sample building a lot smarter about not doing rebuilds, thanks to
some of the sweet stuff in ant-contrib.
Finally, fixed ApplicationCreator to merely warn if chmod fails.
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@188 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/distro-source/common.ant.xml b/distro-source/common.ant.xml
index 082fde8..9daa178 100755
--- a/distro-source/common.ant.xml
+++ b/distro-source/common.ant.xml
@@ -7,82 +7,26 @@
<property name="project.staging" location="${gwt.build.staging}/${project.distname}" />
<patternset id="chmod.executables">
- <include name="*Creator*" />
- <include name="samples/*/*-shell" />
- <include name="samples/*/*-compile" />
+ <include name="*Creator" />
</patternset>
<patternset id="chmod.not.executables">
- <exclude name="*Creator*" />
- <exclude name="samples/*/*-shell*" />
- <exclude name="samples/*/*-compile*" />
+ <exclude name="*Creator" />
</patternset>
- <!-- copies a single sample into the staging directory -->
- <macrodef name="stage.sample">
- <attribute name="lname" />
- <attribute name="uname" />
- <sequential>
- <mkdir dir="${project.staging}/samples/@{uname}" />
- <copy todir="${project.staging}/samples/@{uname}">
- <fileset dir="${gwt.root}/samples/@{lname}">
- <include name="src/**" />
- </fileset>
- <fileset dir="${gwt.build.out}/samples/@{lname}">
- <include name="bin/**" />
- <include name="www/**" />
- </fileset>
- <fileset dir="${gwt.build.out}/samples/@{lname}/scripts/${dist.platform}">
- <include name="*" />
- </fileset>
- </copy>
- </sequential>
- </macrodef>
-
- <target name="stage" description="Copies items into the staging area">
- <mkdir dir="${project.staging}" />
-
- <copy todir="${project.staging}">
- <fileset file="${gwt.build.lib}/gwt-dev-${dist.platform}.jar" />
- <fileset file="${gwt.build.lib}/gwt-user.jar" />
- <fileset file="${gwt.build.lib}/gwt-servlet.jar" />
- <fileset dir="${gwt.build.jni}/${dist.platform}" />
- <fileset dir="src" />
- </copy>
-
- <mkdir dir="${project.staging}/doc" />
- <copy todir="${project.staging}/doc">
- <fileset dir="${gwt.build.out}/doc">
- <include name="html/**" />
- <include name="css/**" />
- <include name="javadoc/**" />
- </fileset>
- </copy>
-
- <copy todir="${project.staging}">
+ <target name="filter" description="Filters distro files for versioning">
+ <!-- These files must be filtered for versioning -->
+ <mkdir dir="${project.build}" />
+ <copy todir="${project.build}">
<fileset dir="../core/src" />
<filterset>
<filter token="GWT_VERSION" value="${gwt.version}" />
</filterset>
</copy>
-
- <stage.sample lname="dynatable" uname="DynaTable" />
- <stage.sample lname="hello" uname="Hello" />
- <stage.sample lname="i18n" uname="I18N" />
- <stage.sample lname="json" uname="JSON" />
- <stage.sample lname="kitchensink" uname="KitchenSink" />
- <stage.sample lname="mail" uname="Mail" />
- <stage.sample lname="simplexml" uname="SimpleXML" />
-
- <antcall target="stage.platform" />
- <chmod perm="755">
- <fileset dir="${project.staging}">
- <patternset refid="chmod.executables" />
- </fileset>
- </chmod>
</target>
<target name="clean" description="Cleans this project's intermediate and output files">
+ <delete dir="${project.build}" failonerror="false" />
<delete dir="${project.staging}" failonerror="false" />
<delete file="${project.dist}" failonerror="false" />
</target>
diff --git a/distro-source/linux/build.xml b/distro-source/linux/build.xml
index 27e4773..ac158c4 100755
--- a/distro-source/linux/build.xml
+++ b/distro-source/linux/build.xml
@@ -3,29 +3,74 @@
<import file="../common.ant.xml" />
<property name="project.dist" location="${gwt.build.dist}/${project.distname}.tar.gz" />
- <target name="stage.platform" description="Copies platform-specific items into the staging area">
- <untar src="${gwt.tools.redist}/mozilla/mozilla-1.7.12.tar.gz" dest="${project.staging}" compression="gzip" />
- <copy todir="${project.staging}">
- <fileset dir="${gwt.tools.lib}/eclipse">
- <include name="libswt-*gtk-3235.so" />
- </fileset>
- </copy>
- </target>
-
- <target name="build" depends="stage" description="Packages the distro staging area">
+ <target name="build" depends="filter" description="Packages the distro">
+ <!-- TODO: figure out how to share most of this across platforms -->
<mkdir dir="${gwt.build.dist}" />
<gwt.tgz.cat destfile="${project.dist}">
- <tarfileset dir="${gwt.build.staging}/${project.distname}" prefix="${project.distname}">
- <!-- Mozilla pulled in through includetar -->
- <exclude name="mozilla-1.7.12/**" />
- <patternset refid="chmod.not.executables" />
+ <!-- jars -->
+ <tarfileset file="${gwt.build.lib}/gwt-dev-${dist.platform}.jar" prefix="${project.distname}" />
+ <tarfileset file="${gwt.build.lib}/gwt-user.jar" prefix="${project.distname}" />
+ <tarfileset file="${gwt.build.lib}/gwt-servlet.jar" prefix="${project.distname}" />
+
+ <!-- jni libs-->
+ <tarfileset dir="${gwt.build.jni}/${dist.platform}" prefix="${project.distname}" />
+ <tarfileset dir="${gwt.tools.lib}/eclipse" prefix="${project.distname}">
+ <include name="libswt-*gtk-3235.so" />
</tarfileset>
- <tarfileset dir="${gwt.build.staging}/${project.distname}" prefix="${project.distname}" mode="755">
- <!-- Mozilla pulled in through includetar -->
- <exclude name="mozilla-1.7.12/**" />
+
+ <!-- raw files -->
+ <tarfileset dir="${project.build}" prefix="${project.distname}" mode="755">
<patternset refid="chmod.executables" />
</tarfileset>
+ <tarfileset dir="${project.build}" prefix="${project.distname}">
+ <patternset refid="chmod.not.executables" />
+ </tarfileset>
+ <tarfileset dir="src" prefix="${project.distname}" mode="755">
+ <patternset refid="chmod.executables" />
+ </tarfileset>
+ <tarfileset dir="src" prefix="${project.distname}">
+ <patternset refid="chmod.not.executables" />
+ </tarfileset>
+
+ <!-- doc -->
+ <tarfileset dir="${gwt.build.out}" prefix="${project.distname}">
+ <include name="doc" />
+ <include name="doc/html/**" />
+ <include name="doc/css/**" />
+ <include name="doc/javadoc/**" />
+ </tarfileset>
+
+ <!-- samples -->
+ <tarfileset dir="${gwt.build.out}" prefix="${project.distname}">
+ <include name="samples" />
+ <include name="samples/*" />
+ <include name="samples/*/src/**" />
+ <include name="samples/*/bin/**" />
+ <include name="samples/*/www/**" />
+ </tarfileset>
+ <tarfileset dir="${gwt.build.out}/samples-scripts/${dist.platform}" mode="755" prefix="${project.distname}/samples">
+ <include name="*/*-compile" />
+ <include name="*/*-shell" />
+ </tarfileset>
+
<includetar src="${gwt.tools.redist}/mozilla/mozilla-1.7.12.tar.gz" compression="gzip" prefix="${project.distname}" />
</gwt.tgz.cat>
+
+ <if>
+ <isset property="build.host.islinux" />
+ <then>
+ <!--
+ Untar distro into the staging directory. Must use GNU tar
+ to handle permissions and symlinks correctly.
+ -->
+ <mkdir dir="${gwt.build.staging}" />
+ <exec executable="tar">
+ <arg value="-xpzf" />
+ <arg file="${project.dist}" />
+ <arg value="-C" />
+ <arg file="${gwt.build.staging}" />
+ </exec>
+ </then>
+ </if>
</target>
</project>
diff --git a/distro-source/mac/build.xml b/distro-source/mac/build.xml
index cb4e146..96c5217 100755
--- a/distro-source/mac/build.xml
+++ b/distro-source/mac/build.xml
@@ -3,40 +3,76 @@
<import file="../common.ant.xml" />
<property name="project.dist" location="${gwt.build.dist}/${project.distname}.tar.gz" />
- <target name="stage.platform" description="Copies platform-specific items into the staging area">
- <!--
- Try to untar WebKit into the staging directory. GNU tar handles
- permissions and symlinks correctly. It's okay if we fail here.
- -->
- <exec executable="tar" failifexecutionfails="false" failonerror="false">
- <arg value="-xpzf" />
- <arg file="${gwt.tools.redist}/webkit/WebKit-418.9.tar.gz" />
- <arg value="-C" />
- <arg file="${project.staging}" />
- </exec>
- <copy todir="${project.staging}">
- <fileset dir="${gwt.tools.lib}/eclipse">
+ <target name="build" depends="filter" description="Packages the distro">
+ <!-- TODO: figure out how to share most of this across platforms -->
+ <mkdir dir="${gwt.build.dist}" />
+ <gwt.tgz.cat destfile="${project.dist}">
+ <!-- jars -->
+ <tarfileset file="${gwt.build.lib}/gwt-dev-${dist.platform}.jar" prefix="${project.distname}" />
+ <tarfileset file="${gwt.build.lib}/gwt-user.jar" prefix="${project.distname}" />
+ <tarfileset file="${gwt.build.lib}/gwt-servlet.jar" prefix="${project.distname}" />
+
+ <!-- jni libs-->
+ <tarfileset dir="${gwt.build.jni}/${dist.platform}" prefix="${project.distname}" />
+ <tarfileset dir="${gwt.tools.lib}/eclipse" prefix="${project.distname}">
<include name="libswt-*carbon-3235.jnilib" />
<!-- User our modified version instead of this stock version -->
<exclude name="libswt-webkit-carbon-3235.jnilib" />
- </fileset>
- </copy>
- </target>
-
- <target name="build" depends="stage" description="Packages the distro staging area">
- <mkdir dir="${gwt.build.dist}" />
- <gwt.tgz.cat destfile="${project.dist}">
- <tarfileset dir="${gwt.build.staging}/${project.distname}" prefix="${project.distname}">
- <!-- Frameworks pulled in through includetar -->
- <exclude name="Frameworks/**" />
- <patternset refid="chmod.not.executables" />
</tarfileset>
- <tarfileset dir="${gwt.build.staging}/${project.distname}" prefix="${project.distname}" mode="755">
- <!-- Frameworks pulled in through includetar -->
- <exclude name="Frameworks/**" />
+
+ <!-- raw files -->
+ <tarfileset dir="${project.build}" prefix="${project.distname}" mode="755">
<patternset refid="chmod.executables" />
</tarfileset>
+ <tarfileset dir="${project.build}" prefix="${project.distname}">
+ <patternset refid="chmod.not.executables" />
+ </tarfileset>
+ <tarfileset dir="src" prefix="${project.distname}" mode="755">
+ <patternset refid="chmod.executables" />
+ </tarfileset>
+ <tarfileset dir="src" prefix="${project.distname}">
+ <patternset refid="chmod.not.executables" />
+ </tarfileset>
+
+ <!-- doc -->
+ <tarfileset dir="${gwt.build.out}" prefix="${project.distname}">
+ <include name="doc" />
+ <include name="doc/html/**" />
+ <include name="doc/css/**" />
+ <include name="doc/javadoc/**" />
+ </tarfileset>
+
+ <!-- samples -->
+ <tarfileset dir="${gwt.build.out}" prefix="${project.distname}">
+ <include name="samples" />
+ <include name="samples/*" />
+ <include name="samples/*/src/**" />
+ <include name="samples/*/bin/**" />
+ <include name="samples/*/www/**" />
+ </tarfileset>
+ <tarfileset dir="${gwt.build.out}/samples-scripts/${dist.platform}" mode="755" prefix="${project.distname}/samples">
+ <include name="*/*-compile" />
+ <include name="*/*-shell" />
+ </tarfileset>
+
<includetar src="${gwt.tools.redist}/webkit/WebKit-418.9.tar.gz" compression="gzip" prefix="${project.distname}" />
</gwt.tgz.cat>
+
+ <if>
+ <isset property="build.host.ismac" />
+ <then>
+ <!--
+ Untar distro into the staging directory. Must use GNU tar
+ to handle permissions and symlinks correctly.
+ -->
+ <mkdir dir="${gwt.build.staging}" />
+ <exec executable="tar">
+ <arg value="-xpzf" />
+ <arg file="${project.dist}" />
+ <arg value="-C" />
+ <arg file="${gwt.build.staging}" />
+ </exec>
+ </then>
+ </if>
</target>
</project>
diff --git a/distro-source/windows/build.xml b/distro-source/windows/build.xml
index 5bc73f7..9939c4c 100755
--- a/distro-source/windows/build.xml
+++ b/distro-source/windows/build.xml
@@ -3,18 +3,53 @@
<import file="../common.ant.xml" />
<property name="project.dist" location="${gwt.build.dist}/${project.distname}.zip" />
- <target name="stage.platform" description="Copies platform-specific items into the staging area">
- <copy todir="${project.staging}">
- <fileset dir="${gwt.tools.lib}/eclipse">
- <include name="swt-*win32-3235.dll" />
- </fileset>
- </copy>
- </target>
-
- <target name="build" depends="stage" description="Packages the distro staging area">
+ <target name="build" depends="filter" description="Packages the distro">
+ <!-- TODO: figure out how to share most of this across platforms -->
<mkdir dir="${gwt.build.dist}" />
<zip destfile="${project.dist}">
- <zipfileset dir="${gwt.build.staging}/${project.distname}" prefix="${project.distname}" />
+ <!-- jars -->
+ <zipfileset file="${gwt.build.lib}/gwt-dev-${dist.platform}.jar" prefix="${project.distname}" />
+ <zipfileset file="${gwt.build.lib}/gwt-user.jar" prefix="${project.distname}" />
+ <zipfileset file="${gwt.build.lib}/gwt-servlet.jar" prefix="${project.distname}" />
+
+ <!-- jni libs-->
+ <zipfileset dir="${gwt.build.jni}/${dist.platform}" prefix="${project.distname}" />
+ <zipfileset dir="${gwt.tools.lib}/eclipse" prefix="${project.distname}">
+ <include name="swt-*win32-3235.dll" />
+ </zipfileset>
+
+ <!-- raw files -->
+ <zipfileset dir="${project.build}" prefix="${project.distname}" />
+ <zipfileset dir="src" prefix="${project.distname}" />
+
+ <!-- doc -->
+ <zipfileset dir="${gwt.build.out}" prefix="${project.distname}">
+ <include name="doc" />
+ <include name="doc/html/**" />
+ <include name="doc/css/**" />
+ <include name="doc/javadoc/**" />
+ </zipfileset>
+
+ <!-- samples -->
+ <zipfileset dir="${gwt.build.out}" prefix="${project.distname}">
+ <include name="samples" />
+ <include name="samples/*" />
+ <include name="samples/*/src/**" />
+ <include name="samples/*/bin/**" />
+ <include name="samples/*/www/**" />
+ </zipfileset>
+ <zipfileset dir="${gwt.build.out}/samples-scripts/${dist.platform}" prefix="${project.distname}/samples">
+ <include name="*/*-compile.cmd" />
+ <include name="*/*-shell.cmd" />
+ </zipfileset>
</zip>
+
+ <if>
+ <isset property="build.host.iswindows" />
+ <then>
+ <mkdir dir="${gwt.build.staging}" />
+ <unzip src="${project.dist}" dest="${gwt.build.staging}" />
+ </then>
+ </if>
</target>
</project>
diff --git a/samples/build.xml b/samples/build.xml
index 53cf7a0..c5e87d1 100644
--- a/samples/build.xml
+++ b/samples/build.xml
@@ -53,4 +53,9 @@
<param name="target" value="test" />
</antcall>
</target>
+
+ <target name="clean" description="Cleans this project's intermediate and output files">
+ <delete dir="${project.build}" />
+ <delete dir="${gwt.build.out}/samples-scripts" />
+ </target>
</project>
diff --git a/samples/common.ant.xml b/samples/common.ant.xml
index 6f20812..d61912d 100755
--- a/samples/common.ant.xml
+++ b/samples/common.ant.xml
@@ -10,9 +10,21 @@
<!-- Platform shouldn't matter here, just picking one -->
<property.ensure name="gwt.dev.jar" location="${gwt.build.lib}/gwt-dev-linux.jar" />
+ <!-- Mirror directory for scripts; makes building distro easier -->
+ <property name="samples.scripts" value="${gwt.build.out}/samples-scripts" />
+ <!-- Use the uppercase name rather than the lowercase name -->
+ <property name="sample.build" value="${gwt.build.out}/samples/${sample.main}" />
+
+ <target name="source" description="Copy source to the output folder">
+ <mkdir dir="${sample.build}/src" />
+ <copy todir="${sample.build}/src">
+ <fileset dir="src" />
+ </copy>
+ </target>
+
<target name="compile" description="Compile all java files">
- <mkdir dir="${javac.out}" />
- <gwt.javac>
+ <mkdir dir="${sample.build}/bin" />
+ <gwt.javac destdir="${sample.build}/bin">
<classpath>
<pathelement location="${gwt.user.jar}" />
<pathelement location="${gwt.dev.jar}" />
@@ -21,48 +33,69 @@
</target>
<target name="gwtc" description="Compile to JavaScript">
- <mkdir dir="${project.build}/www" />
- <java dir="${project.build}" classname="com.google.gwt.dev.GWTCompiler" classpath="src:${gwt.user.jar}:${gwt.dev.jar}" fork="yes" failonerror="true">
- <classpath>
- <pathelement location="${src}" />
- <pathelement location="${gwt.user.jar}" />
- <pathelement location="${gwt.dev.jar}" />
- </classpath>
- <arg value="-out" />
- <arg file="${project.build}/www" />
- <arg value="com.google.gwt.sample.${sample.package}.${sample.module}" />
- </java>
+ <outofdate>
+ <sourcefiles>
+ <fileset dir="src" />
+ <fileset file="${gwt.user.jar}" />
+ <fileset file="${gwt.dev.jar}" />
+ </sourcefiles>
+ <targetfiles path="${sample.build}/www/com.google.gwt.sample.${sample.package}.${sample.module}/com.google.gwt.sample.${sample.package}.${sample.module}.nocache.html" />
+ <sequential>
+ <mkdir dir="${sample.build}/www" />
+ <java dir="${sample.build}" classname="com.google.gwt.dev.GWTCompiler" classpath="src:${gwt.user.jar}:${gwt.dev.jar}" fork="yes" failonerror="true">
+ <arg value="-out" />
+ <arg file="${sample.build}/www" />
+ <arg value="com.google.gwt.sample.${sample.package}.${sample.module}" />
+ </java>
+ </sequential>
+ </outofdate>
</target>
- <target name="antcall.script" description="Create launch scripts for a particular platform">
- <mkdir dir="${project.build}/scripts/${platform}" />
- <java classname="com.google.gwt.user.tools.ApplicationCreator" classpath="${gwt.user.jar}:${gwt.dev.jar}" failonerror="true">
- <!-- Relative path is important! Paths will be relative in final distro -->
- <sysproperty key="gwt.devjar" value="../../gwt-dev-${platform}.jar" />
- <arg value="-ignore" />
- <arg value="-out" />
- <arg file="${project.build}/scripts/${platform}" />
- <arg value="com.google.gwt.sample.${sample.package}.client.${sample.main}" />
- </java>
- </target>
+ <macrodef name="applicationCreator">
+ <attribute name="platform" />
+ <attribute name="extension" default="" />
+ <sequential>
+ <outofdate>
+ <sourcefiles />
+ <targetfiles>
+ <pathelement location="${samples.scripts}/@{platform}/${sample.main}/${sample.main}-compile@{extension}" />
+ <pathelement location="${samples.scripts}/@{platform}/${sample.main}/${sample.main}-shell@{extension}" />
+ </targetfiles>
+ <sequential>
+ <mkdir dir="${samples.scripts}/@{platform}/${sample.main}" />
+ <java classname="com.google.gwt.user.tools.ApplicationCreator" classpath="${gwt.user.jar}:${gwt.dev.jar}" failonerror="true">
+ <!-- Relative path is important! Paths will be relative in final distro -->
+ <sysproperty key="gwt.devjar" value="../../gwt-dev-@{platform}.jar" />
+ <arg value="-ignore" />
+ <arg value="-out" />
+ <arg file="${samples.scripts}/@{platform}/${sample.main}" />
+ <arg value="com.google.gwt.sample.${sample.package}.client.${sample.main}" />
+ </java>
+ </sequential>
+ </outofdate>
+ </sequential>
+ </macrodef>
<target name="scripts" description="Create launch scripts">
- <antcall target="antcall.script">
- <param name="platform" value="linux" />
- </antcall>
- <antcall target="antcall.script">
- <param name="platform" value="windows" />
- </antcall>
- <antcall target="antcall.script">
- <param name="platform" value="mac" />
- </antcall>
+ <applicationCreator platform="linux" />
+ <applicationCreator platform="windows" extension=".cmd" />
+ <applicationCreator platform="mac" />
</target>
- <target name="build" depends="compile, gwtc, scripts" description="Build and package this project" />
+ <target name="build" depends="source, compile, gwtc, scripts" description="Build and package this project" />
<target name="checkstyle" description="Static analysis of source">
<gwt.checkstyle>
- <fileset dir="src"/>
- </gwt.checkstyle>
+ <fileset dir="src" />
+ </gwt.checkstyle>
+ </target>
+
+ <target name="clean" description="Cleans this project's intermediate and output files">
+ <delete dir="${sample.build}" />
+ <delete includeemptydirs="true">
+ <fileset dir="${samples.scripts}">
+ <include name="*/${sample.main}/**" />
+ </fileset>
+ </delete>
</target>
</project>
diff --git a/user/src/com/google/gwt/user/tools/ApplicationCreator.java b/user/src/com/google/gwt/user/tools/ApplicationCreator.java
index 1b5dbdb..d3385af 100644
--- a/user/src/com/google/gwt/user/tools/ApplicationCreator.java
+++ b/user/src/com/google/gwt/user/tools/ApplicationCreator.java
@@ -241,7 +241,7 @@
+ extension + "src");
Utility.writeTemplateFile(gwtshell, out, replacements);
if (extension.length() == 0) {
- Runtime.getRuntime().exec("chmod u+x " + gwtshell.getAbsolutePath());
+ chmodExecutable(gwtshell);
}
}
@@ -252,15 +252,28 @@
+ extension + "src");
Utility.writeTemplateFile(gwtcompile, out, replacements);
if (extension.length() == 0) {
- Runtime.getRuntime().exec("chmod u+x " + gwtcompile.getAbsolutePath());
+ chmodExecutable(gwtcompile);
}
}
}
+ /**
+ * Try to make the given file executable. Implementation tries to exec chmod,
+ * which may fail if the platform doesn't support it. Prints a warning to
+ * stderr if the call fails.
+ *
+ * @param file the file to make executable
+ */
+ private static void chmodExecutable(File file) {
+ try {
+ Runtime.getRuntime().exec("chmod u+x " + file.getAbsolutePath());
+ } catch (Throwable e) {
+ System.err.println(("Warning: cannot exec chmod to set permission on generated file."));
+ }
+ }
+
private String eclipse = null;
-
private String fullClassName = null;
-
private boolean ignore = false;
private File outDir;
private boolean overwrite = false;