1 <project name="weka" default="compile" basedir=".">
3 ===========================================================================
4 Ant build file for weka. Tested with ant 1.6.5 and Junit 3.8.2. Requires
5 JavaMail and the java activation framework for mailing unit test results.
7 Type ant -projecthelp for targets and descriptions.
8 Assumes weka and tests (if unit testing) are in the same directory.
9 Build file can reside and be executed from either inside weka or the
10 directory containing weka.
13 ===========================================================================
16 <!-- set global properties for this build -->
17 <property name="src" value="src/main/java"/>
18 <property name="src-test" value="src/test/java"/>
19 <property name="lib" value="lib" />
20 <property name="regression_tests_root" value="src/test/resources/wekarefs"/>
21 <property name="build" value="build"/>
22 <property name="dist" value="dist"/>
23 <property name="doc" value="doc"/>
24 <property name="reports" value="reports"/>
25 <property name="javac_max_memory" value="256m"/>
26 <property name="run_tests_fail" value="true"/>
27 <property name="headless" value="false"/>
28 <property name="macdistrib" value="osx-distrib"/>
29 <property name="debug" value="on" />
31 <target name="init_all">
32 <!-- Create the time stamp -->
36 <!-- general classpath definition, incl. CLASSPATH env. variable,
37 // but jars in lib directory have precedence over the CLASSPATH variable -->
38 <path id="project.class.path">
39 <fileset dir="${lib}">
40 <include name="*.jar"/>
41 <include name="*.zip"/>
43 <pathelement location="${build}/classes"/>
44 <pathelement location="${build}/testcases"/>
45 <pathelement path="${java.class.path}" />
49 ============================================================================
50 Compilation and documentation making stuff
51 ============================================================================
54 <target name="init_compile" depends="init_all">
55 <!-- Create the build directory structure used by compile -->
56 <mkdir dir="${build}/classes"/>
59 <!-- Compile the java code from ${src}/weka into ${build}/classes -->
60 <target name="compile" depends="init_compile"
61 description="Compile weka and deposit class files in build/classes">
62 <javac srcdir="${src}"
63 fork="yes" memoryMaximumSize="${javac_max_memory}"
64 destdir="${build}/classes"
65 optimize="${optimization}"
67 deprecation="${deprecation}"
68 source="1.6" target="1.6">
70 <classpath refid="project.class.path" />
72 <copy todir="${build}/classes" >
73 <fileset dir="${src}">
74 <include name="weka/**/*.excludes"/>
75 <include name="weka/**/*.gif"/>
76 <include name="weka/**/*.png"/>
77 <include name="weka/**/*.jpeg"/>
78 <include name="weka/**/*.jpg"/>
79 <include name="weka/**/*.props"/>
80 <include name="weka/**/*.txt"/>
81 <include name="weka/**/*.xml"/>
82 <include name="weka/**/DatabaseUtils.props.*"/>
83 <include name="weka/gui/beans/README*"/>
84 <include name="**/*.cup"/>
85 <include name="**/*.flex"/>
86 <include name="**/*.jflex"/>
87 <include name="**/*.properties"/>
88 <include name="**/*.default"/>
91 <rmic base="${build}/classes"
92 classname="weka.experiment.RemoteEngine"/>
93 <unzip src="${lib}/java-cup.jar" dest="${build}/classes">
95 <include name="java_cup/runtime/**/*"/>
100 <!-- Make the javadocs -->
103 description="Make javadocs into ./doc">
104 <mkdir dir="${doc}"/>
105 <javadoc sourcepath="${src}"
106 classpathref="project.class.path"
108 packagenames="weka.*"
113 <!-- insert the links to our homepage and documentation.html -->
114 <replace dir="${doc}"
115 token=""help-doc.html""
116 value=""../documentation.html" target="_blank"">
117 <include name="**/*.html"/>
120 <replace dir="${doc}"
121 token="Help</B></FONT></A>&nbsp;</TD>"
122 value="Help</B></FONT></A>&nbsp;</TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="http://www.cs.waikato.ac.nz/ml/weka/" target="_blank"><FONT CLASS="NavBarFont1"><B>Weka's home</B></FONT></A>&nbsp;</TD>">
123 <include name="**/*.html"/>
129 ===========================================================================
131 ===========================================================================
133 <!-- Junit testing initialization -->
134 <target name="init_tests" depends="init_all">
135 <available property="junit.present" classname="junit.framework.TestCase"/>
136 <!-- Create the build directory structure used by compile -->
137 <mkdir dir="${build}/testcases"/>
138 <mkdir dir="${reports}"/>
141 <!-- compile the testcases -->
142 <target name="compile_tests" depends="init_tests, compile"
143 description="Compile unit tests into build/testcases">
144 <javac srcdir="${src-test}"
145 fork="yes" memoryMaximumSize="${javac_max_memory}"
146 destdir="${build}/testcases"
147 optimize="${optimization}"
149 deprecation="${deprecation}"
150 source="1.5" target="1.5">
151 <classpath refid="project.class.path" />
153 <copy todir="${build}/testcases" >
154 <fileset dir="${src-test}">
155 <include name="**/*.arff"/>
156 <include name="**/*.cost"/>
157 <include name="**/*.xml"/>
158 <include name="**/*.matrix"/>
163 <!-- Put everything in ${build}/testcases into the weka-tests.jar file -->
164 <target name="jar_tests" depends="compile_tests, init_dist"
165 description="Creates a jar file with the test cases in ./dist">
166 <jar jarfile="${dist}/weka-tests.jar"
167 basedir="${build}/testcases">
171 <!-- Run the test cases via junit's testrunner class.
172 This is a faster, simpler option than running the junit task -->
173 <target name="run_tests" depends="compile_tests"
174 description="Execute unit tests (fast)">
175 <java fork="yes" dir="."
176 classname="junit.textui.TestRunner"
177 taskname="junit" failonerror="${run_tests_fail}">
178 <arg value="weka.AllTests"/>
179 <classpath refid="project.class.path" />
180 <jvmarg value="-Djava.awt.headless=${headless}"/>
181 <jvmarg value="-Dweka.test.Regression.root=${regression_tests_root}"/>
185 <!-- Run the test cases and produce an html summary (in ${reports}-->
186 <target name="junit" depends="compile_tests"
187 description="Execute unit tests and produce html summary (in ./reports)">
188 <junit fork="yes" dir=".">
189 <jvmarg value="-Djava.awt.headless=${headless}"/>
190 <jvmarg value="-Dweka.test.Regression.root=${regression_tests_root}"/>
191 <formatter type="xml"/>
192 <classpath refid="project.class.path" />
193 <batchtest todir="${reports}">
194 <fileset dir="${build}/testcases">
195 <include name="**/*Test.class"/>
196 <exclude name="**/AllTests.class"/>
201 <junitreport todir="${reports}">
202 <fileset dir="${reports}">
203 <include name="TEST-*.xml"/>
205 <report format="noframes" todir="${reports}"/>
211 ===========================================================================
213 ===========================================================================
216 <target name = "init_dist" depends="init_all">
217 <!-- Create the distribution directory -->
218 <mkdir dir="${dist}"/>
221 <!-- Put everything in ${build}/classes into the weka.jar file -->
222 <target name="exejar" depends="compile, init_dist"
223 description="Create an executable jar file in ./dist">
224 <jar jarfile="${dist}/weka.jar"
225 basedir="${build}/classes">
227 <attribute name="Main-Class" value="weka.gui.GUIChooser"/>
232 <!-- Put all .java, and .props files into ${dist}/weka-src.jar-->
233 <target name="srcjar" depends="init_dist, init_all"
234 description="Create a jar file containing weka source in ./dist">
235 <!-- jar up the source -->
236 <jar jarfile="${dist}/weka-src.jar"
238 <include name="*.xml"/>
239 <include name="src/**/*.excludes"/>
240 <include name="src/**/*.gif"/>
241 <include name="src/**/*.java"/>
242 <include name="src/**/*.jpeg"/>
243 <include name="src/**/*.jpg"/>
244 <include name="src/**/*.props"/>
245 <include name="src/**/*.txt"/>
246 <include name="src/**/*.xml"/>
247 <include name="src/**/DatabaseUtils.props.*"/>
248 <include name="src/**/weka/gui/beans/README*"/>
249 <include name="src/**/*.cup"/>
250 <include name="src/**/*.flex"/>
251 <include name="src/**/*.jflex"/>
252 <include name="src/**/*.properties"/>
253 <include name="src/**/*.default"/>
254 <include name="src/**/*.cost"/>
255 <include name="src/**/*.arff"/>
256 <include name="src/**/*.matrix"/>
257 <include name="lib/**/*.jar"/>
261 <!-- make a jar file containing just the stuff needed for running a remote experiment server -->
262 <target name="remotejar" depends="compile, init_dist"
263 description="Create a jar file containing classes for remote experiments in ./dist">
264 <jar jarfile="${dist}/remoteEngine.jar"
265 basedir="${build}/classes"
266 includes="weka/experiment/*_*.class,weka/experiment/RemoteEngine*.class,weka/experiment/Compute.class,weka/experiment/Task.class,weka/experiment/TaskStatusInfo.class,weka/core/Queue*.class,weka/core/RevisionHandler.class,weka/core/Utils.class,weka/core/RevisionUtils.class"/>
267 <copy todir="${dist}" >
268 <fileset dir="${src}/weka/experiment">
269 <include name="remote.policy"/>
270 <include name="remote.policy.example"/>
273 <jar jarfile="${dist}/remoteExperimentServer.jar"
275 includes="remoteEngine.jar,remote.policy,remote.policy.example"/>
276 <delete file="${dist}/remoteEngine.jar"/>
277 <delete file="${dist}/remote.policy"/>
278 <delete file="${dist}/remote.policy.example"/>
281 <!-- Writes $release version number to weka/core/version.txt -->
282 <target name="set_version">
283 <echo message="${release}" file="${src}/weka/core/version.txt"/>
284 <echo message="${release}" file="${build}/classes/weka/core/version.txt"/>
287 <!-- Make a release -->
288 <target name="release" depends="run_tests, release_sub_tasks"
289 description="Make a release in ${release}. Run with -Drelease=<number of release (eg. 3-4-1)>.">
292 <target name="release_no_junit" depends="compile, release_sub_tasks"
293 description="Make a release in ${release} without running junit tests. Run with -Drelease=<number of release (eg. 3-4-1)>.">
296 <target name="release_sub_tasks" depends="set_version, exejar, remotejar, srcjar, docs, changelog">
297 <!-- copy the docs to dist/docs -->
299 <copy todir="weka-${release}/weka-${release}/doc" >
300 <fileset dir="${doc}"/>
302 <copy todir="weka-${release}/weka-${release}">
303 <fileset dir="${dist}"/>
305 <copy todir="weka-${release}/weka-${release}/changelogs">
306 <fileset dir="../wekadocs/changelogs"/>
308 <copy todir="weka-${release}/weka-${release}/data">
309 <fileset dir="../wekadocs/data"/>
311 <copy todir="weka-${release}/weka-${release}">
312 <fileset dir="../wekadocs">
313 <include name="*.pdf"/>
316 <copy todir="weka-${release}/weka-${release}">
317 <fileset dir="../wekadocs">
318 <include name="README*"/>
319 <include name="COPYING"/>
320 <include name="documentation.*"/>
321 <include name="weka.gif"/>
322 <include name="weka.ico"/>
325 <zip destfile="weka-${release}.zip"
326 basedir="weka-${release}"/>
329 <!-- Make a Max OSX application (NOTE: assumes that release/release_no_junit or something that calls
330 release has been run first!!!). Also requires Ant version 1.7.0 or higher -->
331 <target name="osx_application" description="Make an OS X application. Run with -Drelease=<number of release (eg. 3-4-1)>. Assumes a release target has been run first!">
332 <mkdir dir="${macdistrib}"/>
333 <mkdir dir="${macdistrib}/weka-${release}"/>
334 <copy todir="${macdistrib}/weka-${release}">
335 <fileset dir="weka-${release}/weka-${release}"/>
337 <taskdef name="jarbundler"
338 classname="net.sourceforge.jarbundler.JarBundler" />
339 <jarbundler dir="${macdistrib}"
340 name="weka-${release}"
341 mainclass="weka.gui.GUIChooser"
342 icon="${src}/weka/gui/weka_icon.icns"
348 workingdirectory="$APP_PACKAGE/Contents/Resources"
350 <javaproperty name="java.library.path" value="$APP_PACKAGE/Contents/Resources"/>
351 <jarfileset dir="weka-${release}/weka-${release}">
352 <include name="weka.jar"/>
356 <!-- Make a .dmg disk image -->
357 <exec executable="/usr/bin/hdiutil" os="Mac OS X">
358 <arg value="create"/>
359 <arg value="-srcfolder"/>
360 <arg value="${macdistrib}"/>
361 <arg value="-volname"/>
362 <arg value="weka-${release}"/>
364 <arg value="${macdistrib}/weka-${release}.dmg"/>
368 <!-- New subversion stuff -->
369 <target name="svnCheckout" description="Checkout from subversion. Run with -Dsvn_username=username -Dsvn_password=password -Dweka_branch=<branch name (e.g. trunk, branches/book2ndEd-branch)>.">
370 <property name="source-root" value="."/>
371 <property name="repository.URL" value="https://svn.scms.waikato.ac.nz/svn/weka"/>
372 <java classname="org.tmatesoft.svn.cli.SVN"
373 dir="${source-root}/" fork="true">
375 <arg value="--username"/>
376 <arg value="${svn_username}"/>
377 <arg value="--password"/>
378 <arg value="${svn_password}"/>
379 <arg value="${repository.URL}/${weka_branch}/weka"/>
381 <pathelement location="${ant.home}/lib/svnkit.jar" />
382 <pathelement location="${ant.home}/lib/svnkit-cli.jar" />
385 <java classname="org.tmatesoft.svn.cli.SVN"
386 dir="${source-root}/" fork="true">
388 <arg value="--username"/>
389 <arg value="${svn_username}"/>
390 <arg value="--password"/>
391 <arg value="${svn_password}"/>
392 <arg value="${repository.URL}/${weka_branch}/wekadocs"/>
394 <pathelement location="${ant.home}/lib/svnkit.jar" />
395 <pathelement location="${ant.home}/lib/svnkit-cli.jar" />
398 <java classname="org.tmatesoft.svn.cli.SVN"
399 dir="${source-root}/" fork="true">
401 <arg value="--username"/>
402 <arg value="${svn_username}"/>
403 <arg value="--password"/>
404 <arg value="${svn_password}"/>
405 <arg value="${repository.URL}/${weka_branch}/installer"/>
407 <pathelement location="${ant.home}/lib/svnkit.jar" />
408 <pathelement location="${ant.home}/lib/svnkit-cli.jar" />
413 <target name="changelog"
414 description="Create a changelog file for a release of Weka. Run with -Dsvn_username=username -Dsvn_password=password -Drelease=<number of release (eg. 3-4-1)>, -Ddate_range=<date range for changes (eg. {2008-07-16}:{2008-09-29})>, -Dweka_branch=<branch name (e.g. trunk, branches/book2ndEd-branch)>.">
415 <property name="repository.URL" value="https://svn.scms.waikato.ac.nz/svn/weka"/>
416 <java classname="org.tmatesoft.svn.cli.SVN" fork="true"
417 output="../wekadocs/changelogs/CHANGELOG-${release}">
419 <arg value="--username"/>
420 <arg value="${svn_username}"/>
421 <arg value="--password"/>
422 <arg value="${svn_password}"/>
424 <arg value="${date_range}"/>
426 <arg value="${repository.URL}/${weka_branch}/weka/src/main/java/weka"/>
428 <pathelement location="${ant.home}/lib/svnkit.jar" />
429 <pathelement location="${ant.home}/lib/svnkit-cli.jar" />
434 <!-- This target is used for an automated nightly/weekly build job -->
435 <target name="nightly_build"
437 description="Does a svn checkout, builds, runs unit tests, and mails the output to mail recipients (run ant with -Dsvn_username=username -Dsvn_password=password -Dweka_branch=branch -Dmail_recipients=<email,email,...> -Dmail_sender=email -Dmail_smtp_host=smtp-server)">
439 <!-- run the build process -->
440 <ant antfile="${ant.file}" target="svnCheckout" output="${reports}/nightly_build-init.txt">
441 <property name="mail_smtp_host" value="${mail_smtp_host}"/>
442 <property name="mail_sender" value="${mail_sender}"/>
443 <property name="mail_recipients" value="${mail_recipients}"/>
444 <property name="svn_username" value="${svn_username}"/>
445 <property name="svn_password" value="${svn_password}"/>
446 <property name="weka_branch" value="${weka_branch}"/>
449 <ant antfile="${ant.file}" dir="weka" target="run_tests" output="../${reports}/nightly_build-results.txt">
450 <property name="mail_smtp_host" value="${mail_smtp_host}"/>
451 <property name="mail_sender" value="${mail_sender}"/>
452 <property name="mail_recipients" value="${mail_recipients}"/>
453 <property name="run_tests_fail" value="false"/>
454 <property name="headless" value="${headless}"/>
457 <!-- mail the results -->
458 <mail messageMimeType="text/html"
459 tolist="${mail_recipients}"
460 mailhost="${mail_smtp_host}"
461 subject="nightly build results (${weka_branch}): ${TODAY}"
462 from="${mail_sender}">
463 <fileset dir="${reports}">
464 <include name="nightly_build*.*"/>
471 <target name="clean" depends="init_all"
472 description="Removes the build, dist and reports directories">
473 <!-- Delete the ${build} and ${dist} directory trees -->
474 <delete dir="${build}"/>
475 <delete dir="${dist}"/>
476 <delete dir="${reports}"/>
479 <target name="superclean" depends="clean"
480 description="Clean plus removes source trees! and doc directories">
481 <!-- WARNING, this deletes the source and doc directories -->
482 <delete dir="${src}"/>
483 <delete dir="${doc}"/>