summaryrefslogtreecommitdiff
path: root/build-nsc.xml
blob: 3b0d8221ca9c7ded8113ed87252b3a7a18c742b8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
<project name="scala.nsc" default="build.nsc">

  <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

                                    nsc 

                               new scala compiler

       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

       %%%
       %%%  Preliminaries
       %%%


       make jar target=LIBRARY
       make jar target=TOOLS

       You need a working scalac, which is accessible for ant.
       This means, you should have `fjbg.jar', `scala.jar' and
       `tools.jar' on your classpath 

       check the ant-build-nsc  script! adjust to your paths if necessary.

   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->

  <!-- %%% properties and taskdefs %%%-->

  <property name="hacked.pico.dir" value="/tmp/hackedPico"/>
  <property name="tools.util.dir"  value="/tmp/picoClasses"/>
  <property name="nsc.dir"         value="/tmp/nscClasses"/>
  <property name="nsc4ant.dir"     value="/tmp/nsc4antClasses"/>
  <property name="nsc.output.dir"  value="/tmp/nscOutputClasses"/>
  <property name="jars.dir"        value="/tmp/jars"/>
  <property name="ant.jar"     value="/home/linuxsoft/apps/ant/lib/ant.jar"/>

  <!-- taskdefs to call compilers -->
  
  <taskdef name="scalac" classname="scala.tools.scala4ant.ScalacTask$class"/>

  <available classname="scala.tools.scala4ant.NscTask$class"
             property="nsc4ant.present"/>

  <target name="build.hackedPicoTask">

    <mkdir dir="${hacked.pico.dir}"/>
    <javac srcdir="newsources" destdir="${hacked.pico.dir}">
      <include name="HackedPicoTask.java"/>
      <include name="HackedPicoAdaptor.java"/>
    </javac>
  </target>

  <!-- taskdef for nsc comes later, because has to be compiled before -->

  <target name="build.nsc" depends="build.hackedPicoTask">
    <mkdir dir="${tools.util.dir}"/>

    <taskdef name="pico"   classname="jaco.pizza.HackedPicoTask"/>

    <pico srcdir="sources" destdir="${tools.util.dir}" source="1.4">
      <include name="scala/*.java"/>
      <include name="scala/runtime/*.java"/>
      <include name="scala/runtime/**/*.java"/>
      <include name="scala/tools/util/*.java"/>

      <exclude name="scala/ScalaObject.java"/>
      <exclude name="scala/Array.java"/>
    </pico> 

    <!-- we do *not* want the ScalaObject.class file,
         because in nsc's eyes ScalaObject is a scala file. -->

    <delete file="${tools.util.dir}/scala/ScalaObject.class"/>
    <delete file="${tools.util.dir}/scala/Array.class"/>

    <mkdir dir="${nsc.dir}"/>
    <scalac srcdir="sources" destdir="${nsc.dir}" 
            classpath="${tools.util.dir}" sourcePath="sources" force="true">
      <!-- force = "true" always recompiles all source files, because 
           scalac does not always go find the latest source file (*3) -->

      <include name="scala/tools/nsc/**/*.scala"/>
    </scalac>

    <mkdir  dir="${jars.dir}"/>
    <jar    destfile="${jars.dir}/nsc.jar" basedir="${nsc.dir}"/>

  </target>


  <target name="clean">
    <delete dir="${tools.util.dir}"/>
    <delete dir="${nsc.dir}"/>
  </target>


  <!-- builds NscTask for use in this ant file -->

  <target name="build.nsc4ant">

    <mkdir  dir="${nsc4ant.dir}"/>
    <scalac srcdir="sources" destdir="${nsc4ant.dir}/" sourcePath="sources"
            classpath="${ant.jar}:${nsc.dir}:${tools.util.dir}:objects/main/lib/scala" >
      <include name="scala/tools/scala4ant/NscAdaptor.scala"/>
      <include name="scala/tools/scala4ant/NscTask.scala"/>
    </scalac>

    <jar destfile="${jars.dir}/nsc4ant.jar" basedir="${nsc4ant.dir}"/>
  </target>

  <!-- target to define `nsc' task using NscTask$class -->  

  <target name="define.nsc"     if = "nsc4ant.present">
    <taskdef name="nsc"    classname="scala.tools.scala4ant.NscTask$class"/>
  </target>

  <!-- if NscTask$class not found, give error message -->  

  <target name="need.nsc"   unless = "nsc4ant.present">
    <echo message="please build nsc4ant first"/>
  </target>

  <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        
       test                   test nsc compiler 

       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->

  <target name="test" depends="need.nsc, define.nsc">
    <taskdef name="nsc"
             classname="scala.tools.scala4ant.NscTask$class"/>

    <mkdir dir="${nsc.output.dir}"/>
    
    <!--java classname="scala.tools.nsc.Main"
          classpath="./objects/main/lib/scala:./objects/main/lib/tools:${jars.dir}/nsc.jar:${tools.util.dir}" >
      <arg value="-classpath"/>
      <arg value="sources:newsources:${tools.util.dir}"/>
      <arg value="-d"/>
      <arg value="/tmp"/>
      <arg value="-nopredefs"/>
      <arg value="sources/scala/Predef.scala"/>
      <arg value="sources/scala/runtime/ScalaRunTime.scala"/>


    </java

         classpath=".:sources:newsources:../newsources:${tools.util.dir}"

-->
    <echo>Compiling predef and runtime</echo>
    <nsc srcdir="sources" destdir="${nsc.output.dir}" 
         classpath="sources:newsources:${tools.util.dir}"
         nscArgs="-nopredefs;-check:term;-check:transmatch;-debug">

      <include name="scala/Predef.scala"/>
      <include name="scala/runtime/ScalaRunTime.scala"/>
    </nsc>

    <echo>Compiling rest</echo>
    <nsc srcdir="sources" destdir="${nsc.output.dir}" 
         classpath="sources:newsources:${tools.util.dir}:${nsc.output.dir}"
         nscArgs="-check:term;-check:transmatch;-debug">

      <include name="scala/**.scala"/>
      <include name="../newsources/**.scala"/>

      <exclude name="scala/Predef.scala"/>
      <exclude name="scala/runtime/ScalaRunTime.scala"/>

      <exclude name="scala/tools/**"/>
      <exclude name="scala/io/UTF8String.scala"/>
    </nsc>

 <!--
    <echo>Compiling rest</echo>
   <nsc srcdir="sources" destdir="${nsc.output.dir}" 
        classpath="sources:newsources:${tools.util.dir}">

      <include name="../sources.nsc/**/*.scala"/>

      <include name="scala/**/*.scala"/>

      <exclude name="scala/Predef.scala"/>
      <exclude name="scala/runtime/ScalaRunTime.scala"/>

      <exclude name="scala/tools/**"/>
      <exclude name="scala/io/UTF8String.scala"/>
    </nsc>
-->
  </target>
  <!--
    (*3) for Java, and pico, files are only recompiled if the source file is
    newer than the class file. This would work for scala, but mixin
    composition sometimes needs additional source files. These can
    be unavailable for some reason.
  -->
</project>