diff options
-rw-r--r-- | lib/ant/ant-contrib.jar.desired.sha1 | 1 | ||||
-rw-r--r-- | lib/ant/vizant.jar.desired.sha1 | 1 | ||||
-rw-r--r-- | lib/sabbus.jar.desired.sha1 | 2 | ||||
-rw-r--r-- | sabbus.xml | 756 | ||||
-rw-r--r-- | src/compiler/scala/tools/ant/ScalaTool.scala | 243 | ||||
-rw-r--r-- | src/compiler/scala/tools/ant/templates/tool-unix.tmpl | 31 | ||||
-rw-r--r-- | src/compiler/scala/tools/ant/templates/tool-windows.tmpl | 28 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/Settings.scala | 2 |
8 files changed, 578 insertions, 486 deletions
diff --git a/lib/ant/ant-contrib.jar.desired.sha1 b/lib/ant/ant-contrib.jar.desired.sha1 new file mode 100644 index 0000000000..56745657c5 --- /dev/null +++ b/lib/ant/ant-contrib.jar.desired.sha1 @@ -0,0 +1 @@ +943cd5c8802b2a3a64a010efb86ec19bac142e40 ?ant-contrib.jar diff --git a/lib/ant/vizant.jar.desired.sha1 b/lib/ant/vizant.jar.desired.sha1 new file mode 100644 index 0000000000..00ff17d159 --- /dev/null +++ b/lib/ant/vizant.jar.desired.sha1 @@ -0,0 +1 @@ +2c61d6e9a912b3253194d5d6d3e1db7e2545ac4b ?vizant.jar diff --git a/lib/sabbus.jar.desired.sha1 b/lib/sabbus.jar.desired.sha1 index 12474b24ec..a5e24c2cdc 100644 --- a/lib/sabbus.jar.desired.sha1 +++ b/lib/sabbus.jar.desired.sha1 @@ -1 +1 @@ -a855651b0b649f061b8e35504091d75ff9a83b65 ?sabbus.jar +e82686ff2820b9db1813ee5d00fe657d31d91c52 ?sabbus.jar diff --git a/sabbus.xml b/sabbus.xml index 344b5453e7..e89da3ddd7 100644 --- a/sabbus.xml +++ b/sabbus.xml @@ -3,24 +3,29 @@ <project name="sabbus" default="build"> <description> - I am SuperSabbus for Scala core, the fast but simple version of Sabbus. + SuperSabbus for Scala core, builds the scala library and compiler. It can also package it as a simple distribution, + tests it for stable bootstrapping and against the Scala test suite. Use PackSabbus to package it for different install + management tools such as Sbaz. </description> <!-- =========================================================================== END-USER TARGETS ============================================================================ --> - <target name="build" depends="pack.load" - description="Builds the Scala compiler and library. Executables are in 'build/quick/bin'."/> + <target name="build" depends="pack.done" + description="Builds the Scala compiler and library. Executables are in 'build/pack/bin'."/> <target name="clean" depends="quick.clean" description="Removes binaries of compiler and library. Distributions are untouched."/> - <target name="test" depends="suite.test, stability.test" + <target name="test" depends="test.done" description="Runs test suite and bootstrapping test on Scala compiler and library."/> - <target name="docs" depends="" - description="Builds documentation for Scala library. Scaladoc is in 'build/scaladoc'."/> + <target name="docs" depends="docs.done" + description="Builds documentation for the Scala library. Scaladoc is in 'build/scaladoc/library'."/> + + <target name="docscomp" depends="docs.comp" + description="Builds documentation for the Scala compiler and library. Scaladoc is in 'build/scaladoc'."/> <target name="docsclean" depends="docs.clean" description="Removes generated documentation. Distributions are untouched."/> @@ -29,28 +34,26 @@ END-USER TARGETS description="Makes a new distribution and tests it. Will remove existing binaries and documentation."> <antcall target="locker.clean"/> <antcall target="docs.clean"/> - <antcall target="dist.load"> - <param name="dist.expected" value="yes"/> - </antcall> + <antcall target="all.done"/> </target> - <target name="distclean" depends="dists.clean" + <target name="distclean" depends="dist.clean" description="Removes all distributions. Binaries and documentation are untouched."/> <target name="newstarr" description="Replaces the Starr compiler and library by one built from current sources and tests it."> <antcall target="locker.clean"/> - <antcall target="starr.build"/> + <antcall target="starr.done"/> <antcall target="locker.clean"/> - <antcall target="test"/> + <antcall target="test.done"/> </target> <target name="newlocker" description="Replaces the Locker compiler and library by one built from current sources."> <antcall target="locker.clean"/> - <antcall target="locker.build"/> + <antcall target="locker.done"/> </target> - + <!-- =========================================================================== PROPERTIES ============================================================================ --> @@ -63,6 +66,7 @@ PROPERTIES <!-- Defines the repository layout --> <property name="docs.dir" value="${basedir}/docs"/> <property name="lib.dir" value="${basedir}/lib"/> + <property name="lib-ant.dir" value="${lib.dir}/ant"/> <property name="src.dir" value="${basedir}/src"/> <property name="test.dir" value="${basedir}/test"/> @@ -83,8 +87,8 @@ PROPERTIES <property name="build.dir" value="${basedir}/build"/> <property name="build-locker.dir" value="${build.dir}/locker"/> <property name="build-quick.dir" value="${build.dir}/quick"/> + <property name="build-pack.dir" value="${build.dir}/pack"/> <property name="build-strap.dir" value="${build.dir}/strap"/> - <property name="build-partest.dir" value="${build.dir}/partest"/> <property name="build-docs.dir" value="${build.dir}/scaladoc"/> <property name="dists.dir" value="${basedir}/dists"/> @@ -127,13 +131,7 @@ INITIALISATION <!-- And print-out what we are building --> <echo level="info" message="Build number is '${version.number}'"/> <echo level="info" message="Built ${time.human} from revision ${svn.number} with Java ${java.vm.version}"/> - </target> - -<!-- =========================================================================== -LOAD STABLE REFERENCE (STARR) LAYER -============================================================================ --> - - <target name="starr.load" depends="init"> + <!-- Define tasks that can be run with Starr --> <path id="starr.classpath"> <pathelement location="${lib.starr.jar}"/> <pathelement location="${comp.starr.jar}"/> @@ -145,18 +143,23 @@ LOAD STABLE REFERENCE (STARR) LAYER </target> <!-- =========================================================================== -BUILD LOCAL REFERENCE (LOCKER) LAYER +LOCAL REFERENCE BUILD (LOCKER) ============================================================================ --> - - <target name="locker.init" depends="starr.load"> + + <target name="locker.start" depends="init"> <condition property="locker.available"> - <available file="${build-locker.dir}/build.complete"/> + <available file="${build-locker.dir}/all.complete"/> + </condition> + </target> + + <target name="locker.pre-lib" depends="locker.start" unless="locker.available"> + <condition property="locker.lib.needed"> + <not><available file="${build-locker.dir}/library.complete"/></not> </condition> </target> - <target name="locker.build" depends="locker.init" unless="locker.available"> - <stopwatch name="locker.timer"/> - <!-- Build library --> + <target name="locker.lib" depends="locker.pre-lib" if="locker.lib.needed"> + <stopwatch name="locker.lib.timer"/> <mkdir dir="${build-locker.dir}/classes/library"/> <javac srcdir="${src.dir}/library" @@ -193,7 +196,18 @@ BUILD LOCAL REFERENCE (LOCKER) LAYER </fileset> </copy> <sabbreak id="starr.lib.scalac"/> - <!-- Build compiler --> + <touch file="${build-locker.dir}/library.complete" verbose="no"/> + <stopwatch name="locker.lib.timer" action="total"/> + </target> + + <target name="locker.pre-comp" depends="locker.lib" unless="locker.available"> + <condition property="locker.comp.needed"> + <not><available file="${build-locker.dir}/compiler.complete"/></not> + </condition> + </target> + + <target name="locker.comp" depends="locker.pre-comp" if="locker.comp.needed"> + <stopwatch name="locker.comp.timer"/> <mkdir dir="${build-locker.dir}/classes/compiler"/> <sabmake id="starr.comp.scalac" destdir="${build-locker.dir}/classes/compiler" @@ -224,12 +238,12 @@ BUILD LOCAL REFERENCE (LOCKER) LAYER </fileset> </copy> <sabbreak id="starr.comp.scalac"/> - <!-- Timing the build --> - <touch file="${build-locker.dir}/build.complete" verbose="no"/> - <stopwatch name="locker.timer" action="total"/> + <touch file="${build-locker.dir}/compiler.complete" verbose="no"/> + <stopwatch name="locker.comp.timer" action="total"/> </target> - <target name="locker.load" depends="locker.build"> + <target name="locker.done" depends="locker.comp"> + <touch file="${build-locker.dir}/all.complete" verbose="no"/> <path id="locker.classpath"> <pathelement location="${build-locker.dir}/classes/library"/> <pathelement location="${build-locker.dir}/classes/compiler"/> @@ -237,25 +251,29 @@ BUILD LOCAL REFERENCE (LOCKER) LAYER <pathelement location="${ant.jar}"/> </path> </target> + + <target name="locker.clean" depends="quick.clean"> + <delete dir="${build-locker.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/> + </target> <!-- =========================================================================== -BUILD QUICK LAYER +QUICK BUILD (QUICK) ============================================================================ --> - <target name="quick.init" depends="locker.load"> - <uptodate property="quick.available" targetfile="${build-quick.dir}/build.complete"> + <target name="quick.start" depends="locker.done"/> + + <target name="quick.pre-lib" depends="quick.start"> + <uptodate property="quick.lib.available" targetfile="${build-quick.dir}/library.complete"> <srcfiles dir="${src.dir}"> <include name="library/**"/> - <include name="compiler/**"/> <include name="dbc/**"/> <include name="actors/**"/> </srcfiles> </uptodate> </target> - <target name="quick.build" depends="quick.init" unless="quick.available"> - <stopwatch name="quick.timer"/> - <!-- Build library --> + <target name="quick.lib" depends="quick.pre-lib" unless="quick.lib.available"> + <stopwatch name="quick.lib.timer"/> <mkdir dir="${build-quick.dir}/classes/library"/> <javac srcdir="${src.dir}/library" @@ -278,6 +296,17 @@ BUILD QUICK LAYER <sabuse id="locker.lib.scalac" srcdir="${src.dir}/library"> <include name="scala/Predef.scala"/> </sabuse> + <!-- --> + <sabbreak id="locker.lib.scalac"/> + <sabmake id="locker.lib.scalac" + destdir="${build-quick.dir}/classes/library" + compilerpathref="locker.classpath" + srcpath="${src.dir}/library"> + <compilationpath> + <pathelement location="${build-quick.dir}/classes/library"/> + </compilationpath> + </sabmake> + <!-- --> <sabuse id="locker.lib.scalac" srcdir="${src.dir}/library"> <include name="**/*.scala"/> <exclude name="scala/Predef.scala"/> @@ -301,7 +330,18 @@ BUILD QUICK LAYER </fileset> </copy> <sabbreak id="locker.lib.scalac"/> - <!-- Build compiler --> + <touch file="${build-quick.dir}/library.complete" verbose="no"/> + <stopwatch name="quick.lib.timer" action="total"/> + </target> + + <target name="quick.pre-comp" depends="quick.lib"> + <uptodate property="quick.comp.available" targetfile="${build-quick.dir}/compiler.complete"> + <srcfiles dir="${src.dir}/compiler"/> + </uptodate> + </target> + + <target name="quick.comp" depends="quick.pre-comp" unless="quick.comp.available"> + <stopwatch name="quick.comp.timer"/> <mkdir dir="${build-quick.dir}/classes/compiler"/> <sabmake id="locker.comp.scalac" destdir="${build-quick.dir}/classes/compiler" @@ -332,39 +372,234 @@ BUILD QUICK LAYER </fileset> </copy> <sabbreak id="locker.comp.scalac"/> - <!-- Timing the build --> - <touch file="${build-quick.dir}/build.complete" verbose="no"/> - <stopwatch name="quick.timer" action="total"/> + <touch file="${build-quick.dir}/compiler.complete" verbose="no"/> + <stopwatch name="quick.comp.timer" action="total"/> </target> - <target name="quick.load" depends="quick.build"> - <path id="quick.classpath"> - <pathelement location="${build-quick.dir}/classes/library"/> - <pathelement location="${build-quick.dir}/classes/compiler"/> + <target name="quick.pre-partest" depends="quick.comp"> + <uptodate property="quick.partest.available" targetfile="${build-quick.dir}/partest.complete"> + <srcfiles dir="${src.dir}/partest"/> + </uptodate> + </target> + + <target name="quick.partest" depends="quick.pre-partest" unless="quick.partest.available"> + <stopwatch name="quick.partest.timer"/> + <mkdir dir="${build-quick.dir}/classes/partest"/> + <javac + srcdir="${src.dir}/partest" + destdir="${build-quick.dir}/classes/partest"> + <classpath> + <pathelement location="${build-quick.dir}/classes/library"/> + <pathelement location="${build-quick.dir}/classes/compiler"/> + <pathelement location="${build-quick.dir}/classes/partest"/> + </classpath> + <include name="**/*.java"/> + </javac> + <sabmake id="locker.partest.scalac" + destdir="${build-quick.dir}/classes/partest" + compilerpathref="locker.classpath" + srcpath="${src.dir}/paartest"> + <compilationpath> + <pathelement location="${build-quick.dir}/classes/library"/> + <pathelement location="${build-quick.dir}/classes/compiler"/> + <pathelement location="${build-quick.dir}/classes/partest"/> + <pathelement location="${ant.jar}"/> + </compilationpath> + </sabmake> + <sabuse id="locker.partest.scalac" srcdir="${src.dir}/partest"> + <include name="**/*.scala"/> + </sabuse> + <copy todir="${build-quick.dir}/classes/partest"> + <fileset dir="${src.dir}/partest"> + <include name="**/*.xml"/> + </fileset> + </copy> + <sabbreak id="locker.partest.scalac"/> + <touch file="${build-quick.dir}/partest.complete" verbose="no"/> + <stopwatch name="quick.partest.timer" action="total"/> + </target> + + <target name="quick.pre-bin" depends="quick.partest"> + <condition property="quick.bin.available"> + <isset property="quick.comp.available"/> + </condition> + <path id="quick.bin.classpath"> + <pathelement location="${build-quick.dir}/classes/library"/> + <pathelement location="${build-quick.dir}/classes/compiler"/> <pathelement location="${fjbg.jar}"/> + <pathelement location="${jline.jar}"/> + </path> + </target> + + <target name="quick.bin" depends="quick.pre-bin" unless="quick.bin.available"> + <mkdir dir="${build-quick.dir}/bin"/> + <taskdef name="quick-bin" classname="scala.tools.ant.ScalaTool"> + <classpath> + <pathelement location="${build-quick.dir}/classes/library"/> + <pathelement location="${build-quick.dir}/classes/compiler"/> + </classpath> + </taskdef> + <quick-bin + file="${build-quick.dir}/bin/scala" + class="scala.tools.nsc.MainGenericRunner" + javaFlags="${java.flags}" + classpathref="quick.bin.classpath"/> + <quick-bin + file="${build-quick.dir}/bin/scalac" + class="scala.tools.nsc.Main" + javaFlags="${java.flags}" + classpathref="quick.bin.classpath"/> + <quick-bin + file="${build-quick.dir}/bin/scaladoc" + class="scala.tools.nsc.ScalaDoc" + javaFlags="${java.flags}" + classpathref="quick.bin.classpath"/> + <quick-bin + file="${build-quick.dir}/bin/fsc" + class="scala.tools.nsc.CompileClient" + javaFlags="${java.flags}" + classpathref="quick.bin.classpath"/> + <chmod perm="ugo+rx" file="${build-quick.dir}/bin/scala"/> + <chmod perm="ugo+rx" file="${build-quick.dir}/bin/scalac"/> + <chmod perm="ugo+rx" file="${build-quick.dir}/bin/scaladoc"/> + <chmod perm="ugo+rx" file="${build-quick.dir}/bin/fsc"/> + <touch file="${build-quick.dir}/bin.complete" verbose="no"/> + </target> + + <target name="quick.done" depends="quick.bin"/> + + <target name="quick.clean" depends="pack.clean"> + <delete dir="${build-quick.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/> + </target> + +<!-- =========================================================================== +PACKED QUICK BUILD (PACK) +============================================================================ --> + + <target name="pack.start" depends="quick.done"/> + + <target name="pack.pre-lib" depends="pack.start"> + <uptodate + property="pack.lib.available" + targetfile="${build-pack.dir}/lib/scala-library.jar" + srcfile="${build-quick.dir}/library.complete"/> + </target> + + <target name="pack.lib" depends="pack.pre-lib" unless="pack.lib.available"> + <mkdir dir="${build-pack.dir}/lib"/> + <jar destfile="${build-pack.dir}/lib/scala-library.jar"> + <fileset dir="${build-quick.dir}/classes/library"> + <exclude name="scala/dbc/**"/> + </fileset> + </jar> + <jar destfile="${build-pack.dir}/lib/scala-dbc.jar"> + <fileset dir="${build-quick.dir}/classes/library"> + <include name="scala/dbc/**"/> + </fileset> + </jar> + </target> + + <target name="pack.pre-comp" depends="pack.lib"> + <uptodate + property="pack.comp.available" + targetfile="${build-pack.dir}/lib/scala-compiler.jar" + srcfile="${build-quick.dir}/compiler.complete"/> + </target> + + <target name="pack.comp" depends="pack.pre-comp" unless="pack.comp.available"> + <mkdir dir="${build-pack.dir}/lib"/> + <jar destfile="${build-pack.dir}/lib/scala-compiler.jar"> + <fileset dir="${build-quick.dir}/classes/compiler"/> + <zipfileset src="${fjbg.jar}"/> + <zipfileset src="${msil.jar}"/> + </jar> + </target> + + <target name="pack.pre-partest" depends="pack.comp"> + <uptodate + property="pack.partest.available" + targetfile="${build-pack.dir}/lib/scala-partest.jar" + srcfile="${build-quick.dir}/partest.complete"/> + </target> + + <target name="pack.partest" depends="pack.pre-partest" unless="pack.partest.available"> + <mkdir dir="${build-pack.dir}/lib"/> + <jar destfile="${build-pack.dir}/lib/scala-partest.jar"> + <fileset dir="${build-quick.dir}/classes/partest"/> + </jar> + </target> + + <target name="pack.pre-bin" depends="pack.partest"> + <uptodate + property="pack.bin.available" + srcfile="${build-pack.dir}/lib/scala-compiler.jar" + targetfile="${build-pack.dir}/bin.complete"/> + <taskdef name="pack-bin" classname="scala.tools.ant.ScalaTool"> + <classpath> + <pathelement location="${build-pack.dir}/lib/scala-library.jar"/> + <pathelement location="${build-pack.dir}/lib/scala-compiler.jar"/> + </classpath> + </taskdef> + </target> + + <target name="pack.bin" depends="pack.pre-bin" unless="pack.bin.available"> + <mkdir dir="${build-pack.dir}/bin"/> + <pack-bin + file="${build-pack.dir}/bin/scala" + class="scala.tools.nsc.MainGenericRunner" + javaFlags="${java.flags}"/> + <pack-bin + file="${build-pack.dir}/bin/scalac" + class="scala.tools.nsc.Main" + javaFlags="${java.flags}"/> + <pack-bin + file="${build-pack.dir}/bin/scaladoc" + class="scala.tools.nsc.ScalaDoc" + javaFlags="${java.flags}"/> + <pack-bin + file="${build-pack.dir}/bin/fsc" + class="scala.tools.nsc.CompileClient" + javaFlags="${java.flags}"/> + <chmod perm="ugo+rx" file="${build-pack.dir}/bin/scala"/> + <chmod perm="ugo+rx" file="${build-pack.dir}/bin/scalac"/> + <chmod perm="ugo+rx" file="${build-pack.dir}/bin/scaladoc"/> + <chmod perm="ugo+rx" file="${build-pack.dir}/bin/fsc"/> + <touch file="${build-pack.dir}/bin.complete" verbose="no"/> + </target> + + <target name="pack.done" depends="pack.bin"> + <path id="pack.classpath"> + <pathelement location="${build-pack.dir}/lib/scala-library.jar"/> + <pathelement location="${build-pack.dir}/lib/scala-compiler.jar"/> + <pathelement location="${build-pack.dir}/lib/scala-partest.jar"/> <pathelement location="${ant.jar}"/> </path> - <taskdef resource="scala/tools/ant/antlib.xml" classpathref="quick.classpath"/> + <taskdef resource="scala/tools/ant/antlib.xml" classpathref="pack.classpath"/> + <taskdef resource="scala/tools/partest/antlib.xml" classpathref="pack.classpath"/> + </target> + + <target name="pack.clean" depends="strap.clean"> + <delete dir="${build-pack.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/> </target> <!-- =========================================================================== -BUILD STRAP LAYER +BOOTSTRAPPING BUILD (STRAP) ============================================================================ --> - <target name="strap.init" depends="quick.load"> - <uptodate property="strap.available" targetfile="${build-strap.dir}/build.complete"> + <target name="strap.start" depends="pack.done"/> + + <target name="strap.pre-lib" depends="strap.start"> + <uptodate property="strap.lib.available" targetfile="${build-strap.dir}/library.complete"> <srcfiles dir="${src.dir}"> <include name="library/**"/> - <include name="compiler/**"/> <include name="dbc/**"/> <include name="actors/**"/> </srcfiles> </uptodate> </target> - <target name="strap.build" depends="strap.init" unless="strap.available"> - <stopwatch name="strap.timer"/> - <!-- Build library --> + <target name="strap.lib" depends="strap.pre-lib" unless="strap.lib.available"> + <stopwatch name="strap.lib.timer"/> <mkdir dir="${build-strap.dir}/classes/library"/> <javac srcdir="${src.dir}/library" @@ -376,27 +611,32 @@ BUILD STRAP LAYER destdir="${build-strap.dir}/classes/library" classpath="${build-strap.dir}/classes/library" includes="**/*.java"/> - <sabmake id="quick.lib.scalac" + <scalac + srcdir="${src.dir}/library" destdir="${build-strap.dir}/classes/library" - compilerpathref="quick.classpath" - srcpath="${src.dir}/library"> - <compilationpath> - <pathelement location="${build-strap.dir}/classes/library"/> - </compilationpath> - </sabmake> - <sabuse id="quick.lib.scalac" srcdir="${src.dir}/library"> + classpath="${build-strap.dir}/classes/library" + sourcepath="${src.dir}/library"> <include name="scala/Predef.scala"/> - </sabuse> - <sabuse id="quick.lib.scalac" srcdir="${src.dir}/library"> + </scalac> + <scalac + srcdir="${src.dir}/library" + destdir="${build-strap.dir}/classes/library" + classpath="${build-strap.dir}/classes/library"> <include name="**/*.scala"/> <exclude name="scala/Predef.scala"/> - </sabuse> - <sabuse id="quick.lib.scalac" srcdir="${src.dir}/actors"> + </scalac> + <scalac + srcdir="${src.dir}/actors" + destdir="${build-strap.dir}/classes/library" + classpath="${build-strap.dir}/classes/library"> <include name="**/*.scala"/> - </sabuse> - <sabuse id="quick.lib.scalac" srcdir="${src.dir}/dbc"> + </scalac> + <scalac + srcdir="${src.dir}/dbc" + destdir="${build-strap.dir}/classes/library" + classpath="${build-strap.dir}/classes/library"> <include name="**/*.scala"/> - </sabuse> + </scalac> <propertyfile file="${build-strap.dir}/classes/library/library.properties"> <entry key="version.number" value="${version.number}"/> <entry key="copyright.string" value="${copyright.string}"/> @@ -409,25 +649,32 @@ BUILD STRAP LAYER <include name="**/*.css"/> </fileset> </copy> - <sabbreak id="quick.lib.scalac"/> - <!-- Build compiler --> + <touch file="${build-strap.dir}/library.complete" verbose="no"/> + <stopwatch name="strap.lib.timer" action="total"/> + </target> + + <target name="strap.pre-comp" depends="strap.lib"> + <uptodate property="strap.comp.available" targetfile="${build-strap.dir}/compiler.complete"> + <srcfiles dir="${src.dir}/compiler"/> + </uptodate> + </target> + + <target name="strap.comp" depends="strap.pre-comp" unless="strap.comp.available"> + <stopwatch name="strap.comp.timer"/> <mkdir dir="${build-strap.dir}/classes/compiler"/> - <sabmake id="quick.comp.scalac" - destdir="${build-strap.dir}/classes/compiler" - compilerpathref="quick.classpath" - srcpath="${src.dir}/compiler"> - <compilationpath> - <pathelement location="${build-strap.dir}/classes/library"/> - <pathelement location="${build-strap.dir}/classes/compiler"/> + <scalac + srcdir="${src.dir}/compiler" + destdir="${build-strap.dir}/classes/compiler"> + <include name="**/*.scala"/> + <classpath> + <pathelement location="${build-strap.dir}/classes/library"/> + <pathelement location="${build-strap.dir}/classes/compiler"/> <pathelement location="${fjbg.jar}"/> <pathelement location="${msil.jar}"/> <pathelement location="${jline.jar}"/> <pathelement location="${ant.jar}"/> - </compilationpath> - </sabmake> - <sabuse id="quick.comp.scalac" srcdir="${src.dir}/compiler"> - <include name="**/*.scala"/> - </sabuse> + </classpath> + </scalac> <propertyfile file="${build-strap.dir}/classes/compiler/compiler.properties"> <entry key="version.number" value="${version.number}"/> <entry key="copyright.string" value="${copyright.string}"/> @@ -440,140 +687,71 @@ BUILD STRAP LAYER <include name="**/*.css"/> </fileset> </copy> - <sabbreak id="quick.comp.scalac"/> - <!-- Timing the build --> - <touch file="${build-strap.dir}/build.complete" verbose="no"/> - <stopwatch name="strap.timer" action="total"/> + <touch file="${build-strap.dir}/compiler.complete" verbose="no"/> + <stopwatch name="strap.comp.timer" action="total"/> </target> - <target name="strap.load" depends="strap.build"/> - -<!-- =========================================================================== -BUILD PARTEST -============================================================================ --> - - <target name="partest.init" depends="quick.load"> - <uptodate property="partest.available" targetfile="${build-partest.dir}/build.complete"> + <target name="strap.pre-partest" depends="strap.comp"> + <uptodate property="strap.partest.available" targetfile="${build-strap.dir}/partest.complete"> <srcfiles dir="${src.dir}/partest"/> </uptodate> </target> - <target name="partest.build" depends="partest.init" unless="partest.available"> - <mkdir dir="${build-partest.dir}/classes"/> + <target name="strap.partest" depends="strap.pre-partest" unless="strap.partest.available"> + <stopwatch name="strap.partest.timer"/> + <mkdir dir="${build-strap.dir}/classes/partest"/> <javac srcdir="${src.dir}/partest" - destdir="${build-partest.dir}/classes"> + destdir="${build-strap.dir}/classes/partest"> <classpath> - <path refid="quick.classpath"/> - <pathelement location="${build-partest.dir}/classes"/> + <pathelement location="${build-strap.dir}/classes/library"/> + <pathelement location="${build-strap.dir}/classes/compiler"/> + <pathelement location="${build-strap.dir}/classes/partest"/> </classpath> <include name="**/*.java"/> </javac> <scalac srcdir="${src.dir}/partest" - destdir="${build-partest.dir}/classes"> + destdir="${build-strap.dir}/classes/partest"> + <include name="**/*.scala"/> <classpath> - <path refid="quick.classpath"/> - <pathelement location="${build-partest.dir}/classes"/> + <pathelement location="${build-strap.dir}/classes/library"/> + <pathelement location="${build-strap.dir}/classes/compiler"/> + <pathelement location="${build-strap.dir}/classes/partest"/> + <pathelement location="${ant.jar}"/> </classpath> - <include name="**/*.scala"/> </scalac> - <copy todir="${build-partest.dir}/classes"> + <copy todir="${build-strap.dir}/classes/partest"> <fileset dir="${src.dir}/partest"> <include name="**/*.xml"/> </fileset> </copy> - <touch file="${build-partest.dir}/build.complete" verbose="no"/> + <touch file="${build-strap.dir}/partest.complete" verbose="no"/> + <stopwatch name="strap.partest.timer" action="total"/> </target> - <target name="partest.load" depends="partest.build"/> + <target name="strap.done" depends="strap.partest"/> + + <target name="strap.clean"> + <delete dir="${build-strap.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/> + </target> <!-- =========================================================================== -MAKE MODEL DISTRIBUTION +DOCUMENTATION ============================================================================ --> - <target name="pack.init" depends="quick.load, partest.load"> - <uptodate property="pack.available" targetfile="${build-quick.dir}/pack.complete"> - <srcfiles dir="${build.dir}"> - <include name="*/build.complete"/> + <target name="docs.start" depends="pack.done"> + <uptodate property="docs.available" targetfile="${build-docs.dir}/build.complete"> + <srcfiles dir="${src.dir}"> + <include name="library/**"/> + <include name="dbc/**"/> + <include name="actors/**"/> </srcfiles> </uptodate> </target> - - <target name="pack.build" depends="pack.init" unless="pack.available"> - <!-- Packages libraries --> - <mkdir dir="${build-quick.dir}/lib"/> - <jar destfile="${build-quick.dir}/lib/scala-library.jar"> - <fileset dir="${build-quick.dir}/classes/library"> - <exclude name="scala/dbc/**"/> - </fileset> - </jar> - <jar destfile="${build-quick.dir}/lib/scala-dbc.jar"> - <fileset dir="${build-quick.dir}/classes/library"> - <include name="scala/dbc/**"/> - </fileset> - </jar> - <jar destfile="${build-quick.dir}/lib/scala-compiler.jar"> - <fileset dir="${build-quick.dir}/classes/compiler"/> - <zipfileset src="${fjbg.jar}"/> - <zipfileset src="${msil.jar}"/> - </jar> - <jar destfile="${build-quick.dir}/lib/scala-partest.jar"> - <fileset dir="${build-partest.dir}/classes"/> - </jar> - <!-- Make executables --> - <mkdir dir="${build-quick.dir}/bin"/> - <scalatool - file="${build-quick.dir}/bin/scala" - name="Scala code runner" - class="scala.tools.nsc.MainGenericRunner" - version="${version.number}" - copyright="${copyright.string}" - javaFlags="${java.flags}"/> - <scalatool - file="${build-quick.dir}/bin/scalac" - name="Scala compiler" - class="scala.tools.nsc.Main" - version="${version.number}" - copyright="${copyright.string}" - javaFlags="${java.flags}"/> - <scalatool - file="${build-quick.dir}/bin/scaladoc" - name="Scala doc generator" - class="scala.tools.nsc.ScalaDoc" - version="${version.number}" - copyright="${copyright.string}" - javaFlags="${java.flags}"/> - <scalatool - file="${build-quick.dir}/bin/fsc" - name="Fast Scala compiler" - class="scala.tools.nsc.CompileClient" - version="${version.number}" - copyright="${copyright.string}" - javaFlags="${java.flags}"/> - <chmod perm="ugo+rx" file="${build-quick.dir}/bin/scala"/> - <chmod perm="ugo+rx" file="${build-quick.dir}/bin/scalac"/> - <chmod perm="ugo+rx" file="${build-quick.dir}/bin/scaladoc"/> - <chmod perm="ugo+rx" file="${build-quick.dir}/bin/fsc"/> - <!-- Point to latest --> - <touch file="${build-quick.dir}/pack.complete" verbose="no"/> - </target> - <target name="pack.load" depends="pack.build"> - <path id="pack.classpath"> - <pathelement location="${build-quick.dir}/lib/scala-library.jar"/> - <pathelement location="${build-quick.dir}/lib/scala-compiler.jar"/> - <pathelement location="${build-quick.dir}/lib/scala-partest.jar"/> - <pathelement location="${ant.jar}"/> - </path> - </target> - -<!-- =========================================================================== -BUILD DOCUMENTATION -============================================================================ --> - - <target name="docs.init" depends="quick.load"> - <uptodate property="docs.available" targetfile="${build-docs.dir}/build.complete"> + <target name="docs.pre-lib" depends="docs.start"> + <uptodate property="docs.lib.available" targetfile="${build-docs.dir}/library.complete"> <srcfiles dir="${src.dir}"> <include name="library/**"/> <include name="dbc/**"/> @@ -582,14 +760,14 @@ BUILD DOCUMENTATION </uptodate> </target> - <target name="docs.build" depends="docs.init" unless="docs.available"> - <stopwatch name="docs.timer"/> - <mkdir dir="${build-docs.dir}"/> + <target name="docs.lib" depends="docs.pre-lib" unless="docs.lib.available"> + <stopwatch name="docs.lib.timer"/> + <mkdir dir="${build-docs.dir}/library"/> <scaladoc - destdir="${build-docs.dir}" + destdir="${build-docs.dir}/library" windowtitle="Scala Library" doctitle="Scala ${version.number} API" - classpathref="quick.classpath"> + classpathref="pack.classpath"> <src> <files includes="${src.dir}/dbc"/> <files includes="${src.dir}/actors"/> @@ -597,27 +775,50 @@ BUILD DOCUMENTATION </src> <include name="**/*.scala"/> </scaladoc> - <touch file="${build-docs.dir}/build.complete" verbose="no"/> - <stopwatch name="docs.timer" action="total"/> + <touch file="${build-docs.dir}/lib.complete" verbose="no"/> + <stopwatch name="docs.lib.timer" action="total"/> </target> - <target name="docs.load" depends="docs.build"/> + <target name="docs.pre-comp" depends="docs.lib"> + <uptodate property="docs.comp.available" targetfile="${build-docs.dir}/compiler.complete"> + <srcfiles dir="${src.dir}/compiler"/> + </uptodate> + </target> + <target name="docs.comp" depends="docs.pre-comp" unless="docs.comp.available"> + <stopwatch name="docs.comp.timer"/> + <mkdir dir="${build-docs.dir}/compiler"/> + <scaladoc + destdir="${build-docs.dir}/compiler" + windowtitle="Scala Compiler" + doctitle="Scala Compiler ${version.number} API" + classpathref="pack.classpath" + srcdir="${src.dir}/compiler"> + <include name="**/*.scala"/> + </scaladoc> + <touch file="${build-docs.dir}/comp.complete" verbose="no"/> + <stopwatch name="docs.comp.timer" action="total"/> + </target> + + <target name="docs.done" depends="docs.lib"/> + + <target name="docs.clean"> + <delete dir="${build-docs.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/> + </target> + <!-- =========================================================================== BOOTRAPING TEST AND TEST SUITE ============================================================================ --> - - <target name="stability.test" depends="strap.load"> + + <target name="test.stability" depends="strap.done"> <same dir="${build-quick.dir}" todir="${build-strap.dir}" failondifferent="no"> <exclude name="**/*.properties"/> <exclude name="bin/**"/> - <exclude name="lib/**"/> - <exclude name="pack.complete"/> + <exclude name="*.complete"/> </same> </target> - <target name="suite.test" depends="partest.load, pack.load"> - <taskdef resource="scala/tools/partest/antlib.xml" classpathref="pack.classpath"/> + <target name="test.suite" depends="pack.done"> <partest showlog="yes" erroronfailed="yes"> <classpath> <path refid="pack.classpath"/> @@ -633,61 +834,40 @@ BOOTRAPING TEST AND TEST SUITE <residenttests dir="${test.dir}/files/res" includes="*.res"/> </partest> </target> - -<!-- =========================================================================== -MAKE SABBUS JAR (to remove once sabbus is part of starr library) -============================================================================ --> - <target name="sabbus.build" depends="starr.load"> - <taskdef resource="scala/tools/ant/antlib.xml" classpathref="starr.classpath"/> - <mkdir dir="${build.dir}/sabbus"/> - <scalac - srcdir="${src.dir}/compiler/scala/tools/ant/sabbus/" - destdir="${build.dir}/sabbus"> - <include name="*.scala"/> - <classpath> - <pathelement location="${lib.starr.jar}"/> - <pathelement location="${comp.starr.jar}"/> - <pathelement location="${ant.jar}"/> - </classpath> - </scalac> - <copy - file="${src.dir}/compiler/scala/tools/ant/sabbus/antlib.xml" - todir="${build.dir}/sabbus/scala/tools/ant/sabbus"/> - <jar - destfile="${lib.dir}/sabbus.jar" - basedir="${build.dir}/sabbus"/> - </target> - - <target name="sabbus.load" depends="sabbus.build"/> + <target name="test.done" depends="test.suite, test.stability"/> <!-- =========================================================================== -MAKE ACTUAL DISTRIBUTION +DISTRIBUTION ============================================================================ --> - <target name="dist.init" depends="docs.load, pack.load"/> - - <target name="dist.build" depends="dist.init" unless="dist.available"> + <target name="dist.start" depends="docs.done, pack.done"> <property name="dist.dir" value="${dists.dir}/scala-${version.number}"/> - <!-- Copy model --> + </target> + + <target name="dist.base" depends="dist.start"> <mkdir dir="${dist.dir}/lib"/> <copy toDir="${dist.dir}/lib"> - <fileset dir="${build-quick.dir}/lib"/> + <fileset dir="${build-pack.dir}/lib"/> </copy> <mkdir dir="${dist.dir}/bin"/> <copy toDir="${dist.dir}/bin"> - <fileset dir="${build-quick.dir}/bin"/> + <fileset dir="${build-pack.dir}/bin"/> </copy> <chmod perm="ugo+rx" file="${dist.dir}/bin/scala"/> <chmod perm="ugo+rx" file="${dist.dir}/bin/scalac"/> <chmod perm="ugo+rx" file="${dist.dir}/bin/scaladoc"/> <chmod perm="ugo+rx" file="${dist.dir}/bin/fsc"/> - <!-- Packages doc --> + </target> + + <target name="dist.doc" depends="dist.base"> <mkdir dir="${dist.dir}/doc/api"/> <copy toDir="${dist.dir}/doc/api"> - <fileset dir="${build-docs.dir}"/> + <fileset dir="${build-docs.dir}/library"/> </copy> - <!-- Packages source --> + </target> + + <target name="dist.src" depends="dist.doc"> <mkdir dir="${dist.dir}/src"/> <jar destfile="${dist.dir}/src/scala-library-src.jar"> <fileset dir="${src.dir}/library"/> @@ -701,56 +881,102 @@ MAKE ACTUAL DISTRIBUTION </jar> </target> - <target name="dist.latest" depends="dist.build" unless="os.win"> + <target name="dist.latest" depends="dist.src" unless="os.win"> <symlink link="${dists.dir}/latest" resource="${dist.dir}" overwrite="yes"/> </target> - <target name="dist.load" depends="stability.test, suite.test, dist.latest"/> + <target name="dist.done" depends="dist.latest"/> + + <target name="dist.clean"> + <delete dir="${dists.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/> + </target> + +<!-- =========================================================================== +TEST AND DISTRIBUTION BUNDLE (ALL) +============================================================================ --> + + <target name="all.done" depends="dist.done, test.done"/> + + <target name="all.clean" depends="locker.clean, docs.clean, dist.clean"/> <!-- =========================================================================== -MAKE NEW STARR +STABLE REFERENCE (STARR) ============================================================================ --> - <target name="starr.init" depends="pack.load"/> + <target name="starr.start" depends="pack.done"/> - <target name="starr.build" depends="starr.init"> + <target name="starr.clean" depends="locker.clean, starr.start"> <delete file="${lib.starr.jar}"/> <delete file="${comp.starr.jar}"/> <delete file="${lib.dir}/scala-library-src.jar"/> + </target> + + <target name="starr.lib" depends="starr.clean"> <copy file="${build-quick.dir}/lib/scala-library.jar" toFile="${lib.starr.jar}"/> - <copy file="${build-quick.dir}/lib/scala-compiler.jar" toFile="${comp.starr.jar}"/> + </target> + + <target name="starr.comp" depends="starr.lib"> + <jar destfile="${comp.starr.jar}"> + <fileset dir="${build-quick.dir}/classes/compiler"/> + </jar> + </target> + + <target name="starr.src" depends="starr.comp"> <jar destfile="${lib.dir}/scala-library-src.jar"> <fileset dir="${src.dir}/library"/> <fileset dir="${src.dir}/actors"/> </jar> </target> + + <target name="starr.done" depends="starr.src"/> <!-- =========================================================================== -CLEAN +MISCELLANEOUS ============================================================================ --> - - <target name="locker.clean" depends="quick.clean"> - <delete dir="${build-locker.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/> - </target> - - <target name="quick.clean" depends="strap.clean, partest.clean"> - <delete dir="${build-quick.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/> + + <target name="graph.init"> + <taskdef name="vizant" classname="vizant.Vizant" classpath="${lib-ant.dir}/vizant.jar"/> </target> - - <target name="strap.clean"> - <delete dir="${build-strap.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/> + + <target name="graph.clean" depends="graph.init"> + <vizant antfile="${ant.file}" outfile="${ant.project.name}.dot" from="starr.clean"/> </target> - - <target name="partest.clean"> - <delete dir="${build-partest.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/> + + <target name="graph.all" depends="graph.init"> + <vizant antfile="${ant.file}" outfile="${ant.project.name}.dot" from="all.done"/> </target> - - <target name="docs.clean"> - <delete dir="${build-docs.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/> + + <target name="graph.sabbus" depends="graph.init"> + <vizant antfile="${ant.file}" outfile="${ant.project.name}.dot"/> </target> - <target name="dists.clean"> - <delete dir="${dists.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/> +<!-- =========================================================================== +MAKE SABBUS JAR (to remove once sabbus is part of starr library) +============================================================================ --> + + <target name="sabbus.start" depends="init"/> + + <target name="sabbus.build" depends="sabbus.start"> + <taskdef resource="scala/tools/ant/antlib.xml" classpathref="starr.classpath"/> + <mkdir dir="${build.dir}/sabbus"/> + <scalac + srcdir="${src.dir}/compiler/scala/tools/ant/sabbus/" + destdir="${build.dir}/sabbus"> + <include name="*.scala"/> + <classpath> + <pathelement location="${lib.starr.jar}"/> + <pathelement location="${comp.starr.jar}"/> + <pathelement location="${ant.jar}"/> + </classpath> + </scalac> + <copy + file="${src.dir}/compiler/scala/tools/ant/sabbus/antlib.xml" + todir="${build.dir}/sabbus/scala/tools/ant/sabbus"/> + <jar + destfile="${lib.dir}/sabbus.jar" + basedir="${build.dir}/sabbus"/> </target> - + + <target name="sabbus.done" depends="sabbus.build"/> + </project> diff --git a/src/compiler/scala/tools/ant/ScalaTool.scala b/src/compiler/scala/tools/ant/ScalaTool.scala index f53363623c..bfd78ae4d5 100644 --- a/src/compiler/scala/tools/ant/ScalaTool.scala +++ b/src/compiler/scala/tools/ant/ScalaTool.scala @@ -10,39 +10,31 @@ package scala.tools.ant -import scala.collection.immutable.{Map, ListMap} - import java.io.{File, InputStream, FileWriter} import org.apache.tools.ant.BuildException import org.apache.tools.ant.taskdefs.MatchingTask -import org.apache.tools.ant.types.Path -import org.apache.tools.ant.util.FileUtils +import org.apache.tools.ant.types.{Path, Reference} /** <p> * An Ant task that generates a shell or batch script to execute a - * <a href="http://scala-lang.org/" target="_top">Scala</a> program. + * Scala program. * This task can take the following parameters as attributes: * </p><ul> * <li>file (mandatory),</li> - * <li>name,</li> * <li>class (mandatory),</li> * <li>platforms,</li> - * <li>version,</li> - * <li>copyright,</li> - * <li>bootclasspath,</li> - * <li>extclasspath,</li> + * <li>classpath,</li> * <li>properties,</li> * <li>javaflags,</li> * <li>toolflags.</li></ul> * * @author Gilles Dubochet - * @version 1.0 + * @version 1.1 */ class ScalaTool extends MatchingTask { - /** The unique Ant file utilities instance to use in this task. */ - private val fileUtils = FileUtils.newFileUtils() + private def emptyPath = new Path(getProject) /*============================================================================*\ ** Ant user-properties ** @@ -60,89 +52,49 @@ class ScalaTool extends MatchingTask { } /** The path to the exec script file. ".bat" will be appended for the - * Windows BAT file, if generated. - */ + * Windows BAT file, if generated. */ private var file: Option[File] = None /** The main class to run. */ private var mainClass: Option[String] = None - /** The name of this tool. Can only be set when a main class is defined, - * default this is equal to the file name. - */ - private var name: Option[String] = None - /** Supported platforms for the script. Either "unix" or "windows". - * Defaults to both. - */ - private var platforms: List[String] = Nil - - /** The optional version number. If set, when "-version" is passed to the - * script, this value will be printed. - */ - private var version: String = "" - - /** The optional copyright notice, that will be printed in the script. */ - private var copyright: String = "This file is copyrighted by its owner" - - /** The optional boot classpath */ - private var bootclasspath: List[String] = Nil + * Defaults to both. */ + private var platforms: List[String] = List("unix", "windows") /** An (optional) path to all JARs that this script depend on. Paths must be - * relative to the scala home directory. If not set, all JAR archives in - * "lib/" are automatically added. - */ - private var extclasspath: List[String] = Nil + * relative to the scala home directory. If not set, all JAR archives and + * folders in "lib/" are automatically added. */ + private var classpath: Option[Path] = None /** Comma-separated Java system properties to pass to the JRE. Properties - * are formated as name=value. Properties scala.home, scala.tool.name and - * scala.tool.version are always set. - */ - private var properties: List[Pair[String,String]] = Nil + * are formated as name=value. Properties scala.home, scala.tool.name and + * scala.tool.version are always set. */ + private var properties: List[(String, String)] = Nil /** Additional flags passed to the JRE ("java [javaFlags] class"). */ private var javaFlags: String = "" /** Additional flags passed to the tool ("java class [toolFlags]"). Can only - * be set when a main class is defined. - */ + * be set when a main class is defined. */ private var toolFlags: String = "" /*============================================================================*\ ** Properties setters ** \*============================================================================*/ - /** Sets the file attribute. - * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>. - * - * @param input The value of <code>file</code>. - */ + /** Sets the file attribute. */ def setFile(input: File) = file = Some(input) - /** Sets the file attribute. - * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>. - * - * @param input The value of <code>file</code>. - */ - def setName(input: String) = - name = Some(input) - - /** Sets the main class attribute. - * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>. - * - * @param input The value of <code>mainClass</code>. - */ + /** Sets the main class attribute. */ def setClass(input: String) = mainClass = Some(input) - /** Sets the platforms attribute. Used by Ant. - * - * @param input The value for <code>platforms</code>. - */ + /** Sets the platforms attribute. */ def setPlatforms(input: String) = { platforms = List.fromArray(input.split(",")).flatMap { s: String => - val st = s.trim() + val st = s.trim if (Platforms.isPermissible(st)) (if (input != "") List(st) else Nil) else { @@ -152,102 +104,55 @@ class ScalaTool extends MatchingTask { } } - /** Sets the version attribute. - * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>. - * - * @param input The value of <code>version</code>. - */ - def setVersion(input: String) = - version = input - - /** Sets the copyright attribute. - * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>. - * - * @param input The value of <code>copyright</code>. - */ - def setCopyright(input: String) = - copyright = input - - /** Sets the boot classpath attribute. - * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>. - * - * @param input The value of <code>bootclasspath</code>. - */ - def setBootclasspath(input: String) = - bootclasspath = bootclasspath ::: List.fromArray(input.split(":")) - - /** Sets the extension classpath attribute. - * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>. - * - * @param input The value of <code>extclasspath</code>. - */ - def setExtclasspath(input: String) = - extclasspath = extclasspath ::: List.fromArray(input.split(":")) - - /** Sets the properties attribute. - * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>. - * - * @param input The value for <code>properties</code>. - */ + /** Sets the classpath with which to run the tool. */ + def setClassPath(input: Path): Unit = + if (classpath.isEmpty) + classpath = Some(input) + else + classpath.get.append(input) + def createClassPath: Path = { + if (classpath.isEmpty) classpath = Some(emptyPath) + classpath.get.createPath() + } + def setClassPathRef(input: Reference): Unit = + createClassPath.setRefid(input) + + /** Sets JVM properties that will be set whilst running the tool. */ def setProperties(input: String) = { properties = List.fromArray(input.split(",")).flatMap { s: String => - val st = s.trim(); val stArray = st.split("=", 2) + val st = s.trim + val stArray = st.split("=", 2) if (stArray.length == 2) { if (input != "") List(Pair(stArray(0), stArray(1))) else Nil - } else error("Property " + st + " does not conform to specification.") + } + else + error("Property " + st + " is not formatted properly.") } } - /** Sets the version attribute. - * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>. - * - * @param input The value of <code>version</code>. - */ + /** Sets flags to be passed to the Java interpreter. */ def setJavaflags(input: String) = - javaFlags = input + javaFlags = input.trim - /** Sets the version attribute. - * Used by <a href="http://ant.apache.org/" target="_top">Ant</a>. - * - * @param input The value of <code>version</code>. - */ + /** Sets flags to be passed to the tool. */ def setToolflags(input: String) = - toolFlags = input + toolFlags = input.trim /*============================================================================*\ ** Properties getters ** \*============================================================================*/ - /** Gets the value of the file attribute in a Scala-friendly form. - * @returns The file as a file. */ - private def getFile: File = - if (file.isEmpty) error("Member 'file' is empty.") - else getProject().resolveFile(file.get.toString) - - /** Gets the value of the bootclasspath attribute in a Scala-friendly form. - * @returns The boot class path as a list of files. */ - private def getUnixBootClasspath: String = - bootclasspath.mkString("", ":", "") - - /** Gets the value of the bootclasspath attribute in a Scala-friendly form. - * @returns The boot class path as a list of files. */ - private def getWinBootClasspath: String = - bootclasspath.map(_.replace('/', '\\')). - mkString("", ";", "") - /** Gets the value of the classpath attribute in a Scala-friendly form. * @returns The class path as a list of files. */ - private def getUnixExtClasspath: String = - extclasspath.mkString("", ":", "") + private def getUnixclasspath: String = + classpath.getOrElse(emptyPath).list.mkString("", ":", "") /** Gets the value of the classpath attribute in a Scala-friendly form. * @returns The class path as a list of files. */ - private def getWinExtClasspath: String = - extclasspath.map(_.replace('/', '\\')). + private def getWinclasspath: String = + classpath.getOrElse(emptyPath).list.map(_.replace('/', '\\')). mkString("", ";", "") - /** Gets the value of the classpath attribute in a Scala-friendly form. - * @returns The class path as a list of files. */ private def getProperties: String = properties.map({ case Pair(name,value) => "-D" + name + "=\"" + value + "\"" @@ -264,9 +169,7 @@ class ScalaTool extends MatchingTask { private def error(message: String): Nothing = throw new BuildException(message, getLocation()) - private def readResource(resource: String, - tokens: Map[String, String] - ): String = { + private def readAndPatchResource(resource: String, tokens: Map[String, String]): String = { val chars = new Iterator[Char] { private val stream = this.getClass().getClassLoader().getResourceAsStream(resource) @@ -315,47 +218,35 @@ class ScalaTool extends MatchingTask { private def expandWinVar(vars: Map[String,String]): Map[String,String] = vars transform { (x, vari) => vari.replaceAll("#([^#]*)#", "%_$1%") } - private def pipeTemplate(template: String, patches: Map[String,String]) = { - val resourceRoot = "scala/tools/ant/templates/" - if (platforms.contains("unix")) { - val unixPatches = expandUnixVar(patches. - update("bootclasspath", getUnixBootClasspath). - update("extclasspath", getUnixExtClasspath)) - val unixTemplateResource = resourceRoot + template + "-unix.tmpl" - val unixTemplate = readResource(unixTemplateResource, unixPatches) - writeFile(getFile, unixTemplate) - } - if (platforms.contains("windows")) { - val winPatches = expandWinVar(patches. - update("bootclasspath", getWinBootClasspath). - update("extclasspath", getWinExtClasspath)) - val winTemplateResource = resourceRoot + template + "-windows.tmpl" - val winTemplate = readResource(winTemplateResource, winPatches) - writeFile(new File(getFile.getAbsolutePath() + ".bat"), winTemplate) - } - } - /*============================================================================*\ ** The big execute method ** \*============================================================================*/ - /** Performs the compilation. */ + /** Performs the tool creation. */ override def execute() = { // Tests if all mandatory attributes are set and valid. if (file.isEmpty) error("Attribute 'file' is not set.") if (mainClass.isEmpty) error("Main class must be set.") - if (platforms.isEmpty) platforms = Platforms.values - if (name.isEmpty) name = Some(file.get.getName) - val patches = ListMap.empty. - update("name", name.get). - update("class", mainClass.get). - update("version", version). - update("copyright", copyright). - update("properties", getProperties). - update("javaflags", javaFlags). - update("toolflags", toolFlags) - pipeTemplate("tool", patches) + val resourceRoot = "scala/tools/ant/templates/" + val patches = Map ( + ("class", mainClass.get), + ("properties", getProperties), + ("javaflags", javaFlags), + ("toolflags", toolFlags) + ) + if (platforms.contains("unix")) { + val unixPatches = patches + (("classpath", getUnixclasspath)) + val unixTemplateResource = resourceRoot + "tool-unix.tmpl" + val unixTemplate = readAndPatchResource(unixTemplateResource, unixPatches) + writeFile(file.get, unixTemplate) + } + if (platforms.contains("windows")) { + val winPatches = patches + (("classpath", getWinclasspath)) + val winTemplateResource = resourceRoot + "tool-windows.tmpl" + val winTemplate = readAndPatchResource(winTemplateResource, winPatches) + writeFile(new File(file.get.getAbsolutePath() + ".bat"), winTemplate) + } } } diff --git a/src/compiler/scala/tools/ant/templates/tool-unix.tmpl b/src/compiler/scala/tools/ant/templates/tool-unix.tmpl index d963d18873..0f7cfa7447 100644 --- a/src/compiler/scala/tools/ant/templates/tool-unix.tmpl +++ b/src/compiler/scala/tools/ant/templates/tool-unix.tmpl @@ -1,9 +1,7 @@ #!/bin/sh ############################################################################## -# @name@ @version@ -############################################################################## -# @copyright@ +# Copyright 2002-2008, LAMP/EPFL # # This is free software; see the distribution for copying conditions. # There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A @@ -11,10 +9,8 @@ ############################################################################## cygwin=false; -darwin=false; case "`uname`" in CYGWIN*) cygwin=true ;; - Darwin*) darwin=true ;; esac # Finding the root folder for this Scala distribution @@ -38,27 +34,17 @@ if $cygwin; then fi # Constructing the extension classpath -EXTENSION_CLASSPATH="@extclasspath@" -if [ -z "$EXTENSION_CLASSPATH" ] ; then +TOOL_CLASSPATH="@classpath@" +if [ -z "$TOOL_CLASSPATH" ] ; then for ext in `ls -d "$SCALA_HOME"/lib/*` ; do - if [ -z "$EXTENSION_CLASSPATH" ] ; then - EXTENSION_CLASSPATH="$ext" + if [ -z "$TOOL_CLASSPATH" ] ; then + TOOL_CLASSPATH="$ext" else - EXTENSION_CLASSPATH="$EXTENSION_CLASSPATH:$ext" + TOOL_CLASSPATH="$TOOL_CLASSPATH:$ext" fi done fi -# Setting the boot class-path to be the standard library (either as a JAR or a folder) -BOOT_CLASSPATH="@bootclasspath@" -if [ -z "$BOOT_CLASSPATH" ] ; then - if [ -f "$SCALA_HOME/lib/scala-library.jar" ] ; then - BOOT_CLASSPATH="$SCALA_HOME/lib/scala-library.jar" - elif [ -d "$SCALA_HOME/lib/library" ] ; then - BOOT_CLASSPATH="$SCALA_HOME/lib/library" - fi -fi - if $cygwin; then if [ "$OS" = "Windows_NT" ] && cygpath -m .>/dev/null 2>/dev/null ; then format=mixed @@ -66,11 +52,10 @@ if $cygwin; then format=windows fi SCALA_HOME=`cygpath --$format "$SCALA_HOME"` - EXTENSION_CLASSPATH=`cygpath --path --$format "$EXTENSION_CLASSPATH"` - BOOT_CLASSPATH=`cygpath --path --$format "$BOOT_CLASSPATH"` + TOOL_CLASSPATH=`cygpath --path --$format "$TOOL_CLASSPATH"` fi # Reminder: substitution ${JAVA_OPTS:=-Xmx256M -Xms16M} DO NOT work on Solaris [ -n "$JAVA_OPTS" ] || JAVA_OPTS="@javaflags@" -${JAVACMD:=java} $JAVA_OPTS -Xbootclasspath/a:"$BOOT_CLASSPATH" -cp "$EXTENSION_CLASSPATH" -Dscala.home="$SCALA_HOME" -Denv.classpath="$CLASSPATH" -Denv.emacs="$EMACS" @properties@ @class@ @toolflags@ "$@@" +${JAVACMD:=java} $JAVA_OPTS -cp "$TOOL_CLASSPATH" -Dscala.home="$SCALA_HOME" -Denv.classpath="$CLASSPATH" -Denv.emacs="$EMACS" @properties@ @class@ @toolflags@ "$@@" diff --git a/src/compiler/scala/tools/ant/templates/tool-windows.tmpl b/src/compiler/scala/tools/ant/templates/tool-windows.tmpl index 7c16d8d873..11deb440b7 100644 --- a/src/compiler/scala/tools/ant/templates/tool-windows.tmpl +++ b/src/compiler/scala/tools/ant/templates/tool-windows.tmpl @@ -1,9 +1,7 @@ @@echo off
rem ##########################################################################
-rem # @name@ @version@
-rem ##########################################################################
-rem # @copyright@
+rem # Copyright 2002-2008, LAMP/EPFL
rem #
rem # This is free software; see the distribution for copying conditions.
rem # There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
@@ -34,38 +32,28 @@ rem We use the value of the JAVA_OPTS environment variable if defined set _JAVA_OPTS=%JAVA_OPTS%
if "%_JAVA_OPTS%"=="" set _JAVA_OPTS=@javaflags@
-set _EXTENSION_CLASSPATH=@extclasspath@
-if "%_EXTENSION_CLASSPATH%"=="" (
+set _TOOL_CLASSPATH=@extclasspath@
+if "%_TOOL_CLASSPATH%"=="" (
for %%f in ("%_SCALA_HOME%\lib\*") do call :add_cpath "%%f"
if "%OS%"=="Windows_NT" (
for /d %%f in ("%_SCALA_HOME%\lib\*") do call :add_cpath "%%f"
)
)
-set _BOOT_CLASSPATH=@bootclasspath@
-if "%_BOOT_CLASSPATH%"=="" (
- if exist "%_SCALA_HOME%\lib\scala-library.jar" (
- set _BOOT_CLASSPATH=%_SCALA_HOME%\lib\scala-library.jar
- )
- if exist "%_SCALA_HOME%\lib\library" (
- set _BOOT_CLASSPATH=%_SCALA_HOME%\lib\library
- )
-)
-
set _PROPS=-Dscala.home="%_SCALA_HOME%" -Denv.classpath="%CLASSPATH%" -Denv.emacs="%EMACS%" @properties@
-rem echo %_JAVACMD% -Xbootclasspath/a:"%_BOOT_CLASSPATH%" %_JAVA_OPTS% %_PROPS% -cp "%_EXTENSION_CLASSPATH%" @class@ @toolflags@ %_ARGS%
-%_JAVACMD% -Xbootclasspath/a:"%_BOOT_CLASSPATH%" %_JAVA_OPTS% %_PROPS% -cp "%_EXTENSION_CLASSPATH%" @class@ @toolflags@ %_ARGS%
+rem echo %_JAVACMD% %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" @class@ @toolflags@ %_ARGS%
+%_JAVACMD% %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" @class@ @toolflags@ %_ARGS%
goto end
rem ##########################################################################
rem # subroutines
:add_cpath
- if "%_EXTENSION_CLASSPATH%"=="" (
- set _EXTENSION_CLASSPATH=%~1
+ if "%_TOOL_CLASSPATH%"=="" (
+ set _TOOL_CLASSPATH=%~1
) else (
- set _EXTENSION_CLASSPATH=%_EXTENSION_CLASSPATH%;%~1
+ set _TOOL_CLASSPATH=%_TOOL_CLASSPATH%;%~1
)
goto :eof
diff --git a/src/compiler/scala/tools/nsc/Settings.scala b/src/compiler/scala/tools/nsc/Settings.scala index 9b1567d145..9665a8bf00 100644 --- a/src/compiler/scala/tools/nsc/Settings.scala +++ b/src/compiler/scala/tools/nsc/Settings.scala @@ -66,7 +66,7 @@ class Settings(error: String => Unit) { val guessJar = new File(new File(new File(scalaHome), "lib"), "scala-library.jar") if (guessJar.isFile()) guessJar.getPath() else { - val guessDir = new File(new File(new File(scalaHome), "lib"), "library") + val guessDir = new File(new File(new File(scalaHome), "classes"), "library") if (guessDir.isDirectory()) guessDir.getPath() else null } } else null |