summaryrefslogblamecommitdiff
path: root/build.xml
blob: e570ccd1cc4a5525ead1b60bebc1fa0ddc005553 (plain) (tree)
1
2
3

                                      
 






































































































































                                                                                
                



                                           
           



                                                 
           
















                                                                      
           









                                                             
           

























































































































































































































































































































                                                                                

          
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id$ -->

<project name="scala-core" default="build">

  <description>
    I am Sabbus for Scala-core, the build system for the Scala compiler and core
    library. Please check the 'docs/README' file for more information about me.
  </description>
  
  <echo>Running Sabbus for Scala-core</echo>

  <!--
  ##############################################################################
  PROPERTIES
  ##############################################################################
  -->
  
  <property environment="env"/>
  <condition property="memory.set">
  	<contains string="${env.ANT_OPTS}" substring="-Xmx"/>
  </condition>
  <fail unless="memory.set">
    Sabbus requires additional memory. Please set the 'ANT_OPTS' environment
    property to '-Xmx256M' or more.
  </fail>

  <!-- Prevents system classpath from being used -->
  <property name="build.sysclasspath" value="ignore"/>

  <!-- Base properties -->
  <property name="docs.dir" value="${basedir}/docs"/>
  <property name="lib.dir" value="${basedir}/lib"/>
  <property name="src.dir" value="${basedir}/src"/>
  <property name="test.dir" value="${basedir}/test"/>
  <!-- User properties -->
  <property file="${basedir}/build.properties"/>
  <!-- General properties -->
  <property name="copyright" value="(c) 2002-05 LAMP/EPFL"/>
  <!-- NSC configuration properties -->
  <property name="nsc.logging" value="none"/>
  <property name="nsc.debug-info" value="true"/>
  <property name="nsc.excludes" value="build.excludes"/>
  <!-- Location of pre-compiled libraries properties -->
  <property name="starr.lib.jar" value="${lib.dir}/scala-library.jar"/>
  <property name="starr.comp.jar" value="${lib.dir}/scala-compiler.jar"/>
  <property name="jaco.jar" value="${lib.dir}/jaco.jar"/>
  <property name="fjbg.jar" value="${lib.dir}/fjbg.jar"/>
  <property name="msil.jar" value="${lib.dir}/msil.jar"/>
  <property name="scala.dll" value="${lib.dir}/scala.dll"/>
  <property name="ant.jar" value="${ant.home}/lib/ant.jar"/>
  <!-- Location of build products properties -->
  <property name="locker.dir" value="${basedir}/build/locker"/>
  <property name="quick.dir" value="${basedir}/build/quick"/>
  <property name="strap.dir" value="${basedir}/build/strap"/>
  <!-- Location of source and build elements names properties -->
  <property name="lib.dir.name" value="library"/>
  <property name="comp.dir.name" value="compiler"/>
  <property name="exec.dir.name" value="exec"/>
  <!-- Location of structure of the distribution properties -->
  <property name="distrib.unix.dir" value="${basedir}/distribs/unix"/>
  <property name="distrib.win.dir" value="${basedir}/distribs/windows"/>
  <property name="distrib.latest.dir" value="${basedir}/distribs/latest"/>
  <property name="distrib.name" value="scala"/>
  <property name="lib.jar.name" value="${distrib.name}-${lib.dir.name}.jar"/>
  <property name="comp.jar.name" value="${distrib.name}-${comp.dir.name}.jar"/>
  <property name="scala.exec.name" value="${distrib.name}"/>
  <property name="scalai.exec.name" value="${distrib.name}i"/>
  <property name="scalac.exec.name" value="${distrib.name}c"/>
  <property name="scalatok.exec.name" value="${distrib.name}tok"/>
  <property name="wrapper.exec.name" value=".${distrib.name}-wrapper"/>
  <!-- Shorcut names -->
  <property name="locker.lib.dir" value="${locker.dir}/${lib.dir.name}"/>
  <property name="locker.comp.dir" value="${locker.dir}/${comp.dir.name}"/>
  <property name="quick.lib.dir" value="${quick.dir}/${lib.dir.name}"/>
  <property name="quick.comp.dir" value="${quick.dir}/${comp.dir.name}"/>
  <property name="strap.lib.dir" value="${strap.dir}/${lib.dir.name}"/>
  <property name="strap.comp.dir" value="${strap.dir}/${comp.dir.name}"/>

  <!--
  ##############################################################################
  INITIALISATION
  ##############################################################################
  -->
  
  <target name="init">
    <!-- Testing if everything is in place -->
    <echo level="verbose">starr.lib.jar=${starr.lib.jar}</echo>
    <fail message="STARR library in 'lib/' is not available">
      <condition><not><and>
        <available classname="scala.Predef" 
                   classpath="${starr.lib.jar}"/>
        <available classname="scala.List"
                   classpath="${starr.lib.jar}"/>
        <available classname="scala.runtime.ObjectRef"
                   classpath="${starr.lib.jar}"/>
      </and></not></condition>
    </fail>
    <echo level="verbose">starr.comp.jar=${starr.comp.jar}</echo>
    <fail message="STARR compiler in 'lib/' is not available">
      <condition><not>
        <available classname="scala.tools.nsc.ant.NSC"
                   classpath="${starr.comp.jar}:${starr.lib.jar}"/>
      </not></condition>
    </fail>
    <echo level="verbose">fjbg.jar=${fjbg.jar}</echo>
    <fail message="FJBG library in 'lib/' is not available">
      <condition><not>
        <available classname="ch.epfl.lamp.fjbg.JCode"
                   classpath="${fjbg.jar}"/>
      </not></condition>
    </fail>
    <echo level="verbose">msil.jar=${msil.jar}</echo>
    <fail message="MSIL library in 'lib/' is not available">
      <condition><not>
        <available classname="ch.epfl.lamp.compiler.msil.Assembly"
                   classpath="${msil.jar}"/>
      </not></condition>
    </fail>
    <echo level="verbose">jaco.jar=${jaco.jar}</echo>
    <fail message="JaCo compiler in 'lib/' is not available">
      <condition><not>
        <available classname="jaco.pizza.Main" classpath="${jaco.jar}"/>
      </not></condition>
    </fail>
    <echo level="verbose">ant.jar=${ant.jar}</echo>
    <!-- Finding out what is available -->
    <available property="excludes.avail" file="${nsc.excludes}"/>
    <condition property="locker.avail">
      <and>
        <available classname="scala.Predef" classpath="${locker.lib.dir}"/>
        <available classname="scala.List" classpath="${locker.lib.dir}"/>
        <available classname="scala.runtime.ObjectRef"
                   classpath="${locker.lib.dir}"/>
        <available classname="scala.tools.nsc.ant.NSC"
                   classpath="${locker.comp.dir}:${locker.lib.dir}"/>
        <available file="${locker.dir}/${exec.dir.name}/${scalac.exec.name}"/>
      </and>
    </condition>
    <!-- Creating class-pathes -->
    <path id="common.classpath">
      <pathelement location="${fjbg.jar}"/>
      <pathelement location="${msil.jar}"/>
    </path>
    <path id="starr.classpath">
      <pathelement location="${starr.lib.jar}"/>
      <pathelement location="${starr.comp.jar}"/>
      <path refid="common.classpath"/>
    </path>
    <!-- Defining version number -->
  	<tstamp prefix="start"/>
    <property name="version" value="${start.DSTAMP}-${start.TSTAMP}"/>
    <!-- Creating boot-level tasks -->
    <taskdef name="starr"
             classname="scala.tools.nsc.ant.NSC"
             classpathref="starr.classpath"/>
    <taskdef name="pico"
             classname="jaco.pizza.ant.Pico"
             classpath="${jaco.jar}"/>
  </target>
  
  <target name="init.locker" depends="init, build.locker">
    <path id="locker.classpath">
      <pathelement location="${locker.dir}/${lib.dir.name}"/>
      <pathelement location="${locker.dir}/${comp.dir.name}"/>
      <path refid="common.classpath"/>
    </path>
    <taskdef name="locker"
             classname="scala.tools.nsc.ant.NSC"
             classpathref="locker.classpath"/>
  </target>
  
  <target name="init.quick" depends="init, build">
    <path id="quick.classpath">
      <pathelement location="${quick.dir}/${lib.dir.name}"/>
      <pathelement location="${quick.dir}/${comp.dir.name}"/>
      <path refid="common.classpath"/>
    </path>
    <taskdef name="quick"
             classname="scala.tools.nsc.ant.NSC"
             classpathref="quick.classpath"/>
  </target>
  
  <!--
  ##############################################################################
  BUILD SUPPORT MACROS
  ##############################################################################
  -->
  
  <macrodef name="build.exec">
    <attribute name="lib.dir"/>
    <attribute name="comp.dir"/>
    <attribute name="exec.dir"/>
    <sequential>
      <mkdir dir="@{exec.dir}"/>
      <copy file="${src.dir}/${exec.dir.name}/nscala.unix.tmpl"
            tofile="@{exec.dir}/${wrapper.exec.name}">
        <filterset>
          <filter token="version" value="${version}"/>
          <filter token="copyright" value="${copyright}"/>
          <filter token="lib.path" value="@{lib.dir}"/>
          <filter token="comp.path" value="@{comp.dir}"/>
          <filter token="fjbg.jar" value="${fjbg.jar}"/>
          <filter token="msil.jar" value="${msil.jar}"/>
          <filter token="scala.exec.name" value="${scala.exec.name}"/>
          <filter token="scalac.exec.name" value="${scalac.exec.name}"/>
          <filter token="scalai.exec.name" value="${scalai.exec.name}"/>
          <filter token="scalatok.exec.name" value="${scalatok.exec.name}"/>
        </filterset>
      </copy>
      <chmod file="@{exec.dir}/${wrapper.exec.name}" perm="ugo+rx"/>
      <symlink resource="${wrapper.exec.name}" overwrite="yes"
               link="@{exec.dir}/${scala.exec.name}"/>
      <symlink resource="${wrapper.exec.name}" overwrite="yes"
               link="@{exec.dir}/${scalac.exec.name}"/>
      <symlink resource="${wrapper.exec.name}" overwrite="yes"
               link="@{exec.dir}/${scalai.exec.name}"/>
      <symlink resource="${wrapper.exec.name}" overwrite="yes"
               link="@{exec.dir}/${scalatok.exec.name}"/>
    </sequential>
  </macrodef>
  
  <!--
  ##############################################################################
  BUILD LOCAL REFERENCE (LOCKER) LAYER
  ##############################################################################
  -->
  
  <target name="build.locker" depends="init" unless="locker.avail">
    <!-- Build library -->
    <mkdir dir="${locker.lib.dir}"/>
    <pico srcdir="${src.dir}/${lib.dir.name}"
          destdir="${locker.lib.dir}"
          scalahack="true">
      <classpath>
        <pathelement location="${locker.lib.dir}"/>
      </classpath>
      <include name="**/*.java"/>
    </pico>
    <starr srcdir="${src.dir}/${lib.dir.name}"
           destdir="${locker.lib.dir}"
           usepredefs="false"
           debuginfo="${nsc.debug-info}">
      <classpath>
        <pathelement location="${locker.lib.dir}"/>
      </classpath>
      <include name="scala/Predef.scala"/>
      <include name="scala/runtime/ScalaRunTime.scala"/>
    </starr>
    <starr srcdir="${src.dir}/${lib.dir.name}"
           destdir="${locker.lib.dir}"
           debuginfo="${nsc.debug-info}">
      <classpath>
        <pathelement location="${locker.lib.dir}"/>
      </classpath>
      <include name="**/*.scala"/>
      <exclude name="scala/Predef.scala"/>
      <exclude name="scala/runtime/ScalaRunTime.scala"/>
      <excludesfile name="${nsc.excludes}" if="excludes.avail"/>
    </starr>
    <!-- Build compiler -->
    <mkdir dir="${locker.comp.dir}"/>
    <pico srcdir="${src.dir}/${comp.dir.name}"
          destdir="${locker.comp.dir}"
          scalahack="true">
      <classpath>
        <pathelement location="${locker.lib.dir}"/>
        <pathelement location="${locker.comp.dir}"/>
      </classpath>
      <include name="**/*.java"/>
    </pico>
    <starr srcdir="${src.dir}/${comp.dir.name}"
           destdir="${locker.comp.dir}"
           debuginfo="${nsc.debug-info}">
      <classpath>
        <pathelement location="${locker.lib.dir}"/>
        <pathelement location="${locker.comp.dir}"/>
        <path refid="starr.classpath"/>
        <pathelement location="${ant.jar}"/>
      </classpath>
      <include name="**/*.scala"/>
      <excludesfile name="${nsc.excludes}" if="excludes.avail"/>
    </starr>
    <!-- Build executable files -->
    <build.exec lib.dir="${locker.lib.dir}"
                comp.dir="${locker.comp.dir}"
                exec.dir="${locker.dir}/${exec.dir.name}"/>
  </target>
  
  <!--
  ##############################################################################
  BUILD QUICK-TEST LAYER
  ##############################################################################
  -->
  
  <target name="build" depends="init.locker">
    <!-- Build library -->
    <mkdir dir="${quick.lib.dir}"/>
    <pico srcdir="${src.dir}/${lib.dir.name}"
          destdir="${quick.lib.dir}"
          scalahack="true">
      <classpath>
        <pathelement location="${quick.lib.dir}"/>
      </classpath>
      <include name="**/*.java"/>
    </pico>
    <locker srcdir="${src.dir}/${lib.dir.name}"
           destdir="${quick.lib.dir}"
           usepredefs="false"
           debuginfo="${nsc.debug-info}">
      <classpath>
        <pathelement location="${quick.lib.dir}"/>
      </classpath>
      <include name="scala/Predef.scala"/>
      <include name="scala/runtime/ScalaRunTime.scala"/>
    </locker>
    <locker srcdir="${src.dir}/${lib.dir.name}"
           destdir="${quick.lib.dir}"
           debuginfo="${nsc.debug-info}">
      <classpath>
        <pathelement location="${quick.lib.dir}"/>
      </classpath>
      <include name="**/*.scala"/>
      <exclude name="scala/Predef.scala"/>
      <exclude name="scala/runtime/ScalaRunTime.scala"/>
      <excludesfile name="${nsc.excludes}" if="excludes.avail"/>
    </locker>
    <!-- Build compiler -->
    <mkdir dir="${quick.comp.dir}"/>
    <pico srcdir="${src.dir}/${comp.dir.name}"
          destdir="${quick.comp.dir}"
          scalahack="true">
      <classpath>
        <pathelement location="${quick.lib.dir}"/>
        <pathelement location="${quick.comp.dir}"/>
      </classpath>
      <include name="**/*.java"/>
    </pico>
    <locker srcdir="${src.dir}/${comp.dir.name}"
           destdir="${quick.comp.dir}"
           debuginfo="${nsc.debug-info}">
      <classpath>
        <pathelement location="${quick.lib.dir}"/>
        <pathelement location="${quick.comp.dir}"/>
        <path refid="locker.classpath"/>
        <pathelement location="${ant.jar}"/>
      </classpath>
      <include name="**/*.scala"/>
      <excludesfile name="${nsc.excludes}" if="excludes.avail"/>
    </locker>
    <!-- Build executable files -->
    <build.exec lib.dir="${quick.lib.dir}"
                comp.dir="${quick.comp.dir}"
                exec.dir="${quick.dir}/${exec.dir.name}"/>
  </target>

  <!--
  ##############################################################################
  TEST
  ##############################################################################
  -->
  
  <target name="test" depends="init.quick">
    <!-- Build the bootstrap layer -->
    <!-- Build library -->
    <mkdir dir="${strap.lib.dir}"/>
    <pico srcdir="${src.dir}/${lib.dir.name}"
          destdir="${strap.lib.dir}"
          scalahack="true">
      <classpath>
        <pathelement location="${strap.lib.dir}"/>
      </classpath>
      <include name="**/*.java"/>
    </pico>
    <quick srcdir="${src.dir}/${lib.dir.name}"
           destdir="${strap.lib.dir}"
           usepredefs="false"
           debuginfo="${nsc.debug-info}">
      <classpath>
        <pathelement location="${strap.lib.dir}"/>
      </classpath>
      <include name="scala/Predef.scala"/>
      <include name="scala/runtime/ScalaRunTime.scala"/>
    </quick>
    <quick srcdir="${src.dir}/${lib.dir.name}"
           destdir="${strap.lib.dir}"
           debuginfo="${nsc.debug-info}">
      <classpath>
        <pathelement location="${strap.lib.dir}"/>
      </classpath>
      <include name="**/*.scala"/>
      <exclude name="scala/Predef.scala"/>
      <exclude name="scala/runtime/ScalaRunTime.scala"/>
      <excludesfile name="${nsc.excludes}" if="excludes.avail"/>
    </quick>
    <!-- Build compiler -->
    <mkdir dir="${strap.comp.dir}"/>
    <pico srcdir="${src.dir}/${comp.dir.name}"
          destdir="${strap.comp.dir}"
          scalahack="true">
      <classpath>
        <pathelement location="${strap.lib.dir}"/>
        <pathelement location="${strap.comp.dir}"/>
      </classpath>
      <include name="**/*.java"/>
    </pico>
    <quick srcdir="${src.dir}/${comp.dir.name}"
           destdir="${strap.comp.dir}"
           debuginfo="${nsc.debug-info}">
      <classpath>
        <pathelement location="${strap.lib.dir}"/>
        <pathelement location="${strap.comp.dir}"/>
        <path refid="quick.classpath"/>
        <pathelement location="${ant.jar}"/>
      </classpath>
      <include name="**/*.scala"/>
      <excludesfile name="${nsc.excludes}" if="excludes.avail"/>
    </quick>
    <!-- Build executable files -->
    <build.exec lib.dir="${strap.lib.dir}"
                comp.dir="${strap.comp.dir}"
                exec.dir="${strap.dir}/${exec.dir.name}"/>
    <!-- Compares quick and test level -->
    <checksum totalproperty="quick.md5">
      <fileset dir="${quick.dir}"/>
    </checksum>
    <delete quiet="true" failonerror="false">
      <fileset dir="${quick.dir}"><include name="**/*.MD5"/></fileset>
    </delete>
    <checksum totalproperty="strap.md5">
      <fileset dir="${strap.dir}"/>
    </checksum>
    <delete quiet="true" failonerror="false">
      <fileset dir="${strap.dir}"><include name="**/*.MD5"/></fileset>
    </delete>
    <fail message="Build is not stable">
      <condition><not>
        <equals arg1="${quick.md5}" arg2="${strap.md5}"/>
      </not></condition>
    </fail>
    <echo>Build is stable</echo>
  </target>

  <!--
  ##############################################################################
  DOCUMENT
  ##############################################################################
  -->
  
  <target name="docs">
    <echo>Docs is not available yet.</echo>
  </target>

  <!--
  ##############################################################################
  GENERATES A DISTRIBUTION
  ##############################################################################
  -->
  
  <target name="dist">
    <echo>Dist is not available yet.</echo>
  </target>
  
  <!--
  ##############################################################################
  CLEAN
  ##############################################################################
  -->
  
  <macrodef name="remove">
    <attribute name="dir"/>
    <sequential>
      <delete dir="@{dir}"
              includeemptydirs="true"
              quiet="true"
              failonerror="false"/>
    </sequential>
  </macrodef>
  
  <target name="clean">
    <remove dir="${quick.dir}"/>
    <remove dir="${strap.dir}"/>
  </target>
  
  <target name="clean.all">
    <remove dir="${locker.dir}"/>
    <remove dir="${quick.dir}"/>
    <remove dir="${strap.dir}"/>
    <remove dir="${distrib.unix.dir}"/>
    <remove dir="${distrib.win.dir}"/>
    <remove dir="${distrib.latest.dir}"/>
  </target>

</project>