summaryrefslogtreecommitdiff
path: root/build.xml
diff options
context:
space:
mode:
Diffstat (limited to 'build.xml')
-rwxr-xr-x[-rw-r--r--]build.xml1934
1 files changed, 888 insertions, 1046 deletions
diff --git a/build.xml b/build.xml
index bef9fd5abb..2fd6491510 100644..100755
--- a/build.xml
+++ b/build.xml
@@ -1,6 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<project name="sabbus" default="build" xmlns:artifact="urn:maven-artifact-ant">
+<project name="sabbus" default="build"
+ xmlns:artifact="urn:maven-artifact-ant"
+ xmlns:rsel="antlib:org.apache.tools.ant.types.resources.selectors">
+ <include file="build-ant-macros.xml" as="macros"/>
+ <include file="src/build/maven/maven-deploy.xml" as="maven-deploy"/>
+
<description>
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.
</description>
@@ -9,7 +14,6 @@ SuperSabbus for Scala core, builds the scala library and compiler. It can also p
- for faster builds, have a build.properties in the same directory as build.xml that says:
locker.skip=1
- starr.use.released=1
-->
@@ -24,7 +28,10 @@ scalacArgs examples:
"-Dscalac.args=\"-Yrangepos\" -Dpartest.scalac_opts=\"-Yrangepos\""
targets exercised:
- locker.done build-opt nightly test.suite test.continuations.suite test.scaladoc
+ deploy-core.snapshot publish-opt-nodocs distpack-maven-opt nightly locker.done build build-opt test.suite test.continuations.suite test.scaladoc
+
+NOTE: after distpack-maven-opt, it is expected there's a build file in dists/maven/latest that defines targets deploy and deploy.local
+TODO: get rid of this separate step
-->
<!-- To use Zinc with the ant build:
@@ -54,25 +61,42 @@ TODO:
<target name="build-opt" description="Optimized version of build."> <optimized name="build"/></target>
<target name="test-opt" description="Optimized version of test."> <optimized name="test"/></target>
+ <target name="test-core-opt" description="Optimized version of test.core."> <optimized name="test.core"/></target>
+ <target name="test-stab-opt" description="Optimized version of test.stability."> <optimized name="test.stability"/></target>
<target name="dist-opt" description="Optimized version of dist."> <optimized name="dist"/></target>
<target name="partialdist-opt" description="Optimized version of partialdist."> <optimized name="partialdist"/></target>
<target name="fastdist-opt" description="Optimized version of fastdist."> <optimized name="fastdist"/></target>
<!-- packaging -->
- <target name="distpack" depends="dist.done, docs.done">
- <ant antfile="${src.dir}/build/pack.xml" target="pack-all.done" inheritall="yes" inheritrefs="yes"/></target>
-
- <target name="distpack-maven" depends="dist.done, docs.done">
- <ant antfile="${src.dir}/build/pack.xml" target="pack-maven.done" inheritall="yes" inheritrefs="yes"/></target>
+ <target name="distpack" depends="pack-archives.done, pack-maven.done"/>
+ <target name="distpack-maven" depends="pack-maven.done"/>
<target name="distpack-opt" description="Builds an optimised distribution."> <optimized name="distpack"/></target>
<target name="distpack-maven-opt" description="Builds an optimised maven distribution."><optimized name="distpack-maven"/></target>
- <target name="all.done" depends="dist.done, test.done"/>
+ <!-- The IDE build requires actors/swing/continuations, so need to publish them during PR validation until they are modules -->
+ <target name="publish-opt-nodocs" description="Publishes Scala (optimized) without generating docs/testing (library/reflect/compiler/actors/swing/continuations).">
+ <antcall target="publish">
+ <param name="docs.skip" value="1"/>
+ <param name="scalac.args.optimise" value="-optimise"/>
+ </antcall>
+ </target>
- <!-- must use depends for all.done, not antcall: need the properties defined in there (dist.dir) -->
- <target name="nightly-nopt" depends="all.done, docs.done">
- <ant antfile="${src.dir}/build/pack.xml" target="pack-all.done" inheritall="yes" inheritrefs="yes"/></target>
+ <target name="publish-core-opt-nodocs" description="Builds an untested, undocumented optimised core (library/reflect/compiler) and publishes to maven.">
+ <antcall target="publish-core">
+ <param name="docs.skip" value="1"/>
+ <param name="scalac.args.optimise" value="-optimise"/>
+ </antcall>
+ </target>
+ <target name="publish-core-local-nodocs" description="Builds an untested, undocumented core (library/reflect/compiler) and locally publishes to maven">
+ <antcall target="publish-core-local">
+ <param name="docs.skip" value="1"/>
+ </antcall>
+ </target>
+
+ <target name="all.done" depends="test.done, distpack"/>
+
+ <target name="nightly-nopt" depends="all.done"/>
<target name="nightly"><optimized name="nightly-nopt"/></target>
<target name="nightly.checkall">
@@ -82,12 +106,6 @@ TODO:
<target name="docsclean" depends="docs.clean" description="Removes generated documentation. Distributions are untouched."/>
<target name="distclean" depends="dist.clean" description="Removes all distributions. Binaries and documentation are untouched."/>
- <macrodef name="optimized" >
- <attribute name="name"/>
- <sequential>
- <antcall target="@{name}"><param name="scalac.args.optimise" value="-optimise"/></antcall>
- </sequential>
- </macrodef>
<!-- ===========================================================================
PROPERTIES
@@ -114,26 +132,19 @@ TODO:
<!-- Generating version number -->
<property file="${basedir}/build.number"/>
- <!-- read starr.version -->
- <property file="${basedir}/starr.number"/>
+ <!-- read versions.properties -->
+ <property file="${basedir}/versions.properties"/>
<!-- Sets location of pre-compiled libraries -->
- <property name="library.starr.jar" value="${lib.dir}/scala-library.jar"/>
- <property name="reflect.starr.jar" value="${lib.dir}/scala-reflect.jar"/>
- <property name="compiler.starr.jar" value="${lib.dir}/scala-compiler.jar"/>
- <property name="msil.starr.jar" value="${lib.dir}/msil.jar"/>
- <property name="jline.jar" value="${lib.dir}/jline.jar"/>
<property name="ant.jar" value="${ant.home}/lib/ant.jar"/>
- <property name="scalacheck.jar" value="${lib.dir}/scalacheck.jar"/>
<!-- Sets location of build folders -->
<property name="build.dir" value="${basedir}/build"/>
+ <property name="build-deps.dir" value="${build.dir}/deps"/>
<property name="build-libs.dir" value="${build.dir}/libs"/>
<property name="build-asm.dir" value="${build.dir}/asm"/>
- <property name="build-fjbg.dir" value="${build-libs.dir}"/>
<property name="build-forkjoin.dir" value="${build-libs.dir}"/>
<property name="build-locker.dir" value="${build.dir}/locker"/>
- <property name="build-palo.dir" value="${build.dir}/palo"/>
<property name="build-quick.dir" value="${build.dir}/quick"/>
<property name="build-pack.dir" value="${build.dir}/pack"/>
<property name="build-osgi.dir" value="${build.dir}/osgi"/>
@@ -151,7 +162,8 @@ TODO:
<property name="dists.dir" value="${basedir}/dists"/>
<property name="copyright.string" value="Copyright 2002-2013, LAMP/EPFL"/>
- <property name="partest.version.number" value="0.9.2"/>
+
+ <property name="jline.version" value="2.11"/>
<!-- These are NOT the flags used to run SuperSabbus, but the ones written
into the script runners created with scala.tools.ant.ScalaTool -->
@@ -191,10 +203,35 @@ TODO:
</touch>
</target>
- <target name="init" depends="boot">
+ <target name="init.git" depends="boot">
+ <!-- replacestarr needs git.commit.sha, but doesn't want to run the init target (it computes maven.version.number) -->
+ <exec osfamily="unix" executable="tools/get-scala-commit-sha" outputproperty="git.commit.sha" failifexecutionfails="false" />
+ <exec osfamily="windows" executable="cmd.exe" outputproperty="git.commit.sha" failifexecutionfails="false">
+ <arg value="/c"/>
+ <arg value="tools\get-scala-commit-sha.bat"/>
+ <arg value="-p"/>
+ </exec>
+ <exec osfamily="unix" executable="tools/get-scala-commit-date" outputproperty="git.commit.date" failifexecutionfails="false" />
+ <exec osfamily="windows" executable="cmd.exe" outputproperty="git.commit.date" failifexecutionfails="false">
+ <arg value="/c"/>
+ <arg value="tools\get-scala-commit-date.bat"/>
+ <arg value="-p"/>
+ </exec>
+
+ <!-- some default in case something went wrong getting the revision -->
+ <property name="git.commit.sha" value="unknown"/>
+ <property name="git.commit.date" value="unknown"/>
+ </target>
+
+ <target name="init" depends="init.git">
<!-- Set up Ant contrib tasks so we can use <if><then><else> instead of the clunky `unless` attribute -->
<taskdef resource="net/sf/antcontrib/antlib.xml" classpath="${lib-ant.dir}/ant-contrib.jar"/>
+ <property name="scala.ant.min.version" value="1.8.2"/>
+ <if><not><antversion atleast="${scala.ant.min.version}"/></not>
+ <then><fail message="Ant version ${scala.ant.min.version} is required. You are running ${ant.version}"/></then>
+ </if>
+
<!-- Add our maven ant tasks -->
<path id="maven-ant-tasks.classpath" path="${lib-ant.dir}/maven-ant-tasks-2.1.1.jar" />
<typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="urn:maven-artifact-ant" classpathref="maven-ant-tasks.classpath" />
@@ -217,6 +254,7 @@ TODO:
<artifact:dependencies pathId="junit.classpath" filesetId="junit.fileset">
<dependency groupId="junit" artifactId="junit" version="${junit.version}"/>
</artifact:dependencies>
+ <copy-deps project="junit"/>
<!-- Pax runner -->
<property name="pax.exam.version" value="2.6.0"/>
@@ -235,38 +273,69 @@ TODO:
</artifact:dependencies>
- <artifact:dependencies pathId="partest.extras.classpath" filesetId="partest.extras.fileset" versionsId="partest.extras.versions">
- <dependency groupId="com.googlecode.java-diff-utils" artifactId="diffutils" version="1.3.0"/>
+ <artifact:remoteRepository id="extra-repo" url="${extra.repo.url}"/>
+
+ <!-- TODO: delay until absolutely necessary to allow minimal build, also move out partest dependency from scaladoc -->
+ <artifact:dependencies pathId="partest.classpath" filesetId="partest.fileset" versionsId="partest.versions">
+ <!-- uncomment the following if you're deploying your own partest locally -->
+ <!-- <localRepository path="${user.home}/.m2/repository"/> -->
+ <!-- so we don't have to wait for artifacts to synch to maven central
+ (we don't distribute partest with Scala, so the risk of sonatype and maven being out of synch is irrelevant):
+ -->
+ <artifact:remoteRepository refid="extra-repo"/>
+ <dependency groupId="org.scala-lang.modules" artifactId="scala-partest_${scala.binary.version}" version="${partest.version.number}" />
</artifact:dependencies>
+ <copy-deps project="partest"/>
+
+ <artifact:dependencies pathId="scalacheck.classpath" filesetId="scalacheck.fileset" versionsId="scalacheck.versions">
+ <artifact:remoteRepository refid="extra-repo"/>
+ <dependency groupId="org.scalacheck" artifactId="scalacheck_${scala.binary.version}" version="${scalacheck.version.number}" />
+ </artifact:dependencies>
+
+ <artifact:dependencies pathId="repl.deps.classpath" filesetId="repl.fileset" versionsId="repl.deps.versions">
+ <dependency groupId="jline" artifactId="jline" version="${jline.version}"/>
+ </artifact:dependencies>
+ <copy-deps project="repl"/>
+
+ <!-- used by the test.osgi target to create osgi bundles for the xml, parser-combinator jars
+ must specify sourcesFilesetId, javadocFilesetId to download these types of artifacts -->
+ <artifact:dependencies pathId="external-modules.deps.classpath" sourcesFilesetId="external-modules.sources.fileset" javadocFilesetId="external-modules.javadoc.fileset">
+ <artifact:remoteRepository refid="extra-repo"/>
+ <dependency groupId="org.scala-lang.modules" artifactId="scala-xml_${scala.binary.version}" version="${scala-xml.version.number}"/>
+ <dependency groupId="org.scala-lang.modules" artifactId="scala-parser-combinators_${scala.binary.version}" version="${scala-parser-combinators.version.number}"/>
+ </artifact:dependencies>
+
+ <!-- External modules, excluding the core -->
+ <path id="external-modules-nocore">
+ <restrict>
+ <path refid="external-modules.deps.classpath"/>
+ <rsel:not><rsel:or>
+ <rsel:name name="scala-library*.jar"/>
+ <rsel:name name="scala-reflect*.jar"/>
+ <rsel:name name="scala-compiler*.jar"/>
+ </rsel:or></rsel:not>
+ </restrict>
+ </path>
+ <copy-deps refid="external-modules-nocore" project="scaladoc"/>
+
+ <propertyForCrossedArtifact name="scala-parser-combinators" jar="org.scala-lang.modules:scala-parser-combinators"/>
+ <propertyForCrossedArtifact name="scala-xml" jar="org.scala-lang.modules:scala-xml"/>
<!-- BND support -->
<typedef resource="aQute/bnd/ant/taskdef.properties" classpathref="extra.tasks.classpath" />
- <artifact:remoteRepository id="extra-repo" url="${extra.repo.url}"/>
-
- <!-- Download STARR via maven if `starr.use.released` is set,
- and `starr.version` is specified (see the starr.number properties file).
- Want to slow down STARR changes, using only released versions. -->
- <if><isset property="starr.use.released"/><then>
- <echo message="Using Scala ${starr.version} for STARR."/>
- <artifact:dependencies pathId="starr.core.path">
- <artifact:remoteRepository refid="extra-repo"/>
- <dependency groupId="org.scala-lang" artifactId="scala-library" version="${starr.version}"/>
- <dependency groupId="org.scala-lang" artifactId="scala-reflect" version="${starr.version}"/>
- <dependency groupId="org.scala-lang" artifactId="scala-compiler" version="${starr.version}"/>
- </artifact:dependencies></then>
- <else>
- <path id="starr.core.path">
- <pathelement location="${library.starr.jar}"/>
- <pathelement location="${reflect.starr.jar}"/>
- <pathelement location="${compiler.starr.jar}"/>
- <pathelement location="${msil.starr.jar}"/>
- </path></else>
- </if>
+ <echo message="Using Scala ${starr.version} for STARR."/>
+ <artifact:dependencies pathId="starr.compiler.path">
+ <artifact:remoteRepository refid="extra-repo"/>
+ <dependency groupId="org.scala-lang" artifactId="scala-library" version="${starr.version}"/>
+ <dependency groupId="org.scala-lang" artifactId="scala-reflect" version="${starr.version}"/>
+ <dependency groupId="org.scala-lang" artifactId="scala-compiler" version="${starr.version}"/>
+ </artifact:dependencies>
<property name="maven-deps-done" value="yep!"/>
</then></if>
+
<!-- NOTE: ant properties are write-once: second writes are silently discarded; the logic below relies on this -->
<!-- Compute defaults (i.e., if not specified on command-line) for OSGi/maven version suffixes.
@@ -310,24 +379,6 @@ TODO:
<property name="osgi.version.suffix" value="${maven.version.suffix}"/>
<property name="version.suffix" value="${maven.version.suffix}"/></else></if>
-
- <exec osfamily="unix" executable="tools/get-scala-commit-sha" outputproperty="git.commit.sha" failifexecutionfails="false" />
- <exec osfamily="windows" executable="cmd.exe" outputproperty="git.commit.sha" failifexecutionfails="false">
- <arg value="/c"/>
- <arg value="tools\get-scala-commit-sha.bat"/>
- <arg value="-p"/>
- </exec>
- <exec osfamily="unix" executable="tools/get-scala-commit-date" outputproperty="git.commit.date" failifexecutionfails="false" />
- <exec osfamily="windows" executable="cmd.exe" outputproperty="git.commit.date" failifexecutionfails="false">
- <arg value="/c"/>
- <arg value="tools\get-scala-commit-date.bat"/>
- <arg value="-p"/>
- </exec>
-
- <!-- some default in case something went wrong getting the revision -->
- <property name="git.commit.sha" value="unknown"/>
- <property name="git.commit.date" value="unknown"/>
-
<!-- We use the git describe to determine the OSGi modifier for our build. -->
<property name="maven.version.number"
value="${version.major}.${version.minor}.${version.patch}${maven.version.suffix}"/>
@@ -363,7 +414,7 @@ TODO:
</then></if>
<!-- Allow this to be overridden simply -->
- <property name="sbt.latest.version" value="0.12.2"/>
+ <property name="sbt.latest.version" value="0.12.4"/>
<property name="sbt.src.dir" value="${build-sbt.dir}/${sbt.latest.version}/src"/>
<property name="sbt.lib.dir" value="${build-sbt.dir}/${sbt.latest.version}/lib"/>
@@ -378,7 +429,7 @@ TODO:
<property name="scalac.args" value=""/>
<property name="javac.args" value=""/>
- <property name="scalac.args.always" value="" />
+ <property name="scalac.args.always" value="-feature" />
<property name="scalac.args.optimise" value=""/> <!-- scalac.args.optimise is selectively overridden in certain antcall tasks. -->
<property name="scalac.args.all" value="${scalac.args.always} ${scalac.args} ${scalac.args.optimise}"/>
<property name="scalac.args.locker" value="${scalac.args.all}"/>
@@ -455,27 +506,128 @@ TODO:
<echo message="canonical suffix: ${version.suffix}" /> -->
<fail unless="version.suffixes.consistent" message="Version suffixes inconsistent!"/>
+
+ <!-- used during releases to bump versions in versions.properties -->
+ <if><isset property="update.versions"/><then>
+ <echo message="Updating `versions.properties`:"/>
+ <echo message=" starr.version = ${starr.version}"/>
+ <echo message=" scala.binary.version = ${scala.binary.version}"/>
+ <echo message=" partest.version.number = ${partest.version.number}"/>
+ <echo message=" scala-xml.version.number = ${scala-xml.version.number}"/>
+ <echo message=" scala-parser-combinators.version.number = ${scala-parser-combinators.version.number}"/>
+ <echo message=" scalacheck.version.number = ${scalacheck.version.number}"/>
+
+ <propertyfile file="versions.properties">
+ <entry key="starr.version" value="${starr.version}"/>
+ <entry key="scala.binary.version" value="${scala.binary.version}"/>
+ <entry key="partest.version.number" value="${partest.version.number}"/>
+ <entry key="scala-xml.version.number" value="${scala-xml.version.number}"/>
+ <entry key="scala-parser-combinators.version.number" value="${scala-parser-combinators.version.number}"/>
+ <entry key="scalacheck.version.number" value="${scalacheck.version.number}"/>
+ </propertyfile>
+ </then></if>
+
<path id="forkjoin.classpath" path="${build-libs.dir}/classes/forkjoin"/>
- <path id="fjbg.classpath" path="${build-libs.dir}/classes/fjbg"/>
<path id="asm.classpath" path="${build-asm.dir}/classes"/>
<property name="forkjoin-classes" refid="forkjoin.classpath"/>
- <property name="fjbg-classes" refid="fjbg.classpath"/>
<property name="asm-classes" refid="asm.classpath"/>
- <!-- Compilers to use for the various stages.
+ <!-- the following properties fully define staged-docs, staged-pack, make-bundle, copy-bundle and mvn-package for each of the projects -->
+ <property name="library.description" value="Scala Standard Library"/>
+ <property name="library.docroot" value="rootdoc.txt"/>
+ <property name="library.skipPackages" value="scala.concurrent.impl"/>
+
+ <property name="reflect.description" value="Scala Reflection Library"/>
+ <property name="reflect.skipPackages" value="scala.reflect.macros.internal:scala.reflect.internal:scala.reflect.io"/>
+
+ <property name="compiler.description" value="Scala Compiler"/>
+ <property name="compiler.docroot" value="rootdoc.txt"/>
+
+ <!-- these are not used used, preparation for the 'TODO modularize compiler' task -->
+ <property name="interactive.description" value="Scala Interactive Compiler" />
+ <property name="interactive.package" value="modules." />
+ <property name="interactive.name" value="scala-compiler-interactive"/>
+ <property name="interactive.namesuffix" value="_${scala.binary.version}"/>
+ <property name="interactive.version" value="${scala-compiler-interactive.version.number}"/>
+ <property name="interactive.targetjar" value="scala-compiler-interactive_${scala.binary.version}-${scala-compiler-interactive.version.number}.jar"/>
+
+ <property name="scaladoc.description" value="Scala Documentation Generator"/>
+ <property name="scaladoc.package" value="modules." />
+ <property name="scaladoc.name" value="scala-compiler-doc" />
+ <property name="scaladoc.namesuffix" value="_${scala.binary.version}"/>
+ <property name="scaladoc.version" value="${scala-compiler-doc.version.number}"/>
+ <property name="scaladoc.targetjar" value="scala-compiler-doc_${scala.binary.version}-${scala-compiler-doc.version.number}.jar"/>
+
+ <property name="actors.description" value="Scala Actors Library"/>
+
+ <property name="continuations-plugin.description" value="Scala Delimited Continuations Compiler Plugin"/>
+ <property name="continuations-plugin.package" value="plugins." />
+ <property name="continuations-plugin.dir" value="plugins/"/>
+ <property name="continuations-plugin.name" value="continuations"/>
+ <property name="continuations-plugin.targetdir" value="misc/scala-devel/plugins"/>
+ <property name="continuations-plugin.srcdir" value="continuations/plugin"/>
+
+ <property name="continuations-library.description" value="Scala Delimited Continuations Library"/>
+ <property name="continuations-library.srcdir" value="continuations/library"/>
+
+ <property name="swing.description" value="Scala Swing Library"/>
+
+ <property name="parser-combinators.description" value="Scala Parser Combinators Library"/>
+ <property name="parser-combinators.package" value="modules."/>
+ <property name="parser-combinators.jar" value="${scala-parser-combinators}"/>
+ <property name="parser-combinators.src" value="false"/>
+ <property name="parser-combinators.srcjar" value="${scala-parser-combinators-sources}"/>
+
+ <property name="xml.description" value="Scala XML Library"/>
+ <property name="xml.package" value="modules."/>
+ <property name="xml.jar" value="${scala-xml}"/>
+ <property name="xml.src" value="false"/>
+ <property name="xml.srcjar" value="${scala-xml-sources}"/>
+
+ <property name="scalap.description" value="Scala Bytecode Parser"/>
+ <property name="scalap.targetjar" value="scalap.jar"/>
+
+ <property name="partest.description" value="Scala Compiler Testing Tool"/>
+ <property name="partest-extras.description" value="Scala Compiler Testing Tool (compiler-specific extras)"/>
+ <property name="partest-javaagent.description" value="Scala Compiler Testing Tool (compiler-specific java agent)"/>
+
+ <!-- projects without project-specific options: asm, forkjoin, manual, bin, repl -->
+ <for list="actors,compiler,interactive,scaladoc,continuations-library,continuations-plugin,library,parser-combinators,partest,partest-extras,partest-javaagent,reflect,scalap,swing,xml" param="project">
+ <sequential>
+ <!-- description is mandatory -->
+ <init-project-prop project="@{project}" name="package" default=""/>
+ <init-project-prop project="@{project}" name="dir" default=""/>
+ <init-project-prop project="@{project}" name="name" default="scala-@{project}"/>
+ <init-project-prop project="@{project}" name="namesuffix" default=""/>
+ <init-project-prop project="@{project}" name="version" default="${osgi.version.number}"/>
+ <init-project-prop project="@{project}" name="targetdir" default="lib"/>
+ <init-project-prop project="@{project}" name="targetjar" default="${@{project}.name}.jar"/>
+ <init-project-prop project="@{project}" name="jar" default="${build-pack.dir}/${@{project}.targetdir}/${@{project}.targetjar}" />
+ <init-project-prop project="@{project}" name="docroot" default="NOT SET"/>
+ <init-project-prop project="@{project}" name="skipPackages" default=""/>
+ <init-project-prop project="@{project}" name="srcdir" default="@{project}"/>
+ <init-project-prop project="@{project}" name="src" default="true"/>
+ <init-project-prop project="@{project}" name="srcjar" default="${build-osgi.dir}/${@{project}.name}-src.jar"/>
+ </sequential>
+ </for>
+
+ <!-- Compilers to use for the various stages.
There must be a variable of the shape @{stage}.compiler.path for all @{stage} in starr, locker, quick, strap.
-->
- <path id="starr.compiler.path">
- <path refid="starr.core.path"/>
- <pathelement location="${lib.dir}/forkjoin.jar"/>
- <path refid="aux.libs"/>
- </path>
+
+ <!-- starr is resolved (to starr.compiler.path) in the block protected by maven-deps-done
+ the maven task must not be executed twice, or you get a java.lang.ClassCastException:
+ org.apache.maven.artifact.ant.RemoteRepository cannot be cast to org.apache.maven.artifact.ant.Repository
+ -->
<!-- To skip locker, use -Dlocker.skip=1 -->
<if><isset property="locker.skip"/><then>
<echo message="Using STARR to build the quick stage (skipping locker)."/>
<path id="locker.compiler.path" refid="starr.compiler.path"/>
+ <!-- this is cheating (we don't know the classpath used to build starr)
+ but should be close enough: -->
+ <path id="locker.compiler.build.path" refid="starr.compiler.path"/>
<property name="locker.locked" value="locker skipped"/></then>
<else>
<path id="locker.compiler.path"><path refid="locker.compiler.build.path"/></path></else></if>
@@ -489,7 +641,9 @@ TODO:
There must be a variable of the shape @{stage}.@{project}.build.path
for all @{stage} in locker, quick, strap
and all @{project} in library, reflect, compiler
- when stage is quick, @{project} also includes: actors, swing, plugins, scalacheck, partest, scalap
+ when stage is quick, @{project} also includes: actors, repl, swing, continuations-plugin, continuations-library, scalap
+
+ NOTE: interactive, scaladoc, are only used upto quick; they are still packed into the compiler jar
-->
<!-- LOCKER -->
@@ -499,31 +653,19 @@ TODO:
<path refid="aux.libs"/>
</path>
- <path id="locker.actors.build.path">
- <path refid="locker.library.build.path"/>
- <pathelement location="${build-locker.dir}/classes/actors"/>
- </path>
-
- <path id="locker.msil.build.path">
- <path refid="locker.compiler.build.path"/>
- <pathelement location="${build-locker.dir}/classes/msil"/>
- </path>
-
<path id="locker.reflect.build.path">
<path refid="locker.library.build.path"/>
<pathelement location="${build-locker.dir}/classes/reflect"/>
</path>
+ <if><not><isset property="locker.skip"/></not><then>
<path id="locker.compiler.build.path">
<path refid="locker.reflect.build.path"/>
<pathelement location="${build-locker.dir}/classes/compiler"/>
- <pathelement location="${build-locker.dir}/classes/msil"/>
<path refid="asm.classpath"/>
- <path refid="fjbg.classpath"/>
- <pathelement location="${jline.jar}"/>
</path>
-
- <path id="locker.msil.build.path" refid="locker.compiler.build.path"/>
+ </then></if>
+ <!-- else, locker.compiler.build.path is set above -->
<!-- QUICK -->
<path id="quick.library.build.path">
@@ -542,84 +684,89 @@ TODO:
<pathelement location="${build-quick.dir}/classes/reflect"/>
</path>
- <path id="quick.msil.build.path">
- <path refid="quick.compiler.build.path"/>
- <pathelement location="${build-quick.dir}/classes/msil"/>
- </path>
-
<path id="quick.compiler.build.path">
<path refid="quick.reflect.build.path"/>
<pathelement location="${build-quick.dir}/classes/compiler"/>
- <pathelement location="${build-quick.dir}/classes/msil"/>
<path refid="asm.classpath"/>
- <path refid="fjbg.classpath"/>
- <pathelement location="${jline.jar}"/>
+ </path>
+
+ <path id="quick.repl.build.path">
+ <path refid="quick.compiler.build.path"/>
+ <pathelement location="${build-quick.dir}/classes/repl"/>
+ <path refid="repl.deps.classpath"/>
</path>
<path id="quick.swing.build.path">
<path refid="quick.library.build.path"/>
- <path refid="quick.actors.build.path"/>
<pathelement location="${build-quick.dir}/classes/swing"/>
</path>
- <path id="quick.plugins.build.path">
- <path refid="quick.compiler.build.path"/>
+ <path id="quick.continuations-plugin.build.path">
+ <!-- plugins are run by locker compiler during quick stage,
+ so must compile against the same classes the locker was compiled to
+ -->
+ <path refid="locker.compiler.build.path"/>
<pathelement location="${build-quick.dir}/classes/continuations-plugin"/>
</path>
- <path id="quick.scalacheck.build.path">
- <pathelement location="${build-quick.dir}/classes/library"/>
- <pathelement location="${build-quick.dir}/classes/actors"/>
- <pathelement location="${build-quick.dir}/classes/scalacheck"/>
- </path>
-
<path id="quick.scalap.build.path">
<path refid="quick.compiler.build.path"/>
<pathelement location="${build-quick.dir}/classes/scalap"/>
- <pathelement location="${build-quick.dir}/classes/partest"/>
</path>
- <path id="quick.partest.build.path">
- <path refid="quick.scalap.build.path"/>
- <path refid="partest.extras.classpath"/>
- <pathelement location="${scalacheck.jar}"/>
+ <path id="quick.partest-extras.build.path">
+ <path refid="asm.classpath"/>
+ <path refid="partest.classpath"/>
+ <path refid="quick.compiler.build.path"/>
+ <pathelement location="${build-quick.dir}/classes/repl"/>
+ <!-- for the java dependency: Profiler.java -->
+ <pathelement location="${build-quick.dir}/classes/partest-extras"/>
+ </path>
+
+ <path id="quick.partest-javaagent.build.path">
+ <path refid="asm.classpath"/>
+ </path>
+
+ <path id="quick.scaladoc.build.path">
+ <path refid="quick.compiler.build.path"/>
+ <path refid="partest.classpath"/>
+ <path refid="external-modules-nocore"/>
+ <pathelement location="${build-quick.dir}/classes/scaladoc"/>
+ </path>
+
+ <path id="quick.interactive.build.path">
+ <path refid="quick.compiler.build.path"/>
+ <pathelement location="${build-quick.dir}/classes/interactive"/>
</path>
<path id="quick.bin.tool.path">
- <pathelement location="${build-quick.dir}/classes/library"/>
- <pathelement location="${build-quick.dir}/classes/actors"/>
- <pathelement location="${build-quick.dir}/classes/reflect"/>
- <pathelement location="${build-quick.dir}/classes/compiler"/>
- <pathelement location="${build-quick.dir}/classes/msil"/>
+ <path refid="quick.repl.build.path"/>
+ <path refid="quick.actors.build.path"/>
<pathelement location="${build-quick.dir}/classes/scalap"/>
<pathelement location="${build-quick.dir}/classes/continuations-library"/>
- <pathelement location="${jline.jar}"/>
- <path refid="asm.classpath"/>
- <path refid="forkjoin.classpath"/>
- <path refid="aux.libs"/>
- </path>
+ <path refid="external-modules-nocore"/>
+ </path>
<!-- PACK -->
- <!-- also used for docs.* targets TODO: use separate paths for those -->
<path id="pack.compiler.path">
- <pathelement location="${build-pack.dir}/lib/scala-library.jar"/>
- <pathelement location="${build-pack.dir}/lib/scala-reflect.jar"/>
- <pathelement location="${build-pack.dir}/lib/scala-compiler.jar"/>
- <pathelement location="${build-pack.dir}/lib/scala-partest.jar"/>
- <pathelement location="${build-pack.dir}/lib/scalap.jar"/>
- <pathelement location="${build-pack.dir}/lib/scala-actors.jar"/>
+ <pathelement location="${library.jar}"/>
+ <pathelement location="${reflect.jar}"/>
+ <pathelement location="${compiler.jar}"/>
<pathelement location="${ant.jar}"/>
- <pathelement location="${jline.jar}"/>
- <path refid="partest.extras.classpath"/>
+ <path refid="forkjoin.classpath"/>
<path refid="aux.libs"/>
</path>
<path id="pack.bin.tool.path">
- <pathelement location="${build-pack.dir}/lib/scala-library.jar"/>
- <pathelement location="${build-pack.dir}/lib/scala-reflect.jar"/>
- <pathelement location="${build-pack.dir}/lib/scala-compiler.jar"/>
- <pathelement location="${build-pack.dir}/lib/scalap.jar"/>
- <pathelement location="${build-pack.dir}/lib/jline.jar"/>
+ <pathelement location="${library.jar}"/>
+ <pathelement location="${xml.jar}"/>
+ <pathelement location="${parser-combinators.jar}"/>
+ <pathelement location="${actors.jar}"/>
+ <pathelement location="${reflect.jar}"/>
+ <pathelement location="${compiler.jar}"/>
+ <!-- TODO modularize compiler: <pathelement location="${scaladoc.jar}"/> -->
+ <pathelement location="${scalap.jar}"/>
+ <path refid="repl.deps.classpath"/>
<path refid="aux.libs"/>
</path>
@@ -635,29 +782,27 @@ TODO:
<path id="pack.compiler.files">
<fileset dir="${build-quick.dir}/classes/compiler"/>
- <fileset dir="${build-quick.dir}/classes/msil"/>
+
+ <!-- TODO modularize compiler. Remove the other class dirs as soon as they become modules -->
+ <fileset dir="${build-quick.dir}/classes/scaladoc"/>
+ <fileset dir="${build-quick.dir}/classes/interactive"/>
+ <fileset dir="${build-quick.dir}/classes/repl"/>
<fileset dir="${asm-classes}"/>
- <fileset dir="${fjbg-classes}"/>
</path>
+ <!-- TODO modularize compiler.
+ <path id="pack.scaladoc.files"> <fileset dir="${build-quick.dir}/classes/scaladoc"/> </path>
+ <path id="pack.interactive.files"><fileset dir="${build-quick.dir}/classes/interactive"/> </path>
+ -->
+
<path id="pack.swing.files"> <fileset dir="${build-quick.dir}/classes/swing"/> </path>
<path id="pack.reflect.files"> <fileset dir="${build-quick.dir}/classes/reflect"/> </path>
- <path id="pack.plugins.files"> <fileset dir="${build-quick.dir}/classes/continuations-plugin"/> </path>
- <path id="pack.scalacheck.files"> <fileset dir="${build-quick.dir}/classes/scalacheck"/> </path>
+ <path id="pack.continuations-plugin.files"> <fileset dir="${build-quick.dir}/classes/continuations-plugin"/> </path>
<path id="pack.scalap.files"> <fileset dir="${build-quick.dir}/classes/scalap"/>
<fileset file="${src.dir}/scalap/decoder.properties"/> </path>
- <path id="pack.partest.files">
- <fileset dir="${build-quick.dir}/classes/partest">
- <exclude name="scala/tools/partest/javaagent/**"/>
- </fileset>
- </path>
-
- <path id="pack.partest-javaagent.files">
- <fileset dir="${build-quick.dir}/classes/partest">
- <include name="scala/tools/partest/javaagent/**"/>
- </fileset>
- </path>
+ <path id="pack.partest-extras.files"> <fileset dir="${build-quick.dir}/classes/partest-extras"/> </path>
+ <path id="pack.partest-javaagent.files"> <fileset dir="${build-quick.dir}/classes/partest-javaagent"/> </path>
<!-- STRAP -->
<path id="strap.library.build.path">
@@ -666,11 +811,6 @@ TODO:
<path refid="aux.libs"/>
</path>
- <path id="strap.msil.build.path">
- <path refid="strap.compiler.build.path"/>
- <pathelement location="${build-strap.dir}/classes/msil"/>
- </path>
-
<path id="strap.reflect.build.path">
<path refid="strap.library.build.path"/>
<pathelement location="${build-strap.dir}/classes/reflect"/>
@@ -679,37 +819,117 @@ TODO:
<path id="strap.compiler.build.path">
<path refid="strap.reflect.build.path"/>
<pathelement location="${build-strap.dir}/classes/compiler"/>
- <pathelement location="${build-strap.dir}/classes/msil"/>
<path refid="asm.classpath"/>
- <path refid="fjbg.classpath"/>
- <pathelement location="${jline.jar}"/>
+ </path>
+
+ <!-- DOCS -->
+ <path id="docs.library.build.path"> <path refid="quick.library.build.path"/> </path>
+ <path id="docs.reflect.build.path"> <path refid="quick.reflect.build.path"/> </path>
+ <path id="docs.compiler.build.path"> <path refid="quick.compiler.build.path"/> </path>
+ <path id="docs.scaladoc.build.path"> <path refid="quick.scaladoc.build.path"/> </path>
+ <path id="docs.interactive.build.path"> <path refid="quick.interactive.build.path"/> </path>
+ <path id="docs.scalap.build.path"> <path refid="quick.scalap.build.path"/> </path>
+ <path id="docs.continuations-plugin.build.path"> <path refid="quick.continuations-plugin.build.path"/> </path>
+ <path id="docs.continuations-library.build.path"> <path refid="quick.continuations-plugin.build.path"/> </path>
+ <path id="docs.actors.build.path"> <path refid="quick.actors.build.path"/> </path>
+ <path id="docs.swing.build.path"> <path refid="quick.swing.build.path"/> </path>
+
+ <!-- run-time classpath for scaladoc TODO: resolve through maven -->
+ <path id="scaladoc.classpath">
+ <path refid="external-modules-nocore"/>
+ <pathelement location="${library.jar}"/>
+ <pathelement location="${reflect.jar}"/>
+ <pathelement location="${compiler.jar}"/>
+
+ <!-- TODO modularize compiler
+ <pathelement location="${interactive.jar}"/>
+ <pathelement location="${scaladoc.jar}"/>
+ -->
+
+ <pathelement location="${ant.jar}"/>
+ <path refid="aux.libs"/>
+ </path>
+
+ <path id="manual.build.path">
+ <path refid="external-modules-nocore"/> <!-- xml -->
+ <pathelement location="${library.jar}"/>
+ <pathelement location="${build.dir}/manmaker/classes"/>
+ <path refid="aux.libs"/> <!-- for ant -->
</path>
<!-- MISC -->
<path id="sbt.compile.build.path">
- <path refid="quick.compiler.build.path"/>
+ <path refid="scaladoc.classpath"/>
+ <!-- TODO modularize compiler: bring back when repl leaves compiler jar
+ <pathelement location="${build-quick.dir}/classes/repl"/>
+ -->
<pathelement location="${sbt.interface.jar}"/>
</path>
- <path id="manual.classpath">
- <pathelement location="${build-pack.dir}/lib/scala-library.jar"/>
- <pathelement location="${build.dir}/manmaker/classes"/>
- </path>
- <path id="partest.classpath">
- <path refid="pack.compiler.path"/>
- <path refid="partest.extras.classpath"/>
+ <!--
+ This is the classpath used to run partest, which is what it uses to run the compiler and find other required jars.
+ "What's on the compiler's compilation path when compiling partest tests," you ask?
+ Why, the compiler we're testing, of course, and partest with all its dependencies.
+ -->
+ <path id="partest.compilation.path">
+ <path refid="partest.compilation.path.core"/>
+ <path refid="partest.compilation.path.noncore"/>
</path>
+ <path id="partest.compilation.path.core">
+ <pathelement location="${library.jar}"/>
+ <pathelement location="${reflect.jar}"/>
+ <pathelement location="${compiler.jar}"/>
+ </path>
+ <path id="partest.compilation.path.noncore">
+
+ <!-- TODO modularize compiler
+ <pathelement location="${scaladoc.jar}"/>
+ <pathelement location="${interactive.jar}"/>
+ -->
- <path id="partest.build.path">
- <path refid="pack.compiler.path"/>
+ <!-- TODO: move scalap & actors out of repo -->
+ <pathelement location="${scalap.jar}"/>
+ <pathelement location="${actors.jar}"/>
+
+ <!-- partest's dependencies, which marks most of its dependencies as provided,
+ (but not scala-library, so we filter that one out...)
+ so we provide them: scala-[library/reflect/compiler], scalap built here,
+ scala-xml, scala-parser-combinators via external-modules-nocore,
+ scalacheck as part of `partest.classpath` -->
+ <restrict>
+ <path refid="partest.classpath"/>
+ <rsel:not><rsel:or>
+ <rsel:name name="scala-library*.jar"/>
+ </rsel:or></rsel:not>
+ </restrict>
+ <pathelement location="${scala-xml}"/>
+ <pathelement location="${scala-parser-combinators}"/>
+
+ <restrict>
+ <path refid="scalacheck.classpath"/>
+ <rsel:not><rsel:or>
+ <rsel:name name="scala-library*.jar"/>
+ <rsel:name name="scala-compiler*.jar"/>
+ <rsel:name name="scala-reflect*.jar"/>
+ <rsel:name name="scala-actors*.jar"/>
+ <rsel:name name="scala-parser-combinators*.jar"/>
+ <rsel:name name="scala-xml*.jar"/>
+ </rsel:or></rsel:not>
+ </restrict>
+
+ <!-- partest classes specific to the core compiler build -->
+ <pathelement location="${partest-extras.jar}"/>
+ <pathelement location="${partest-javaagent.jar}"/>
+
+ <!-- sneaky extras used in tests -->
<fileset dir="${partest.dir}/files/lib" includes="*.jar" />
- <pathelement location="${pack.dir}/lib/scala-swing.jar"/> <!-- TODO - segregate swing tests (there can't be many) -->
</path>
<path id="test.junit.compiler.build.path">
<pathelement location="${test.junit.classes}"/>
<path refid="quick.compiler.build.path"/>
+ <path refid="quick.repl.build.path"/>
<path refid="junit.classpath"/>
</path>
@@ -723,20 +943,9 @@ TODO:
<path refid="forkjoin.classpath"/>
</path>
- <path id="palo.bin.tool.path">
- <pathelement location="${build-palo.dir}/lib/scala-library.jar"/>
- <pathelement location="${build-palo.dir}/lib/scala-reflect.jar"/>
- <pathelement location="${build-palo.dir}/lib/scala-compiler.jar"/>
- <pathelement location="${build-palo.dir}/lib/jline.jar"/>
- </path>
-
<path id="test.positions.sub.build.path" path="${build-quick.dir}/classes/library"/>
<!-- TODO: consolidate *.includes -->
- <patternset id="partest.includes">
- <include name="**/*.xml"/>
- </patternset>
-
<patternset id="lib.includes">
<include name="**/*.tmpl"/>
<include name="**/*.xml"/>
@@ -773,381 +982,57 @@ TODO:
=============================================================================-->
<target name="libs.clean"> <clean build="libs"/> <clean build="asm"/> </target>
<target name="quick.clean" depends="libs.clean"> <clean build="quick"/> <clean build="pack"/> <clean build="strap"/> </target>
- <target name="palo.clean" depends="quick.clean"> <clean build="palo"/> </target>
- <target name="locker.clean" depends="palo.clean"> <clean build="locker"/> </target>
+ <target name="locker.clean" depends="quick.clean"> <clean build="locker"/> </target>
<target name="docs.clean"> <clean build="docs"/> <delete dir="${build.dir}/manmaker" includeemptydirs="yes" quiet="yes" failonerror="no"/> </target>
<target name="dist.clean"> <delete dir="${dists.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/> </target>
- <target name="all.clean" depends="locker.clean, docs.clean"> <clean build="sbt"/> <clean build="osgi"/> </target>
+ <target name="junit.clean"> <clean build="junit"/> </target>
+
+ <target name="all.clean" depends="locker.clean, docs.clean, junit.clean">
+ <clean build="sbt"/> <clean build="osgi"/>
+ </target>
<!-- Used by the scala-installer script -->
<target name="allallclean" depends="all.clean, dist.clean"/>
- <macrodef name="clean">
- <attribute name="build"/>
- <sequential>
- <delete dir="${build-@{build}.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/>
- </sequential>
- </macrodef>
-
<!-- ===========================================================================
LOCAL DEPENDENCIES
============================================================================ -->
- <macrodef name="simple-javac" >
- <attribute name="project"/> <!-- project: fjbg/asm/forkjoin -->
- <attribute name="args" default=""/>
- <attribute name="jar" default="yes"/>
- <sequential>
- <uptodate property="@{project}.available" targetfile="${build-libs.dir}/@{project}.complete">
- <srcfiles dir="${src.dir}/@{project}"/></uptodate>
- <if><not><isset property="@{project}.available"/></not><then>
- <stopwatch name="@{project}.timer"/>
- <mkdir dir="${@{project}-classes}"/>
- <javac
- debug="true"
- srcdir="${src.dir}/@{project}"
- destdir="${@{project}-classes}"
- classpath="${@{project}-classes}"
- includes="**/*.java"
- target="1.6" source="1.5"
- compiler="javac1.6">
- <compilerarg line="${javac.args} @{args}"/>
- </javac>
- <if><equals arg1="@{jar}" arg2="yes"/><then>
- <jar whenmanifestonly="fail" destfile="${build-libs.dir}/@{project}.jar" basedir="${@{project}-classes}"/></then></if>
- <stopwatch name="@{project}.timer" action="total"/>
- <mkdir dir="${build-libs.dir}"/>
- <touch file="${build-libs.dir}/@{project}.complete" verbose="no"/>
- </then></if>
- </sequential>
- </macrodef>
<target name="asm.done" depends="init"> <simple-javac project="asm" jar="no"/> </target>
- <target name="fjbg.done" depends="init"> <simple-javac project="fjbg"/> </target>
<target name="forkjoin.done" depends="init"> <simple-javac project="forkjoin" args="-XDignore.symbol.file"/></target>
-<!-- ===========================================================================
- STAGED COMPILATION MACROS
-============================================================================ -->
- <macrodef name="staged-javac" >
- <attribute name="stage"/> <!-- current stage (locker, quick, strap) -->
- <attribute name="project"/> <!-- project: library/reflect/compiler/actors -->
- <attribute name="destproject" default="@{project}"/> <!-- overrides the output directory; used when building multiple projects into the same directory-->
- <attribute name="args" default=""/>
- <attribute name="excludes" default=""/>
-
- <sequential>
- <javac
- debug="true"
- srcdir="${src.dir}/@{project}"
- destdir="${build-@{stage}.dir}/classes/@{destproject}"
- includes="**/*.java"
- excludes="@{excludes}"
- target="1.6" source="1.5">
- <compilerarg line="${javac.args} @{args}"/>
- <classpath refid="@{stage}.@{destproject}.build.path"/>
- </javac>
- </sequential>
- </macrodef>
-
- <!-- Zinc assumes a one-to-one correspondence of output folder to set of source files.
- When compiling different sets of source files in multiple compilations to the same output directory,
- Zinc thinks source files that appeared in an earlier compilation but are absent in the current one,
- were deleted and thus deletes the corresponding output files.
-
- Note that zinc also requires each arg to scalac to be prefixed by -S.
+ <!-- For local development only. We only allow released versions of Scala for STARR.
+ This builds quick (core only) and publishes it with a generated version number,
+ saving it as starr.version in build.properties, so this compiler will be used as STARR in your next build
+ NOTES:
+ - to speed things up, you can also pass -Dlocker.skip=1
-->
- <macrodef name="zinc">
- <attribute name="compilerpathref" />
- <attribute name="destdir" />
- <attribute name="srcdir" />
- <attribute name="srcpath" default="NOT SET"/> <!-- needed to compile the library, "NOT SET" is just a convention to denote an optional attribute -->
- <attribute name="buildpathref" />
- <attribute name="params" default="" />
- <attribute name="java-excludes" default=""/>
-
- <sequential>
- <local name="sources"/>
- <pathconvert pathsep=" " property="sources">
- <fileset dir="@{srcdir}">
- <include name="**/*.java"/>
- <include name="**/*.scala"/>
- <exclude name="@{java-excludes}"/>
- </fileset>
- </pathconvert>
- <local name="args"/>
- <local name="sargs"/>
- <if><not><equals arg1="@{srcpath}" arg2="NOT SET"/></not><then>
- <property name="args" value="@{params} -sourcepath @{srcpath}"/>
- </then></if>
- <property name="args" value="@{params}"/> <!-- default -->
-
- <!-- HACK: prefix scalac args by -S -->
- <script language="javascript">
- project.setProperty("sargs", project.getProperty("args").trim().replaceAll(" ", " -S"));
- </script>
-
- <exec osfamily="unix" executable="tools/zinc" failifexecutionfails="true" failonerror="true">
- <arg line="-nailed -compile-order JavaThenScala -scala-path ${ant.refid:@{compilerpathref}} -d @{destdir} -classpath ${toString:@{buildpathref}} ${sargs} ${sources}"/>
- </exec>
- </sequential>
- </macrodef>
-
- <macrodef name="staged-scalac" >
- <attribute name="with"/> <!-- will use path `@{with}.compiler.path` to locate scalac -->
- <attribute name="stage"/> <!-- current stage (locker, quick, strap) -->
- <attribute name="project"/> <!-- project: library/reflect/compiler/actors -->
- <attribute name="srcpath" default="NOT SET"/> <!-- needed to compile the library -->
- <attribute name="args" default=""/> <!-- additional args -->
- <attribute name="destproject" default="@{project}"/> <!-- overrides the output directory; used when building multiple projects into the same directory-->
- <attribute name="srcdir" default="@{project}"/>
- <attribute name="java-excludes" default=""/>
-
- <sequential>
- <!-- TODO: detect zinc anywhere on PATH
- use zinc for the quick stage if it's available;
- would use it for locker but something is iffy in sbt: get a class cast error on global phase -->
- <if><and> <available file="tools/zinc"/>
- <equals arg1="@{stage}" arg2="quick"/>
- <not><equals arg1="@{project}" arg2="plugins"/></not> <!-- doesn't work in zinc because it requires the quick compiler, which isn't jarred up-->
- </and><then>
- <zinc taskname="Z.@{stage}.@{project}"
- compilerpathref="@{with}.compiler.path"
- destdir="${build-@{stage}.dir}/classes/@{destproject}"
- srcdir="${src.dir}/@{srcdir}"
- srcpath="@{srcpath}"
- buildpathref="@{stage}.@{project}.build.path"
- params="${scalac.args.@{stage}} @{args}"
- java-excludes="@{java-excludes}"/></then>
- <else>
- <if><equals arg1="@{srcpath}" arg2="NOT SET"/><then>
- <scalacfork taskname="@{stage}.@{project}"
- jvmargs="${scalacfork.jvmargs}"
- compilerpathref="@{with}.compiler.path"
- destdir="${build-@{stage}.dir}/classes/@{destproject}"
- srcdir="${src.dir}/@{srcdir}"
- params="${scalac.args.@{stage}} @{args}">
- <include name="**/*.scala"/>
- <compilationpath refid="@{stage}.@{project}.build.path"/></scalacfork></then>
- <else>
- <scalacfork taskname="@{stage}.@{project}"
- jvmargs="${scalacfork.jvmargs}"
- compilerpathref="@{with}.compiler.path"
- destdir="${build-@{stage}.dir}/classes/@{destproject}"
- srcdir="${src.dir}/@{srcdir}"
- srcpath="@{srcpath}"
- params="${scalac.args.@{stage}} @{args}">
- <include name="**/*.scala"/>
- <compilationpath refid="@{stage}.@{project}.build.path"/></scalacfork></else>
- </if>
- </else></if>
- </sequential>
- </macrodef>
-
- <macrodef name="staged-uptodate" >
- <attribute name="stage"/>
- <attribute name="project"/>
- <element name="check"/>
- <element name="do"/>
-
- <sequential>
- <uptodate property="@{stage}.@{project}.available" targetfile="${build-@{stage}.dir}/@{project}.complete">
- <check/>
- </uptodate>
- <if><not><isset property="@{stage}.@{project}.available"/></not><then>
- <do/>
- <touch file="${build-@{stage}.dir}/@{project}.complete" verbose="no"/>
- </then></if>
- </sequential>
- </macrodef>
-
- <macrodef name="staged-build" >
- <attribute name="with"/> <!-- will use path `@{with}.compiler.path` to locate scalac -->
- <attribute name="stage"/> <!-- current stage (locker, quick, strap) -->
- <attribute name="project"/> <!-- project: library/reflect/compiler/actors -->
- <attribute name="srcpath" default="NOT SET"/> <!-- needed to compile the library -->
- <attribute name="args" default=""/> <!-- additional args -->
- <attribute name="includes" default="comp.includes"/>
- <attribute name="java-excludes" default=""/>
- <attribute name="version" default=""/> <!-- non-empty for partest and scaladoc: use @{version}.version.number in property file-->
-
- <sequential>
- <staged-uptodate stage="@{stage}" project="@{project}">
- <check><srcfiles dir="${src.dir}/@{project}"/></check>
- <do>
- <stopwatch name="@{stage}.@{project}.timer"/>
- <mkdir dir="${build-@{stage}.dir}/classes/@{project}"/>
- <staged-javac stage="@{stage}" project="@{project}" excludes="@{java-excludes}"/> <!-- always compile with javac for simplicity and regularity; it's cheap -->
- <staged-scalac with="@{with}" stage="@{stage}" project="@{project}" srcpath="@{srcpath}" args="@{args}" java-excludes="@{java-excludes}"/>
- <if><equals arg1="@{version}" arg2=""/><then>
- <propertyfile file = "${build-@{stage}.dir}/classes/@{project}/@{project}.properties">
- <entry key = "version.number" value="${version.number}"/>
- <entry key = "maven.version.number" value="${maven.version.number}"/>
- <entry key = "osgi.version.number" value="${osgi.version.number}"/>
- <entry key = "copyright.string" value="${copyright.string}"/>
- </propertyfile>
- </then><else>
- <propertyfile file = "${build-@{stage}.dir}/classes/@{project}/@{project}.properties">
- <entry key = "version.number" value="${@{version}.version.number}"/>
- <entry key = "copyright.string" value="${copyright.string}"/>
- </propertyfile>
- </else></if>
- <copy todir="${build-@{stage}.dir}/classes/@{project}">
- <fileset dir="${src.dir}/@{project}">
- <patternset refid="@{includes}"/>
- </fileset>
- </copy>
- <stopwatch name="@{stage}.@{project}.timer" action="total"/>
- </do>
- </staged-uptodate>
- </sequential>
- </macrodef>
-
- <macrodef name="staged-bin">
- <attribute name="stage"/>
- <attribute name="classpathref" default="NOT SET"/>
- <sequential>
- <staged-uptodate stage="@{stage}" project="bin">
- <check>
- <srcfiles dir="${src.dir}">
- <include name="compiler/scala/tools/ant/templates/**"/>
- </srcfiles>
- </check>
- <do>
- <taskdef name="mk-bin" classname="scala.tools.ant.ScalaTool" classpathref="@{stage}.bin.tool.path"/>
- <mkdir dir="${build-@{stage}.dir}/bin"/>
- <if><equals arg1="@{classpathref}" arg2="NOT SET"/><then>
- <mk-bin file="${build-@{stage}.dir}/bin/scala" class="scala.tools.nsc.MainGenericRunner" javaFlags="${java.flags}"/>
- <mk-bin file="${build-@{stage}.dir}/bin/scalac" class="scala.tools.nsc.Main" javaFlags="${java.flags}"/>
- <mk-bin file="${build-@{stage}.dir}/bin/scaladoc" class="scala.tools.nsc.ScalaDoc" javaFlags="${java.flags}"/>
- <mk-bin file="${build-@{stage}.dir}/bin/fsc" class="scala.tools.nsc.CompileClient" javaFlags="${java.flags}"/>
- <mk-bin file="${build-@{stage}.dir}/bin/scalap" class="scala.tools.scalap.Main" javaFlags="${java.flags}"/>
- </then><else>
- <mk-bin file="${build-@{stage}.dir}/bin/scala" class="scala.tools.nsc.MainGenericRunner" javaFlags="${java.flags}" classpathref="@{classpathref}"/>
- <mk-bin file="${build-@{stage}.dir}/bin/scalac" class="scala.tools.nsc.Main" javaFlags="${java.flags}" classpathref="@{classpathref}"/>
- <mk-bin file="${build-@{stage}.dir}/bin/scaladoc" class="scala.tools.nsc.ScalaDoc" javaFlags="${java.flags}" classpathref="@{classpathref}"/>
- <mk-bin file="${build-@{stage}.dir}/bin/fsc" class="scala.tools.nsc.CompileClient" javaFlags="${java.flags}" classpathref="@{classpathref}"/>
- <mk-bin file="${build-@{stage}.dir}/bin/scalap" class="scala.tools.scalap.Main" javaFlags="${java.flags}" classpathref="@{classpathref}"/>
- </else></if>
- <chmod perm="ugo+rx" file="${build-@{stage}.dir}/bin/scala"/>
- <chmod perm="ugo+rx" file="${build-@{stage}.dir}/bin/scalac"/>
- <chmod perm="ugo+rx" file="${build-@{stage}.dir}/bin/scaladoc"/>
- <chmod perm="ugo+rx" file="${build-@{stage}.dir}/bin/fsc"/>
- <chmod perm="ugo+rx" file="${build-@{stage}.dir}/bin/scalap"/>
- </do>
- </staged-uptodate>
- </sequential>
- </macrodef>
-
- <macrodef name="staged-pack">
- <attribute name="project"/>
- <attribute name="targetdir" default="lib"/>
- <attribute name="targetjar" default="scala-@{project}.jar"/>
- <attribute name="destfile" default="${build-pack.dir}/@{targetdir}/@{targetjar}"/>
- <attribute name="manifest" default=""/>
- <element name="pre" optional="true"/>
- <element name="jar-opts" optional="true"/>
-
- <sequential>
- <uptodate property="pack.@{project}.available" targetfile="@{destfile}">
- <srcresources>
- <resources refid="pack.@{project}.files"/>
- <!-- <path><pathelement location="${build-quick.dir}/@{project}.complete"/></path> -->
- </srcresources>
- </uptodate>
- <if><not><isset property="pack.@{project}.available"/></not><then>
- <mkdir dir="${build-pack.dir}/@{targetdir}"/>
- <pre/>
-
- <if><not><equals arg1="@{manifest}" arg2=""/></not><then>
- <jar whenmanifestonly="fail" destfile="@{destfile}" manifest="@{manifest}"> <!-- update="true" makes no difference on my machine, so starting from scratch-->
- <jar-opts/>
- <path refid="pack.@{project}.files"/>
- </jar></then>
- <else>
- <jar whenmanifestonly="fail" destfile="@{destfile}">
- <jar-opts/>
- <path refid="pack.@{project}.files"/>
- </jar>
- </else></if>
- </then></if>
- </sequential>
- </macrodef>
-
- <macrodef name="staged-docs">
- <attribute name="project"/>
- <attribute name="dir" default="@{project}"/>
- <attribute name="title"/>
- <attribute name="docroot" default="NOT SET"/>
- <element name="includes" implicit="true"/>
-
- <sequential>
- <staged-uptodate stage="docs" project="@{project}">
- <check><srcfiles dir="${src.dir}/@{dir}"/></check>
- <do>
- <stopwatch name="docs.@{project}.timer"/>
- <mkdir dir="${build-docs.dir}/@{project}"/>
- <if><equals arg1="@{docroot}" arg2="NOT SET"/><then>
- <!-- TODO: introduce docs.@{project}.build.path for classpathref -->
- <scaladoc
- destdir="${build-docs.dir}/@{project}"
- doctitle="@{title}"
- docversion="${version.number}"
- sourcepath="${src.dir}"
- classpathref="pack.compiler.path"
- srcdir="${src.dir}/@{dir}"
- addparams="${scalac.args.all}"
- implicits="on"
- diagrams="on"
- groups="on"
- rawOutput="${scaladoc.raw.output}"
- noPrefixes="${scaladoc.no.prefixes}">
- <includes/>
- </scaladoc>
- </then><else>
- <scaladoc
- destdir="${build-docs.dir}/@{project}"
- doctitle="@{title}"
- docversion="${version.number}"
- sourcepath="${src.dir}"
- classpathref="pack.compiler.path"
- srcdir="${src.dir}/@{dir}"
- docRootContent="${src.dir}/@{project}/@{docroot}"
- addparams="${scalac.args.all}"
- implicits="on"
- diagrams="on"
- groups="on"
- rawOutput="${scaladoc.raw.output}"
- noPrefixes="${scaladoc.no.prefixes}">
- <includes/>
- </scaladoc>
- </else></if>
- <stopwatch name="docs.@{project}.timer" action="total"/>
- </do>
- </staged-uptodate>
- </sequential>
- </macrodef>
+ <target name="replacestarr" depends="init.git" description="Produces a new STARR from current sources. Publishes core locally with a generated version number,
+ stored in build.properties as starr.version (overriding the one in versions.properties).">
+ <antcall target="publish-core-local">
+ <param name="maven.version.suffix" value="-STARR-${git.commit.sha}-SNAPSHOT"/>
+ <param name="docs.skip" value="1"/>
+ <param name="scalac.args.optimise" value="-optimise"/>
+ <param name="update.starr.version" value="alright then"/>
+ </antcall>
+ </target>
+
<!-- ===========================================================================
LOCAL REFERENCE BUILD (LOCKER)
============================================================================ -->
- <target name="locker.start" depends="asm.done, forkjoin.done, fjbg.done">
+ <target name="locker.start" depends="asm.done, forkjoin.done">
<condition property="locker.locked"><available file="${build-locker.dir}/locker.locked"/></condition></target>
<target name="locker.lib" depends="locker.start" unless="locker.locked">
<staged-build with="starr" stage="locker" project="library" srcpath="${src.dir}/library" includes="lib.includes"/></target>
- <target name="locker.actors" depends="locker.lib" unless="locker.locked">
- <staged-build with="starr" stage="locker" project="actors"/> </target>
-
- <target name="locker.msil" depends="locker.lib" unless="locker.locked">
- <staged-build with="starr" stage="locker" project="msil" java-excludes="**/tests/**"/> </target>
-
<target name="locker.reflect" depends="locker.lib" unless="locker.locked">
<staged-build with="starr" stage="locker" project="reflect"/></target>
- <target name="locker.comp" depends="locker.reflect, locker.msil" unless="locker.locked">
+ <target name="locker.comp" depends="locker.reflect" unless="locker.locked">
<staged-build with="starr" stage="locker" project="compiler"/></target>
<target name="locker.done" depends="locker.comp">
@@ -1165,64 +1050,61 @@ TODO:
<target name="quick.lib" depends="quick.start">
<staged-build with="locker" stage="quick" project="library" srcpath="${src.dir}/library" includes="lib.rootdoc.includes"/></target>
- <target name="quick.actors" depends="quick.lib">
- <staged-build with="locker" stage="quick" project="actors"/> </target>
-
- <target name="quick.msil" depends="quick.lib">
- <staged-build with="locker" stage="quick" project="msil" java-excludes="**/tests/**"/> </target>
-
<target name="quick.reflect" depends="quick.lib">
<staged-build with="locker" stage="quick" project="reflect"/> </target>
- <target name="quick.comp" depends="quick.reflect, quick.msil">
+ <target name="quick.comp" depends="quick.reflect">
<staged-build with="locker" stage="quick" project="compiler"/> </target>
- <target name="quick.scalacheck" depends="quick.actors, quick.lib">
- <staged-build with="locker" stage="quick" project="scalacheck" args="-nowarn"/> </target>
+ <target name="quick.repl" depends="quick.comp">
+ <staged-build with="locker" stage="quick" project="repl"/> </target>
+
+ <target name="quick.scaladoc" depends="quick.comp">
+ <staged-build with="locker" stage="quick" project="scaladoc" version="scaladoc"/> </target>
+
+ <target name="quick.interactive" depends="quick.comp, quick.scaladoc">
+ <staged-build with="locker" stage="quick" project="interactive"/> </target>
- <target name="quick.scalap" depends="quick.comp">
+ <target name="quick.scalap" depends="quick.repl">
<staged-build with="locker" stage="quick" project="scalap"/> </target>
- <target name="quick.partest" depends="quick.scalap, quick.comp, asm.done">
- <staged-build with="locker" stage="quick" project="partest" version="partest"/> </target>
+ <target name="quick.actors" depends="quick.lib">
+ <staged-build with="locker" stage="quick" project="actors"/> </target>
<target name="quick.swing" depends="quick.actors, quick.lib" if="has.java6">
<staged-build with="locker" stage="quick" project="swing"/> </target>
+
<target name="quick.plugins" depends="quick.comp">
- <staged-uptodate stage="quick" project="plugins">
+ <staged-uptodate stage="quick" project="continuations-plugin">
<check><srcfiles dir="${src.dir}/continuations"/></check>
<do>
- <stopwatch name="quick.plugins.timer"/>
+ <stopwatch name="quick.continuations-plugin.timer"/>
<mkdir dir="${build-quick.dir}/classes/continuations-plugin"/>
- <staged-scalac with="locker" stage="quick" project="plugins" srcdir="continuations/plugin" destproject="continuations-plugin"/>
+ <staged-scalac with="locker" stage="quick" project="continuations-plugin" srcdir="${continuations-plugin.srcdir}"/>
<copy
- file="${src.dir}/continuations/plugin/scalac-plugin.xml"
+ file="${src.dir}/${continuations-plugin.srcdir}/scalac-plugin.xml"
todir="${build-quick.dir}/classes/continuations-plugin"/>
<!-- not very nice to create jar here but needed to load plugin -->
- <mkdir dir="${build-quick.dir}/misc/scala-devel/plugins"/>
- <jar whenmanifestonly="fail" destfile="${build-quick.dir}/misc/scala-devel/plugins/continuations.jar" basedir="${build-quick.dir}/classes/continuations-plugin"/>
+ <mkdir dir="${build-quick.dir}/${continuations-plugin.targetdir}"/>
+ <jar whenmanifestonly="fail" destfile="${build-quick.dir}/${continuations-plugin.targetdir}/continuations.jar" basedir="${build-quick.dir}/classes/continuations-plugin"/>
<!-- might split off library part into its own ant target -->
<mkdir dir="${build-quick.dir}/classes/continuations-library"/>
- <!-- TODO: must build with quick to avoid
- [quick.plugins] error: java.lang.NoClassDefFoundError: scala/tools/nsc/transform/patmat/PatternMatching
- [quick.plugins] at scala.tools.selectivecps.SelectiveCPSTransform.newTransformer(SelectiveCPSTransform.scala:29)
-
- WHY OH WHY!? scala/tools/nsc/transform/patmat/PatternMatching should be on locker.compiler.path
- -->
- <staged-scalac with="quick" stage="quick" project="plugins"
+ <staged-scalac with="locker" stage="quick" project="continuations-plugin"
srcdir="continuations/library" destproject="continuations-library"
- args="-Xplugin-require:continuations -P:continuations:enable -Xpluginsdir ${build-quick.dir}/misc/scala-devel/plugins"/>
+ args="-Xplugin-require:continuations -P:continuations:enable -Xpluginsdir ${build-quick.dir}/${continuations-plugin.targetdir}"/>
- <stopwatch name="quick.plugins.timer" action="total"/>
+ <stopwatch name="quick.continuations-plugin.timer" action="total"/>
</do>
</staged-uptodate>
</target>
- <target name="quick.bin" depends="quick.lib, quick.reflect, quick.comp, quick.scalacheck, quick.scalap, quick.swing, quick.plugins, quick.partest">
+ <target name="quick.modules" depends="quick.repl, quick.scaladoc, quick.interactive, quick.scalap, quick.swing, quick.plugins"/>
+
+ <target name="quick.bin" depends="quick.lib, quick.reflect, quick.comp, quick.modules">
<staged-bin stage="quick" classpathref="quick.bin.tool.path"/>
</target>
@@ -1233,17 +1115,18 @@ TODO:
<!-- ===========================================================================
PACKED QUICK BUILD (PACK)
============================================================================ -->
- <target name="pack.lib" depends="quick.lib, quick.plugins, forkjoin.done">
- <staged-pack project="library"/></target>
+ <target name="pack.lib" depends="quick.lib, quick.plugins, forkjoin.done"> <staged-pack project="library"/></target>
- <target name="pack.actors" depends="quick.lib"> <staged-pack project="actors"/> </target>
- <target name="pack.swing" if="has.java6" depends="quick.swing"> <staged-pack project="swing"/> </target>
- <target name="pack.reflect" depends="quick.reflect"> <staged-pack project="reflect"/> </target>
+ <target name="pack.reflect" depends="quick.reflect"> <staged-pack project="reflect"/> </target>
- <target name="pack.comp" depends="quick.comp, asm.done">
+ <!-- TODO modularize compiler. Remove other quick targets when they become modules. -->
+ <target name="pack.comp" depends="quick.comp, quick.scaladoc, quick.interactive, quick.repl, asm.done">
<staged-pack project="compiler" manifest="${build-pack.dir}/META-INF/MANIFEST.MF">
<pre> <!-- TODO the files copied here do not influence actuality of this target (nor does the manifest) -->
- <copy file="${jline.jar}" toDir="${build-pack.dir}/lib"/>
+ <copy todir="${build-pack.dir}/lib">
+ <resources refid="repl.fileset"/>
+ <mapper classpathref="maven-ant-tasks.classpath" classname="org.apache.maven.artifact.ant.VersionMapper" from="${repl.deps.versions}" to="flatten"/>
+ </copy>
<copy todir="${build-pack.dir}/lib">
<fileset dir="${lib-extra.dir}">
<include name="**/*.jar"/>
@@ -1256,49 +1139,63 @@ TODO:
<attribute name="Class-Path" value="scala-reflect.jar scala-library.jar"/>
</manifest>
</pre>
- <!-- script api is 2.11-only so far
+ <!-- JSR-223 support introduced in 2.11 -->
<jar-opts>
<service type="javax.script.ScriptEngineFactory" provider="scala.tools.nsc.interpreter.IMain$Factory"/>
</jar-opts>
- -->
</staged-pack>
</target>
- <target name="pack.plugins" depends="quick.plugins"> <staged-pack project="plugins" targetdir="misc/scala-devel/plugins" targetjar="continuations.jar"/> </target>
- <target name="pack.scalacheck" depends="quick.scalacheck"> <staged-pack project="scalacheck" targetjar="scalacheck.jar"/> </target>
+ <!-- TODO modularize compiler. These targets are currently not used.
+ <target name="pack.scaladoc" depends="quick.scaladoc"> <staged-pack project="scaladoc"/> </target>
+ <target name="pack.interactive" depends="quick.interactive"> <staged-pack project="interactive"/> </target>
+ -->
- <target name="pack.partest" depends="quick.partest">
- <staged-pack project="partest"/>
- <!-- TODO the manifest should influence actuality of this target -->
- <staged-pack project="partest-javaagent" manifest="${src.dir}/partest/scala/tools/partest/javaagent/MANIFEST.MF"/>
- </target>
+ <target name="pack.actors" depends="quick.actors"> <staged-pack project="actors"/> </target>
+ <target name="pack.swing" if="has.java6" depends="quick.swing"> <staged-pack project="swing"/> </target>
- <target name="pack.scalap" depends="quick.scalap"> <staged-pack project="scalap" targetjar="scalap.jar"/> </target>
+ <target name="pack.plugins" depends="quick.plugins"> <staged-pack project="continuations-plugin"/> </target>
- <target name="pack.bin" depends="pack.comp, pack.lib, pack.actors, pack.partest, pack.plugins, pack.reflect, pack.scalacheck, pack.scalap, pack.swing">
- <staged-bin stage="pack"/>
- </target>
+ <target name="pack.scalap" depends="quick.scalap"> <staged-pack project="scalap"/> </target>
- <!-- depend on quick.done so quick.bin is run when pack.done is -->
- <target name="pack.done" depends="quick.done, pack.bin">
- <!-- copy dependencies to build/pack/lib, it only takes a second so don't bother with uptodate checks -->
+ <target name="pack.core" depends="pack.reflect, pack.comp, pack.lib"/>
+
+ <!-- TODO modularize compiler: pack.scaladoc, pack.interactive, -->
+ <target name="pack.modules" depends="pack.actors, pack.swing, pack.plugins, pack.scalap">
<copy todir="${build-pack.dir}/lib">
- <resources refid="partest.extras.fileset"/>
- <mapper classpathref="maven-ant-tasks.classpath" classname="org.apache.maven.artifact.ant.VersionMapper"
- from="${partest.extras.versions}" to="flatten"/>
+ <path refid="external-modules-nocore" />
+ <mapper type="flatten" />
</copy>
+ </target>
+
+ <!-- depends on pack.core for scaladoc -->
+ <target name="scaladoc.task" depends="pack.core, pack.modules" unless="docs.skip">
+ <taskdef resource="scala/tools/ant/antlib.xml" classpathref="scaladoc.classpath"/>
+ </target>
- <taskdef resource="scala/tools/ant/antlib.xml" classpathref="pack.compiler.path"/>
- <taskdef resource="scala/tools/partest/antlib.xml" classpathref="partest.classpath"/>
+ <target name="pack.partest-extras" depends="quick.comp">
+ <!-- compile compiler-specific parts of partest -->
+ <staged-build with="quick" stage="quick" project="partest-extras" />
+ <staged-build with="quick" stage="quick" project="partest-javaagent" />
+
+ <staged-pack project="partest-extras"/>
+ <staged-pack project="partest-javaagent"
+ manifest="${src.dir}/partest-javaagent/scala/tools/partest/javaagent/MANIFEST.MF"/>
</target>
+ <target name="pack.bin" depends="pack.core, pack.modules, pack.partest-extras">
+ <staged-bin stage="pack"/>
+ </target>
+
+ <!-- depend on quick.done so quick.bin is run when pack.done is -->
+ <target name="pack.done" depends="quick.done, pack.bin"/>
+
<!-- ===========================================================================
BOOTSTRAPPING BUILD (STRAP)
============================================================================ -->
<target name="strap.done" depends="pack.done">
<staged-build with="pack" stage="strap" project="library" srcpath="${src.dir}/library" includes="lib.rootdoc.includes"/>
- <staged-build with="pack" stage="strap" project="msil" java-excludes="**/tests/**"/>
<staged-build with="pack" stage="strap" project="reflect"/>
<staged-build with="pack" stage="strap" project="compiler"/>
</target>
@@ -1306,91 +1203,109 @@ TODO:
<target name="strap-opt" description="Optimized version of strap.done."> <optimized name="strap.done"/></target>
-<!-- ===========================================================================
- PACKED LOCKER BUILD (PALO)
-============================================================================ -->
- <target name="palo.done" depends="locker.done">
- <mkdir dir="${build-palo.dir}/lib"/>
- <jar whenmanifestonly="fail" destfile="${build-palo.dir}/lib/scala-library.jar">
- <fileset dir="${build-locker.dir}/classes/library"/>
- <fileset dir="${forkjoin-classes}"/>
- </jar>
- <jar whenmanifestonly="fail" destfile="${build-palo.dir}/lib/scala-reflect.jar" manifest="${basedir}/META-INF/MANIFEST.MF"
- basedir="${build-locker.dir}/classes/reflect"/>
- <jar whenmanifestonly="fail" destfile="${build-palo.dir}/lib/scala-compiler.jar" manifest="${basedir}/META-INF/MANIFEST.MF">
- <fileset dir="${build-locker.dir}/classes/compiler"/>
- <fileset dir="${asm-classes}"/>
- <fileset dir="${fjbg-classes}"/>
- </jar>
- <copy file="${jline.jar}" toDir="${build-palo.dir}/lib"/>
- </target>
-
- <target name="palo.bin" depends="palo.done"> <staged-bin stage="palo"/></target>
-
<!-- ===========================================================================
OSGi Artifacts
============================================================================ -->
- <target name="osgi.done" depends="pack.done">
- <mkdir dir="${build-osgi.dir}"/>
+ <!-- This task takes the output of the pack stage and OSGi-fies the jars based on the bnd files in src/build/bnd
+ This means adding manifests and enforcing the Exports clauses (removing non-exported classes!)
+ These jars are then copied to the distribution and published to maven.
+ -->
- <!-- simplify fixing pom versions -->
- <macrodef name="make-bundle">
- <attribute name="name" />
- <attribute name="version" />
- <sequential>
- <copy file="${src.dir}/build/bnd/@{name}.bnd" tofile="${build-osgi.dir}/@{name}.bnd" overwrite="true">
- <filterset>
- <filter token="VERSION" value="@{version}" />
- </filterset>
- </copy>
- <bnd classpath="${build-pack.dir}/lib/@{name}.jar"
- eclipse="false"
- failok="false"
- exceptions="true"
- files="${build-osgi.dir}/@{name}.bnd"
- output="${build-osgi.dir}"/>
- </sequential>
- </macrodef>
- <macrodef name="make-plugin-bundle">
- <attribute name="name" />
- <attribute name="version" />
- <sequential>
- <copy file="${src.dir}/build/bnd/@{name}.bnd" tofile="${build-osgi.dir}/@{name}.bnd" overwrite="true">
- <filterset>
- <filter token="VERSION" value="@{version}" />
- </filterset>
- </copy>
- <bnd classpath="${build-pack.dir}/misc/scala-devel/plugins/@{name}.jar"
- eclipse="false"
- failok="false"
- exceptions="true"
- files="${build-osgi.dir}/@{name}.bnd"
- output="${build-osgi.dir}"/>
- </sequential>
- </macrodef>
- <uptodate property="osgi.bundles.available" targetfile="${build-osgi.dir}/bundles.complete">
+ <target name="osgi.core" depends="pack.core">
+ <mkdir dir="${build-osgi.dir}"/>
+
+ <uptodate property="osgi.bundles.available" targetfile="${build-osgi.dir}/bundles.core.complete">
<srcfiles dir="${basedir}">
<include name="build.xml"/>
<include name="src/build/bnd/*.bnd"/>
+ <include name="${library.jar}"/>
+ <include name="${reflect.jar}"/>
+ <include name="${compiler.jar}"/>
</srcfiles>
</uptodate>
<if><not><isset property="osgi.bundles.available"/></not><then>
- <stopwatch name="osgi.bundle.timer"/>
- <make-bundle name="scala-library" version="${osgi.version.number}" />
- <make-bundle name="scala-actors" version="${osgi.version.number}" />
- <make-bundle name="scala-reflect" version="${osgi.version.number}" />
- <make-bundle name="scala-compiler" version="${osgi.version.number}" />
- <make-plugin-bundle name="continuations" version="${osgi.version.number}" />
- <touch file="${build-osgi.dir}/bundles.complete" verbose="no"/>
+ <stopwatch name="osgi.core.timer"/>
+ <make-bundle project="library">
+ <fileset dir="${src.dir}/library"/>
+ <fileset dir="${src.dir}/continuations/library"/>
+ </make-bundle>
+
+ <make-bundle project="reflect">
+ <fileset dir="${src.dir}/reflect"/>
+ </make-bundle>
+
+ <!-- TODO modularize compiler. Remove the other class dirs as soon as they become modules -->
+ <make-bundle project="compiler">
+ <fileset dir="${src.dir}/compiler"/>
+ <fileset dir="${src.dir}/scaladoc"/>
+ <fileset dir="${src.dir}/interactive"/>
+ <fileset dir="${src.dir}/repl"/>
+ </make-bundle>
+
+ <touch file="${build-osgi.dir}/bundles.core.complete" verbose="no"/>
+ <stopwatch name="osgi.core.timer" action="total"/>
+ </then></if>
+ </target>
+
+ <target name="osgi.done" depends="pack.done, osgi.core">
+ <uptodate property="osgi.all.bundles.available" targetfile="${build-osgi.dir}/bundles.all.complete">
+ <srcfiles dir="${basedir}">
+ <include name="build.xml"/>
+ <include name="src/build/bnd/*.bnd"/>
+
+ <!-- TODO modularize compiler
+ <include name="${interactive.jar}"/>
+ <include name="${scaladoc.jar}"/>
+ -->
+
+ <include name="${actors.jar}"/>
+ <include name="${continuations-plugin.jar}"/>
+ <include name="${swing.jar}"/>
+ <include name="${parser-combinators.jar}"/>
+ <include name="${xml.jar}"/>
+ </srcfiles>
+ </uptodate>
+
+ <if><not><isset property="osgi.all.bundles.available"/></not><then>
+ <stopwatch name="osgi.all.timer"/>
+
+ <!-- TODO modularize compiler
+ TODO: refactor so that we can restrict exported packages to scala.tools.nsc.doc.*
+ move ant task, partest stuff to other jars,
+ and move scala.tools.nsc.ScalaDoc main class to scala.tools.nsc.doc
+ <make-bundle project="scaladoc">
+ <fileset dir="${src.dir}/scaladoc"/>
+ </make-bundle>
+
+ TODO: refactor so that we can restrict exported packages to scala.tools.nsc.interactive.*
+ <make-bundle project="interactive">
+ <fileset dir="${src.dir}/interactive"/>
+ </make-bundle>
+ -->
+
+ <make-bundle project="actors">
+ <fileset dir="${src.dir}/actors"/>
+ </make-bundle>
+
+ <make-bundle project="continuations-plugin">
+ <fileset dir="${src.dir}/${continuations-plugin.srcdir}"/>
+ </make-bundle>
<if><isset property="has.java6"/><then>
- <make-bundle name="scala-swing" version="${osgi.version.number}"/></then>
- </if>
- <stopwatch name="osgi.bundle.timer" action="total"/></then>
- </if>
+ <make-bundle project="swing">
+ <fileset dir="${src.dir}/swing"/>
+ </make-bundle>
+ </then></if>
+
+ <make-bundle project="parser-combinators"/>
+ <make-bundle project="xml"/>
+
+ <touch file="${build-osgi.dir}/bundles.all.complete" verbose="no"/>
+ <stopwatch name="osgi.all.timer" action="total"/>
+ </then></if>
</target>
@@ -1433,6 +1348,8 @@ TODO:
<target name="test.osgi" depends="test.osgi.comp">
<stopwatch name="test.osgi.timer"/>
<mkdir dir="${test.osgi.classes}"/>
+
+ <echo message="Running OSGi JUnit tests. Output in ${build-osgi.dir}"/>
<junit fork="yes" haltonfailure="yes">
<classpath refid="test.osgi.compiler.build.path"/>
<batchtest fork="yes" todir="${build-osgi.dir}">
@@ -1440,7 +1357,7 @@ TODO:
<include name="**/*Test.class"/>
</fileset>
</batchtest>
- <formatter type="brief" /> <!-- silenced by having it use a file; I tried for an hour to use other formatters but classpath issues drove me to this usefile="false" -->
+ <formatter type="xml" /> <!-- silenced by having it use a file; I tried for an hour to use other formatters but classpath issues drove me to this usefile="false" -->
</junit>
<stopwatch name="test.osgi.timer" action="total"/>
</target>
@@ -1507,7 +1424,8 @@ TODO:
<target name="test.junit" depends="test.junit.comp">
<stopwatch name="test.junit.timer"/>
<mkdir dir="${test.junit.classes}"/>
- <junit fork="yes" haltonfailure="yes" showoutput="yes" printsummary="on">
+ <echo message="Note: details of failed tests will be output to ${build-junit.dir}"/>
+ <junit fork="yes" haltonfailure="yes" printsummary="on">
<classpath refid="test.junit.compiler.build.path"/>
<batchtest fork="yes" todir="${build-junit.dir}">
<fileset dir="${test.junit.classes}">
@@ -1519,73 +1437,58 @@ TODO:
<stopwatch name="test.junit.timer" action="total"/>
</target>
- <property name="partest.srcdir" value="files" /> <!-- TODO: make targets for `pending` and other subdirs -->
-
- <target name="test.run" depends="pack.done">
- <partest showlog="yes" erroronfailed="yes" javacmd="${java.home}/bin/java"
- timeout="1200000"
- srcdir="${partest.srcdir}"
- scalacopts="${scalac.args.optimise}">
-
- <compilationpath refid="partest.build.path"/>
- <runtests dir="${partest.dir}/${partest.srcdir}/run" includes="*.scala"/>
- <jvmtests dir="${partest.dir}/${partest.srcdir}/jvm" includes="*.scala"/>
- </partest>
- </target>
-
- <target name="test.suite" depends="pack.done">
- <partest showlog="yes" erroronfailed="yes" javacmd="${java.home}/bin/java"
- timeout="2400000"
- srcdir="${partest.srcdir}"
- scalacopts="${scalac.args.optimise}">
- <compilationpath refid="partest.build.path"/>
- <postests dir="${partest.dir}/${partest.srcdir}/pos" includes="*.scala"/>
- <negtests dir="${partest.dir}/${partest.srcdir}/neg" includes="*.scala"/>
- <runtests dir="${partest.dir}/${partest.srcdir}/run" includes="*.scala"/>
- <jvmtests dir="${partest.dir}/${partest.srcdir}/jvm" includes="*.scala"/>
- <residenttests dir="${partest.dir}/${partest.srcdir}/res" includes="*.res"/>
- <buildmanagertests dir="${partest.dir}/${partest.srcdir}/buildmanager" includes="*"/>
- <scalaptests dir="${partest.dir}/${partest.srcdir}/scalap" includes="**/*.scala"/>
- <scalachecktests dir="${partest.dir}/${partest.srcdir}/scalacheck">
- <include name="*.scala"/>
- </scalachecktests>
- <specializedtests dir="${partest.dir}/${partest.srcdir}/specialized">
- <include name="*.scala"/>
- </specializedtests>
- <instrumentedtests dir="${partest.dir}/${partest.srcdir}/instrumented">
- <include name="*.scala"/>
- </instrumentedtests>
- </partest>
- </target>
-
- <target name="test.continuations.suite" depends="pack.done">
- <partest showlog="yes" erroronfailed="yes" javacmd="${java.home}/bin/java"
- timeout="2400000"
- srcdir="${partest.srcdir}"
- scalacopts="${scalac.args.optimise} -Xplugin-require:continuations -P:continuations:enable">
- <compilerarg value="-Xpluginsdir"/>
- <compilerarg file="${build-quick.dir}/misc/scala-devel/plugins"/>
- <compilationpath refid="partest.build.path"/>
- <negtests dir="${partest.dir}/${partest.srcdir}/continuations-neg" includes="*.scala"/>
- <runtests dir="${partest.dir}/${partest.srcdir}/continuations-run" includes="*.scala"/>
- </partest>
- </target>
-
- <target name="test.scaladoc" depends="pack.done">
- <partest erroronfailed="yes" scalacopts="${scalac.args.optimise}" showlog="yes">
- <compilationpath refid="partest.build.path"/>
- <runtests dir="${partest.dir}/scaladoc/run" includes="*.scala" />
- <scalachecktests dir="${partest.dir}/scaladoc/scalacheck" includes="*.scala" />
- </partest>
- </target>
-
- <target name="test.interactive" depends="pack.done">
- <partest erroronfailed="yes" scalacopts="${scalac.args.optimise}" showlog="yes">
- <compilationpath refid="partest.build.path"/>
- <presentationtests dir="${partest.dir}/${partest.srcdir}/presentation">
- <include name="*/*.scala"/>
- </presentationtests>
- </partest>
+ <!-- See test/build-partest.xml for the macro(s) being used here. -->
+ <target name="partest.task" depends="pack.done">
+ <!-- note the classpathref! this is the classpath used to run partest,
+ so it must have the new compiler.... -->
+ <taskdef
+ classpathref="partest.compilation.path"
+ resource="scala/tools/partest/antlib.xml"/>
+ </target>
+
+ <target name="test.suite.init" depends="partest.task">
+ <!-- read by test/partest to determine classpath used to run partest -->
+ <propertyfile file = "build/pack/partest.properties">
+ <!-- TODO: change "partest.classpath" to "partest.runtime.classpath" or something -->
+ <entry key = "partest.classpath" value="${toString:partest.compilation.path}"/>
+ </propertyfile>
+ </target>
+
+ <target name="test.suite" depends="test.suite.init">
+ <testSuite kinds="pos neg run jvm res scalap scalacheck specialized instrumented"/>
+ </target>
+
+ <target name="test.suite.color" depends="test.suite.init">
+ <testSuite colors="8" kinds="pos neg run jvm res scalap scalacheck specialized instrumented"/>
+ </target>
+
+ <target name="test.suite.quick" depends="init, quick.done">
+ <path id="test.suite.path">
+ <path refid="quick.bin.tool.path"/>
+ <path refid="quick.interactive.build.path"/>
+ <path refid="partest.compilation.path.noncore"/>
+ </path>
+ <property name="pcp" value="${toString:test.suite.path}"/>
+ <taskdef classpathref="test.suite.path" resource="scala/tools/partest/antlib.xml"/>
+ <testSuite colors="8" kinds="pos neg run jvm res scalap scalacheck specialized instrumented" pcp="${pcp}"/>
+ </target>
+
+ <target name="test.run" depends="test.suite.init">
+ <testSuite kinds="run jvm"/>
+ </target>
+
+ <target name="test.continuations.suite" depends="test.suite.init">
+ <testSuite kinds="continuations-neg continuations-run"
+ scalacOpts="${scalac.args.optimise} -Xpluginsdir ${build-quick.dir}/${continuations-plugin.targetdir} -Xplugin-require:continuations -P:continuations:enable"
+ />
+ </target>
+
+ <target name="test.scaladoc" depends="test.suite.init">
+ <testSuite kinds="run scalacheck" srcdir="scaladoc"/>
+ </target>
+
+ <target name="test.interactive" depends="test.suite.init">
+ <testSuite kinds="presentation"/>
</target>
<!-- for use in PR validation, where stability is rarely broken, so we're going to use starr for locker,
@@ -1593,12 +1496,11 @@ TODO:
<target name="test.core" depends="test.osgi, test.sbt, test.bc, test.junit, test.interactive, test.continuations.suite, test.scaladoc, test.suite"/>
<target name="test.done" depends="test.core, test.stability"/>
-
<!-- ===========================================================================
BINARY COMPATIBILITY TESTING
============================================================================ -->
<target name="bc.init" depends="init" unless="maven-deps-done-mima">
- <property name="bc-reference-version" value="2.10.0"/>
+ <property name="bc-reference-version" value="2.11.0"/>
<property name="bc-build.dir" value="${build.dir}/bc"/>
<!-- Obtain mima -->
@@ -1615,58 +1517,22 @@ TODO:
<property name="maven-deps-done-mima" value="true"/>
</target>
- <macrodef name="bc.run-mima">
- <attribute name="jar-name"/>
- <attribute name="prev"/>
- <attribute name="curr"/>
- <attribute name="direction"/>
- <sequential>
- <echo message="Checking @{direction} binary compatibility for @{jar-name} (against ${bc-reference-version})"/>
- <java taskname="mima"
- fork="true"
- failonerror="true"
- classname="com.typesafe.tools.mima.cli.Main">
- <arg value="--prev"/>
- <arg value="@{prev}"/>
- <arg value="--curr"/>
- <arg value="@{curr}"/>
- <arg value="--filters"/>
- <arg value="${basedir}/bincompat-@{direction}.whitelist.conf"/>
- <arg value="--generate-filters"/>
- <classpath>
- <path refid="mima.classpath"/>
- </classpath>
- </java>
- </sequential>
- </macrodef>
-
- <macrodef name="bc.check">
- <attribute name="jar-name"/>
- <sequential>
- <bc.run-mima
- jar-name="@{jar-name}"
- prev="${org.scala-lang:@{jar-name}:jar}"
- curr="${build-pack.dir}/lib/@{jar-name}.jar"
- direction="backward"/>
- <bc.run-mima
- jar-name="@{jar-name}"
- prev="${build-pack.dir}/lib/@{jar-name}.jar"
- curr="${org.scala-lang:@{jar-name}:jar}"
- direction="forward"/>
- </sequential>
- </macrodef>
+
<target name="test.bc-opt" description="Optimized version of test.bc."> <optimized name="test.bc"/></target>
- <target name="test.bc" depends="bc.init, pack.lib, pack.reflect, pack.swing">
- <bc.check jar-name="scala-library"/>
- <bc.check jar-name="scala-reflect"/>
- <bc.check jar-name="scala-swing"/>
+
+ <!-- Enable after the release of the 2.11.0 or a prior RC that estabilishes the new baseline. -->
+ <target name="test.bc"></target>
+ <target name="test.bc.disabled" depends="bc.init, pack.lib, pack.reflect, pack.swing">
+ <bc.check project="library"/>
+ <bc.check project="reflect"/>
+ <bc.check project="swing"/>
</target>
<!-- ===========================================================================
DOCUMENTATION
============================================================================ -->
- <target name="docs.start" depends="pack.done">
+ <target name="docs.start" depends="scaladoc.task" unless="docs.skip">
<!-- Set the github commit scaladoc sources point to -->
<!-- For releases, look for the tag with the same name as the maven version -->
<condition property="scaladoc.git.commit" value="v${maven.version.number}">
@@ -1687,85 +1553,72 @@ TODO:
<property name="scaladoc.no.prefixes" value="no"/>
</target>
- <target name="docs.lib" depends="docs.start">
- <staged-uptodate stage="docs" project="library">
- <check><srcfiles dir="${src.dir}">
- <include name="library/**"/>
- <include name="swing/**"/>
- <include name="actors/**"/>
- <include name="reflect/**"/>
- <include name="continuations/library/**"/>
- </srcfiles></check>
- <do>
- <stopwatch name="docs.lib.timer"/>
- <mkdir dir="${build-docs.dir}/library"/>
- <!-- last three attributes not supported by staged-docs: -->
- <scaladoc
- destdir="${build-docs.dir}/library"
- doctitle="Scala Standard Library API (Scaladoc)"
- docversion="${version.number}"
- docsourceurl="${scaladoc.url}€{FILE_PATH}.scala#L1"
- sourcepath="${src.dir}"
- classpathref="pack.compiler.path"
- addparams="${scalac.args.all}"
- docRootContent="${src.dir}/library/rootdoc.txt"
- implicits="on"
- diagrams="on"
- groups="on"
- rawOutput="${scaladoc.raw.output}"
- noPrefixes="${scaladoc.no.prefixes}"
- docfooter="epfl"
- docUncompilable="${src.dir}/library-aux"
- skipPackages="scala.reflect.macros.internal:scala.reflect.internal:scala.reflect.io:scala.concurrent.impl">
- <src>
- <files includes="${src.dir}/actors"/>
- <files includes="${src.dir}/library"/>
- <files includes="${src.dir}/reflect"/>
- <files includes="${src.dir}/swing"/>
- <files includes="${src.dir}/continuations/library"/>
- </src>
- <include name="**/*.scala"/>
- <exclude name="reflect/Code.scala"/>
- <exclude name="reflect/Print.scala"/>
- <exclude name="reflect/Symbol.scala"/>
- <exclude name="reflect/Tree.scala"/>
- <exclude name="reflect/Type.scala"/>
- <exclude name="runtime/*$.scala"/>
- <exclude name="runtime/ScalaRunTime.scala"/>
- <exclude name="runtime/StringAdd.scala"/>
- </scaladoc>
- <stopwatch name="docs.lib.timer" action="total"/>
- </do>
- </staged-uptodate>
+ <target name="docs.lib" depends="docs.start" unless="docs.skip">
+ <staged-docs project="library">
+ <include name="**/*.scala"/>
+ <exclude name="runtime/*$.scala"/>
+ <exclude name="runtime/ScalaRunTime.scala"/>
+ <exclude name="runtime/StringAdd.scala"/>
+ </staged-docs>
+ </target>
+
+ <target name="docs.reflect" depends="docs.start" unless="docs.skip">
+ <staged-docs project="reflect">
+ <include name="**/*.scala"/>
+ <exclude name="reflect/Code.scala"/>
+ <exclude name="reflect/Print.scala"/>
+ <exclude name="reflect/Symbol.scala"/>
+ <exclude name="reflect/Tree.scala"/>
+ <exclude name="reflect/Type.scala"/>
+ </staged-docs>
+ </target>
+
+ <target name="docs.comp" depends="docs.start" unless="docs.skip">
+ <staged-docs project="compiler">
+ <include name="**/*.scala"/>
+ </staged-docs>
+ </target>
+
+ <!-- TODO modularize compiler. These targets are currently not used.
+ <target name="docs.scaladoc" depends="docs.start" unless="docs.skip">
+ <staged-docs project="scaladoc">
+ <include name="**/*.scala"/>
+ </staged-docs>
</target>
- <target name="docs.comp" depends="docs.start">
- <staged-docs project="compiler" title="Scala Compiler" docroot="rootdoc.txt">
+ <target name="docs.interactive" depends="docs.start" unless="docs.skip">
+ <staged-docs project="interactive">
+ <include name="**/*.scala"/>
+ </staged-docs>
+ </target>
+ -->
+
+ <target name="docs.actors" depends="docs.start" unless="docs.skip">
+ <staged-docs project="actors">
<include name="**/*.scala"/>
</staged-docs>
</target>
- <target name="docs.jline" depends="docs.start">
- <staged-docs project="jline" dir="jline/src/main/java" title="Scala JLine">
+ <target name="docs.swing" depends="docs.start" unless="docs.skip">
+ <staged-docs project="swing">
<include name="**/*.scala"/>
- <include name="**/*.java"/>
</staged-docs>
</target>
- <target name="docs.scalap" depends="docs.start">
- <staged-docs project="scalap" title="Scalap">
+ <target name="docs.scalap" depends="docs.start" unless="docs.skip">
+ <staged-docs project="scalap">
<include name="**/*.scala"/>
</staged-docs>
</target>
- <target name="docs.partest" depends="docs.start">
- <staged-docs project="partest" title="Scala Parallel Testing Framework">
+ <target name="docs.continuations-plugin" depends="docs.start" unless="docs.skip">
+ <staged-docs project="continuations-plugin">
<include name="**/*.scala"/>
</staged-docs>
</target>
- <target name="docs.continuations-plugin" depends="docs.start">
- <staged-docs project="continuations-plugin" dir="continuations/plugin" title="Delimited Continuations Compiler Plugin">
+ <target name="docs.continuations-library" depends="docs.start" unless="docs.skip">
+ <staged-docs project="continuations-library">
<include name="**/*.scala"/>
</staged-docs>
</target>
@@ -1777,16 +1630,16 @@ TODO:
<mkdir dir="${build.dir}/manmaker/classes"/>
<scalac
destdir="${build.dir}/manmaker/classes"
- classpathref="pack.compiler.path"
+ classpathref="manual.build.path"
srcdir="${src.dir}/manual"
includes="**/*.scala"
- addparams="${scalac.args.all}"/>
+ addparams="${scalac.args.all} -language:implicitConversions"/>
<mkdir dir="${build-docs.dir}/manual/man/man1"/>
<mkdir dir="${build-docs.dir}/manual/html"/>
<mkdir dir="${build-docs.dir}/manual/genman/man1"/>
<taskdef name="genman"
classname="scala.tools.docutil.ManMaker"
- classpathref="manual.classpath"/>
+ classpathref="manual.build.path"/>
<genman command="fsc, scala, scalac, scaladoc, scalap"
htmlout="${build-docs.dir}/manual/html"
manout="${build-docs.dir}/manual/genman"/>
@@ -1795,7 +1648,7 @@ TODO:
srcdir="${build-docs.dir}/manual/genman"
destdir="${build-docs.dir}/manual/man"
eol="unix" includes="**/*.1"/>
- <copy todir="${build-docs.dir}/manual/html">
+ <copy todir="${build-docs.dir}/manual/html" overwrite="true">
<fileset dir="${src.dir}/manual/scala/tools/docutil/resources">
<include name="**/*.html"/>
<include name="**/*.css"/>
@@ -1807,56 +1660,50 @@ TODO:
</staged-uptodate>
</target>
- <target name="docs.done" depends="docs.jline, docs.comp, docs.man, docs.lib, docs.scalap, docs.partest, docs.continuations-plugin"/>
-
+ <target name="docs.core" depends="docs.lib, docs.reflect, docs.comp" unless="docs.skip"/>
+ <!-- TODO modularize compiler: docs.scaladoc, docs.interactive, -->
+ <target name="docs.done" depends="docs.core, docs.actors, docs.swing, docs.scalap, docs.continuations-plugin, docs.continuations-library" unless="docs.skip"/>
<!-- ===========================================================================
DISTRIBUTION
============================================================================ -->
- <target name="dist.base" depends="pack.done, osgi.done">
+ <target name="dist.base" depends="osgi.done">
<property name="dist.name" value="scala-${version.number}"/>
<property name="dist.dir" value="${dists.dir}/${dist.name}"/>
- <macrodef name="copy-bundle">
- <attribute name="name" />
- <sequential>
- <copy file="${build-osgi.dir}/org.scala-lang.@{name}.jar"
- tofile="${dist.dir}/lib/@{name}.jar"/>
- </sequential>
- </macrodef>
- <macrodef name="copy-plugin-bundle">
- <attribute name="name" />
- <sequential>
- <copy file="${build-osgi.dir}/org.scala-lang.plugins.@{name}.jar"
- tofile="${dist.dir}/misc/scala-devel/plugins/@{name}.jar"
- overwrite="yes"/>
- </sequential>
- </macrodef>
<mkdir dir="${dist.dir}/lib"/>
- <copy toDir="${dist.dir}/lib">
+ <mkdir dir="${dist.dir}/${continuations-plugin.targetdir}"/>
+ <mkdir dir="${dist.dir}/src"/>
+
+ <copy todir="${dist.dir}/lib" overwrite="true">
+ <resources refid="repl.fileset"/>
+ <mapper classpathref="maven-ant-tasks.classpath" classname="org.apache.maven.artifact.ant.VersionMapper"
+ from="${repl.deps.versions}" to="flatten"/>
+ </copy>
+
+ <!-- copy classfile jars and source jars from osgi build to dist -->
+ <copy-bundle project="library"/>
+ <copy-bundle project="reflect"/>
+ <copy-bundle project="compiler"/>
+
+ <copy-bundle project="swing"/>
+ <copy-bundle project="actors"/>
+
+ <copy-bundle project="xml"/>
+ <copy-bundle project="parser-combinators"/>
+ <copy-bundle project="continuations-plugin"/>
+
+ <!-- scalap -->
+ <copy toDir="${dist.dir}/lib" overwrite="true">
<fileset dir="${build-pack.dir}/lib">
- <include name="jline.jar"/>
- <include name="scalacheck.jar"/>
- <include name="scala-partest.jar"/>
<include name="scalap.jar"/>
</fileset>
</copy>
-
- <copy todir="${dist.dir}/lib">
- <resources refid="partest.extras.fileset"/>
- <mapper classpathref="maven-ant-tasks.classpath" classname="org.apache.maven.artifact.ant.VersionMapper"
- from="${partest.extras.versions}" to="flatten"/>
- </copy>
+ <jar whenmanifestonly="fail" destfile="${dist.dir}/src/scalap-src.jar" basedir="${src.dir}/scalap"/>
<mkdir dir="${dist.dir}/bin"/>
- <!-- TODO - Stop being inefficient and don't copy OSGi bundles overtop other jars. -->
- <copy-bundle name="scala-library"/>
- <copy-bundle name="scala-reflect"/>
- <copy-bundle name="scala-swing"/>
- <copy-bundle name="scala-actors"/>
- <copy-bundle name="scala-compiler"/>
- <copy toDir="${dist.dir}/bin">
+ <copy toDir="${dist.dir}/bin" overwrite="true">
<fileset dir="${build-pack.dir}/bin"/>
</copy>
<chmod perm="ugo+rx" file="${dist.dir}/bin/scala"/>
@@ -1864,224 +1711,219 @@ TODO:
<chmod perm="ugo+rx" file="${dist.dir}/bin/scaladoc"/>
<chmod perm="ugo+rx" file="${dist.dir}/bin/fsc"/>
<chmod perm="ugo+rx" file="${dist.dir}/bin/scalap"/>
- <mkdir dir="${dist.dir}/misc/scala-devel/plugins"/>
- <copy-plugin-bundle name="continuations"/>
</target>
+
<target name="dist.doc" depends="dist.base, docs.done">
<mkdir dir="${dist.dir}/doc/scala-devel-docs"/>
- <copy file="${docs.dir}/LICENSE" toDir="${dist.dir}/doc"/>
- <copy file="${docs.dir}/README" toDir="${dist.dir}/doc"/>
+ <copy toDir="${dist.dir}/doc/scala-devel-docs" overwrite="true" flatten="true">
+ <file file="${scala-xml-javadoc}"/>
+ <file file="${scala-parser-combinators-javadoc}"/>
+ </copy>
+
+ <copy file="${docs.dir}/LICENSE" toDir="${dist.dir}/doc" overwrite="true"/>
+ <copy file="${docs.dir}/README" toDir="${dist.dir}/doc" overwrite="true"/>
<mkdir dir="${dist.dir}/doc/scala-devel-docs/api"/>
- <copy toDir="${dist.dir}/doc/scala-devel-docs/api">
+ <copy toDir="${dist.dir}/doc/scala-devel-docs/api" overwrite="true">
<fileset dir="${build-docs.dir}/library"/>
</copy>
<mkdir dir="${dist.dir}/doc/scala-devel-docs/examples"/>
- <copy toDir="${dist.dir}/doc/scala-devel-docs/examples">
+ <copy toDir="${dist.dir}/doc/scala-devel-docs/examples" overwrite="true">
<fileset dir="${docs.dir}/examples">
<exclude name="**/*.desired.sha1"/>
</fileset>
</copy>
- <mkdir dir="${dist.dir}/doc/scala-devel-docs/tools"/>
- <copy toDir="${dist.dir}/doc/scala-devel-docs/tools">
- <fileset dir="${build-docs.dir}/manual/html"/>
- </copy>
<copy file="${src.dir}/swing/doc/README"
- toFile="${dist.dir}/doc/scala-devel-docs/README.scala-swing"/>
+ toFile="${dist.dir}/doc/scala-devel-docs/README.scala-swing"
+ overwrite="true"/>
</target>
- <target name="dist.man" depends="dist.base">
+ <target name="dist.man" depends="dist.base, docs.man">
<mkdir dir="${dist.dir}/man"/>
- <copy toDir="${dist.dir}/man">
+ <copy toDir="${dist.dir}/man" overwrite="true">
<fileset dir="${build-docs.dir}/manual/man"/>
</copy>
+ <mkdir dir="${dist.dir}/doc/scala-devel-docs/tools"/>
+ <copy toDir="${dist.dir}/doc/scala-devel-docs/tools" overwrite="true">
+ <fileset dir="${build-docs.dir}/manual/html"/>
+ </copy>
</target>
- <!--
- A jar-like task that creates an OSGi source bundle. It adds the required MANIFEST.MF headers that allow
- Eclipse to match sources with the corresponding binaries.
- -->
- <macrodef name="osgi.source.bundle">
- <attribute name="destfile" description="The jar file name"/>
- <attribute name="symbolicName" description="The original bundle symbolic name (without .source at the end)"/>
- <attribute name="bundleName" description="A value for Bundle-Name, usually a textual description"/>
- <element name="file-sets" description="A sequence of fileset elements to be included in the jar" optional="true" implicit="true"/>
-
- <sequential>
- <jar whenmanifestonly="fail" destfile="@{destFile}">
- <file-sets/>
- <manifest>
- <attribute name="Manifest-Version" value="1.0"/>
- <attribute name="Bundle-Name" value="@{bundleName}"/>
- <attribute name="Bundle-SymbolicName" value="@{symbolicName}.source"/>
- <attribute name="Bundle-Version" value="${osgi.version.number}"/>
- <attribute name="Eclipse-SourceBundle" value="@{symbolicName};version=&quot;${osgi.version.number}&quot;;roots:=&quot;.&quot;" />
- </manifest>
- </jar>
- </sequential>
- </macrodef>
-
- <target name="dist.src" depends="dist.base">
- <mkdir dir="${dist.dir}/src"/>
- <osgi.source.bundle destfile="${dist.dir}/src/scala-library-src.jar"
- symbolicName="org.scala-lang.scala-library"
- bundleName="Scala Library Sources">
- <fileset dir="${src.dir}/library"/>
- <fileset dir="${src.dir}/continuations/library"/>
- </osgi.source.bundle>
- <osgi.source.bundle destfile="${dist.dir}/src/scala-reflect-src.jar"
- symbolicName="org.scala-lang.scala-reflect"
- bundleName="Scala Reflect Sources">
- <fileset dir="${src.dir}/reflect"/>
- </osgi.source.bundle>
- <osgi.source.bundle destfile="${dist.dir}/src/scala-swing-src.jar"
- symbolicName="org.scala-lang.scala-swing"
- bundleName="Scala Swing Sources">
- <fileset dir="${src.dir}/swing"/>
- </osgi.source.bundle>
- <osgi.source.bundle destfile="${dist.dir}/src/scala-compiler-src.jar"
- symbolicName="org.scala-lang.scala-compiler"
- bundleName="Scala Compiler Sources">
- <fileset dir="${src.dir}/compiler"/>
- </osgi.source.bundle>
- <jar whenmanifestonly="fail" destfile="${dist.dir}/src/fjbg-src.jar" basedir="${src.dir}/fjbg"/>
- <jar whenmanifestonly="fail" destfile="${dist.dir}/src/msil-src.jar" basedir="${src.dir}/msil"/>
- <osgi.source.bundle destfile="${dist.dir}/src/scala-actors-src.jar"
- symbolicName="org.scala-lang.scala-actors"
- bundleName="Scala Actors Sources">
- <fileset dir="${src.dir}/actors"/>
- </osgi.source.bundle>
- <jar whenmanifestonly="fail" destfile="${dist.dir}/src/scalap-src.jar" basedir="${src.dir}/scalap"/>
- <jar whenmanifestonly="fail" destfile="${dist.dir}/src/scala-partest-src.jar" basedir="${src.dir}/partest"/>
- </target>
<target name="dist.partial" depends="dist.base">
<if><not><os family="windows"/></not><then>
- <symlink link="${dists.dir}/latest" resource="${dist.name}" overwrite="yes"/>
+ <symlink link="${dists.dir}/latest" resource="${dist.name}" overwrite="true"/>
</then><else> <!-- XXX THIS PROBABLY DOES NOT WORK: copying must happen last during dist.done! is this guaranteed? -->
<copydir dest="${dists.dir}/latest" src="${dist.dir}"/>
</else></if>
</target>
- <target name="dist.done" depends="dist.doc, dist.man, dist.src, dist.partial"/>
-
+ <target name="dist.done" depends="dist.doc, dist.man, dist.partial"/>
<!-- ===========================================================================
- STABLE REFERENCE (STARR)
+MAIN DISTRIBUTION PACKAGING
============================================================================ -->
-<!-- Does not use any properties other than ${basedir}, so that it can
- run without 'init' (when using 'replacestarrwin') -->
-
- <target name="starr.start">
- <fail message="Library in build/pack not available">
- <condition><not><and>
- <available file="${build-pack.dir}/lib/scala-library.jar"/>
- </and></not></condition>
- </fail>
- <fail message="Compiler in build/quick not available">
- <condition><not><and>
- <available file="${build-quick.dir}/classes/compiler"/>
- <available file="${build-quick.dir}/compiler.complete"/>
- </and></not></condition>
- </fail>
- </target>
-
- <target name="starr.jars" depends="starr.start">
- <copy toDir="${lib.dir}" overwrite="yes">
- <fileset dir="${build-pack.dir}/lib">
- <include name="scala-library.jar"/>
- <include name="scala-reflect.jar"/>
- <include name="scala-compiler.jar"/>
- </fileset>
- </copy>
- </target>
- <target name="starr.src" depends="starr.jars">
- <jar whenmanifestonly="fail" destfile="${lib.dir}/scala-library-src.jar">
- <fileset dir="${src.dir}/library"/>
- <fileset dir="${src.dir}/swing"/>
- <fileset dir="${src.dir}/actors"/>
- <fileset dir="${src.dir}/forkjoin"/>
- </jar>
- <jar whenmanifestonly="fail" destfile="${lib.dir}/scala-reflect-src.jar" basedir="${src.dir}/reflect"/>
- <jar whenmanifestonly="fail" destfile="${lib.dir}/scala-compiler-src.jar">
- <fileset dir="${src.dir}/compiler"/>
- <fileset dir="${src.dir}/asm"/>
- </jar>
- </target>
-
- <target name="starr.removesha1" depends="starr.src">
- <!-- remove SHA1 files for no starr, so we don't loose artifacts. -->
- <delete>
- <fileset dir="${lib.dir}">
- <include name="scala-compiler.jar.desired.sha1"/>
- <include name="scala-reflect.jar.desired.sha1"/>
- <include name="scala-library.jar.desired.sha1"/>
- <include name="scala-library-src.jar.desired.sha1"/>
- <include name="scala-reflect-src.jar.desired.sha1"/>
- <include name="scala-compiler-src.jar.desired.sha1"/>
+ <target name="pack-archives.done" depends="dist.done, docs.done">
+ <mkdir dir="${dists.dir}/archives"/>
+ <property name="archive-base" value="${dists.dir}/archives/${dist.name}"/>
+
+ <tarz name="${archive-base}">
+ <tarfileset dir="${dist.dir}" prefix="${dist.name}" includes="bin/**" mode="755"/>
+ <tarfileset dir="${dist.dir}" prefix="${dist.name}" excludes="bin/**"/>
+ </tarz>
+
+ <zip destfile="${archive-base}.zip">
+ <zipfileset prefix="${dist.name}" dir="${dist.dir}"/>
+ </zip>
+
+ <if><not><isset property="docs.skip"/></not><then>
+ <tarz name="${archive-base}-devel-docs">
+ <tarfileset dir="${dist.dir}/doc/scala-devel-docs" prefix="${dist.name}-devel-docs"/>
+ </tarz>
+ </then></if>
+
+ <tarz name="${archive-base}-sources">
+ <tarfileset dir="${basedir}" prefix="${dist.name}-sources">
+ <exclude name="bin/**"/>
+ <exclude name="build/**"/>
+ <exclude name="debian/**"/>
+ <exclude name="dists/**"/>
+ <exclude name="logs/**"/>
+ <exclude name="sandbox/**"/>
+ <exclude name="test/partest"/>
+ <exclude name=".git"/>
+ </tarfileset>
+ <tarfileset dir="${basedir}" prefix="${dist.name}-sources" filemode="755">
+ <include name="test/partest"/>
+ </tarfileset>
+ </tarz>
+
+ <!-- checksum everything -->
+ <checksum fileext=".md5">
+ <fileset dir="${dists.dir}/archives">
+ <include name="${dist.name}*"/>
</fileset>
- </delete>
+ </checksum>
+
+ <!-- UNUSED: create 'scala-latest-sources.tgz' alias (or copy, on windows)
+ we use github's source download feature
+ <if><isset property="os.win"/><then>
+ <copy tofile="${dists.dir}/archives/scala-latest-sources.tgz" overwrite="true">
+ <fileset dir="${dists.dir}/archives">
+ <include name="scala-${version.number}-sources.tgz"/>
+ </fileset>
+ </copy>
+ </then><else>
+ (be sure to use a relative symlink to make the distribution portable,
+ `resource` is relative to directory of `link`)
+ <symlink link="${dists.dir}/archives/scala-latest-sources.tgz"
+ resource="scala-${version.number}-sources.tgz"
+ overwrite="true"/>
+ </else></if> -->
</target>
- <target name="starr.done" depends="starr.jars, starr.removesha1"/>
+ <target name="pack-maven.core" depends="osgi.core, docs.core">
+ <property name="maven-base" value="${dists.dir}/maven/${version.number}"/>
+ <mkdir dir="${maven-base}"/>
- <target name="replacestarr" description="Replaces the Starr compiler and library by fresh ones built from current sources and tests them.">
- <fail message="This target is not available on Windows. Use 'ant replacestarrwin' instead.">
- <condition>
- <os family="windows"/>
- </condition>
- </fail>
- <!-- needs antcall to enforce ordering -->
- <antcall target="locker.clean"/>
- <antcall target="pack.done"/>
- <antcall target="starr.done"/>
- <antcall target="locker.clean"/>
- <antcall target="test.done"/>
+ <mvn-package project="library"/>
+ <mvn-package project="reflect"/>
+ <mvn-package project="compiler"/>
+
+ <!-- for replacestarr -->
+ <if><isset property="update.starr.version"/><then>
+ <echo message="From now on, ${maven.version.number} will be used as STARR (`build.properties`'s `starr.version` was modified)."/>
+ <propertyfile file = "build.properties">
+ <entry key = "starr.version" value="${maven.version.number}"/>
+ </propertyfile>
+ </then></if>
</target>
- <target name="replacestarr-opt" description="Replaces the Starr compiler and library by fresh, optimised ones built from current sources and tests them.">
- <optimized name="replacestarr"/></target>
+ <target name="pack-maven.base" depends="pack-maven.core, osgi.done, docs.done">
+ <!-- TODO modularize compiler
+ <mvn-package project="interactive"/>
+ <mvn-package project="scaladoc"/>
+ -->
- <!-- Ant on Windows is not able to delete jar files that are referenced in any <path>.
- See ticket 1290 on trac. -->
- <target name="replacestarrwin" description="Creates a new Starr on Windows. Manually execute 'ant locker.clean build' first!">
- <fail message="This target is only available on Windows. Use 'ant replacestarr' instead.">
- <condition>
- <not><os family="windows"/></not>
- </condition>
- </fail>
- <echo message="CAUTION: Make sure to execute 'ant locker.clean build' prior to calling 'replacestarrwin'."/>
- <antcall target="starr.done"/>
- <antcall target="locker.clean"/>
- <antcall target="test.done"/>
+ <mvn-package project="swing"/>
+ <mvn-package project="actors"/>
+ <mvn-package project="continuations-plugin"/>
+
+ <!-- don't bother fitting scalap into the mould: it will move out soon -->
+ <copy tofile="${maven-base}/scalap/scalap-pom.xml" file="${src.dir}/build/maven/scalap-pom.xml" overwrite="true"/>
+ <copy tofile="${maven-base}/scalap/scalap.jar" file="${scalap.jar}" overwrite="true"/>
+ <jar destfile="${maven-base}/scalap/scalap-src.jar" basedir="${src.dir}/scalap" whenmanifestonly="fail"/>
+ <if><not><isset property="docs.skip"/></not><then>
+ <jar destfile="${maven-base}/scalap/scalap-docs.jar" basedir="${build-docs.dir}/scalap"/>
+ </then></if>
</target>
- <target name="replacestarrwin-opt" description="Creates a new Starr on Windows. Manually execute 'ant locker.clean build' first!">
- <optimized name="replacestarrwin"/></target>
+ <target name="pack-maven.done" depends="pack-maven.base">
+ <!-- Create dists/maven/latest alias and copy maven-deploy ant build there. -->
+ <if><isset property="os.win"/><then>
+ <copy todir="${dists.dir}/maven/latest" overwrite="true">
+ <fileset dir="${maven-base}"/>
+ </copy>
+ </then><else>
+ <symlink link="${dists.dir}/maven/latest"
+ resource="${version.number}"
+ overwrite="true"/>
+ </else></if>
+ <!-- copy build file and its dependencies -->
+ <copy todir="${maven-base}"
+ file="${lib-ant.dir}/ant-contrib.jar" overwrite="true"/>
+ <copy todir="${maven-base}"
+ file="${lib-ant.dir}/maven-ant-tasks-2.1.1.jar" overwrite="true"/>
+ <copy tofile="${maven-base}/build.xml"
+ file="${src.dir}/build/maven/maven-deploy.xml"/>
+ <!-- export properties for use when deploying -->
+ <echoproperties destfile="${maven-base}/build.properties"/>
+ </target>
- <target name="replacelocker" description="Replaces the Locker compiler and library by fresh ones built from current sources."
- depends="palo.clean, locker.unlock, palo.done"/>
+ <!-- keep these properties out of ${maven-base}/build.properties, dumped in pack-maven.done -->
+ <target name="init.maven" depends="init">
+ <property name="remote.snapshot.repository" value="https://oss.sonatype.org/content/repositories/snapshots" />
+ <property name="remote.release.repository" value="https://oss.sonatype.org/service/local/staging/deploy/maven2" />
- <target name="replacelocker-opt" description="Replaces the Locker compiler and library by fresh, optimised ones built from current sources.">
- <optimized name="replacelocker"/></target>
+ <property name="local.snapshot.repository" value="${user.home}/.m2/repository" />
+ <property name="local.release.repository" value="${user.home}/.m2/repository" />
- <target name="buildlocker" description="Does the same for locker as build does for quick." depends="locker.unlock, palo.bin"/>
- <target name="unlocklocker" description="Same as buildlocker." depends="buildlocker"/> <!-- REMOVE -->
+ <property name="repository.credentials.id" value="sonatype-nexus" />
+ <property name="settings.file" value="${user.home}/.m2/settings.xml" />
- <target name="fastlocker.lib" description="Buildlocker without extra fuss" depends="locker.unlock, locker.lib">
- <property name="fastlocker" value="true"/>
+ <if><contains string="${maven.version.number}" substring="-SNAPSHOT"/><then>
+ <property name="remote.repository" value="${remote.snapshot.repository}"/>
+ <property name="local.repository" value="${local.snapshot.repository}"/>
+ </then><else>
+ <property name="remote.repository" value="${remote.release.repository}"/>
+ <property name="local.repository" value="${local.release.repository}"/>
+ </else></if>
</target>
- <target name="fastlocker.reflect" description="Buildlocker without extra fuss" depends="locker.unlock, locker.reflect">
- <property name="fastlocker" value="true"/>
- </target>
- <target name="fastlocker.comp" description="Buildlocker without extra fuss" depends="locker.unlock, locker.comp">
- <property name="fastlocker" value="true"/>
+<!-- ===========================================================================
+ MAVEN PUBLISHING
+============================================================================ -->
+ <!-- TODO: inline maven-deploy.xml here and remove it, once jenkins jobs no longer rely on it -->
+ <target name="publish" depends="pack-maven.base, init.maven" description="Publishes unsigned artifacts to the maven repo."> <deploy dir="${maven-base}/"/> </target>
+ <target name="publish.local" depends="pack-maven.base, init.maven" description="Publishes unsigned artifacts to the local maven repo."> <deploy dir="${maven-base}/" local="true"/> </target>
+ <target name="publish.signed" depends="pack-maven.base, init.maven" description="Publishes signed artifacts to the remote maven repo."> <deploy dir="${maven-base}/" signed="true"/> </target>
+
+ <target name="publish-core" depends="pack-maven.core, init.maven">
+ <deploy-one dir="${maven-base}/" name="scala-compiler" />
+ <deploy-one dir="${maven-base}/" name="scala-library" />
+ <deploy-one dir="${maven-base}/" name="scala-reflect" />
+ </target>
+ <target name="publish-core-local" depends="pack-maven.core, init.maven">
+ <deploy-one dir="${maven-base}/" name="scala-compiler" local="true"/>
+ <deploy-one dir="${maven-base}/" name="scala-library" local="true"/>
+ <deploy-one dir="${maven-base}/" name="scala-reflect" local="true"/>
</target>
- <target name="fastlocker" description="Buildlocker without extra fuss" depends="fastlocker.comp"/>
+ <target name="publish-core-opt" description="Builds an untested optimised core (library/reflect/compiler) and publishes to maven.">
+ <optimized name="publish-core"/>
+ </target>
<!-- ===========================================================================
VISUALIZATION