blob: 298c5c04a3510f3f149b42e741c8551e4c1e47f7 [file] [log] [blame]
<project name="buck" default="default">
<property environment="env"/>
<property name="src.dir" value="${basedir}/src" />
<property name="aosp.src.dir" value="third-party/java/aosp/src" />
<property name="test.dir" value="${basedir}/test" />
<property name="third-party.dir" value="${basedir}/third-party" />
<property name="build.dir" value="${basedir}/build" />
<property name="aosp.classes.dir" value="${build.dir}/aosp/classes" />
<property name="testrunner.classes.dir" value="${build.dir}/testrunner/classes" />
<property name="bootstrapper.src.dir" value="com/facebook/buck/cli/bootstrapper/" />
<property name="bootstrapper.classes.dir" value="${build.dir}/bootstrapper/classes" />
<property name="buck.path_to_compile_asset_catalogs_py" value="${basedir}/src/com/facebook/buck/apple/compile_asset_catalogs.py" />
<property name="buck.path_to_compile_asset_catalogs_build_phase_sh" value="${basedir}/src/com/facebook/buck/apple/compile_asset_catalogs_build_phase.sh" />
<property name="buck.path_to_sh_binary_template" value="${basedir}/src/com/facebook/buck/shell/sh_binary_template" />
<property name="buck.logging_config_file" value="${basedir}/config/logging.properties" />
<property name="buck.test_logging_config_file" value="${basedir}/config/logging.test.properties" />
<property name="buck.log4j_config_file" value="${basedir}/config/log4j.properties" />
<property name="classes.dir" value="${build.dir}/classes" />
<property name="testclasses.dir" value="${build.dir}/testclasses" />
<property name="javadoc.dir" value="${build.dir}/javadoc" />
<property name="javadoc-with-android.dir" value="${build.dir}/javadoc-with-android" />
<property name="javadoc-all.dir" value="${build.dir}/javadoc-all" />
<property name="client.dir" value="third-party/nailgun" />
<property name="test.class" value="Test" />
<property name="lint.outputpath" value="${build.dir}/lint.output" />
<property name="dx.base.dir" value="${basedir}/third-party/java/dx-from-kitkat" />
<property name="dx.src.dir" value="${dx.base.dir}/src" />
<property name="dx.test.dir" value="${dx.base.dir}/tests" />
<property name="dx.etc.dir" value="${dx.base.dir}/etc" />
<property name="dx.classes.dir" value="${build.dir}/dx_classes" />
<property name="eclipse.dir" value="${basedir}/third-party/java/eclipse" />
<property name="pathlib.dir" value="${third-party.dir}/py/pathlib" />
<property name="unittest2.dir" value="${third-party.dir}/py/unittest2" />
<property name="immutables-value-standalone.jar" value="${third-party.dir}/java/immutables/value-standalone-1.1.2.jar" />
<property name="immutables.gensrc.dir" value="${build.dir}/immutables" />
<property name="immutables.gensrc.test.dir" value="${build.dir}/immutables-tests" />
<fileset dir="${third-party.dir}/java" id="buck.jars">
<include name="args4j/args4j-2.0.30.jar" />
<include name="ddmlib/ddmlib-22.5.3.jar" />
<include name="guava/guava-18.0.jar" />
<include name="ini4j/ini4j-0.5.2.jar" />
<include name="jackson/jackson-annotations-2.0.5.jar" />
<include name="jackson/jackson-core-2.0.5.jar" />
<include name="jackson/jackson-databind-2.0.5.jar" />
<include name="jackson/jackson-datatype-jdk7-2.5.0.jar" />
<include name="jsr/jsr305.jar" />
<include name="android/sdklib.jar" />
<include name="nailgun/nailgun-server-0.9.2-SNAPSHOT.jar" />
</fileset>
<fileset dir="${third-party.dir}/java" id="third-party.jars">
<include name="asm/asm-debug-all-5.0.3.jar" />
<include name="auto-service/auto-service-1.0-rc1.jar" />
<include name="aopalliance/aopalliance.jar" />
<include name="astyanax/astyanax-cassandra-1.56.38.jar" />
<include name="astyanax/astyanax-cassandra-1.56.38-javadoc.jar" />
<include name="astyanax/astyanax-cassandra-1.56.38-sources.jar" />
<include name="astyanax/astyanax-core-1.56.38.jar" />
<include name="astyanax/astyanax-thrift-1.56.38.jar" />
<include name="astyanax/cassandra-1.2.3.jar" />
<include name="astyanax/cassandra-thrift-1.2.3.jar" />
<include name="astyanax/high-scale-lib-1.1.2.jar" />
<include name="closure-templates/soy-excluding-deps.jar" />
<include name="commons-cli/commons-cli-1.1.jar" />
<include name="commons-codec/commons-codec-1.2.jar" />
<include name="commons-compress/commons-compress-1.8.1.jar" />
<include name="commons-lang/commons-lang-2.6.jar" />
<include name="dd-plist/dd-plist.jar" />
<include name="eclipse/org.eclipse.core.contenttype_3.4.200.v20130326-1255.jar" />
<include name="eclipse/org.eclipse.core.jobs_3.5.300.v20130429-1813.jar" />
<include name="eclipse/org.eclipse.core.resources_3.8.101.v20130717-0806.jar" />
<include name="eclipse/org.eclipse.core.runtime_3.9.100.v20131218-1515.jar" />
<include name="eclipse/org.eclipse.equinox.common_3.6.200.v20130402-1505.jar" />
<include name="eclipse/org.eclipse.equinox.preferences_3.5.100.v20130422-1538.jar" />
<include name="eclipse/org.eclipse.jdt.core_3.9.2.v20140114-1555.jar" />
<include name="eclipse/org.eclipse.osgi_3.9.1.v20140110-1610.jar" />
<include name="guice/guice-3.0.jar" />
<include name="guice/guice-assistedinject-3.0.jar" />
<include name="guice/guice-multibindings-3.0.jar" />
<include name="gson/gson-2.2.4.jar" />
<include name="icu4j/icu4j-54.1.1.jar" />
<include name="immutables/value-1.1.2.jar" />
<include name="infer-annotations/infer-annotations-1.5.jar" />
<include name="jacoco/org.jacoco.core-0.7.2.201409121644.jar" />
<include name="jacoco/org.jacoco.report-0.7.2.201409121644.jar" />
<include name="jetty/jetty-all-9.0.4.v20130625.jar" />
<include name="jetty/servlet-api.jar" />
<include name="joda-time/joda-time-2.2.jar" />
<include name="jsr/javax.inject-1.jar" />
<include name="log4j/log4j-1.2.16.jar" />
<include name="parboiled/parboiled-core-1.1.6.jar" />
<include name="parboiled/parboiled-java-1.1.6.jar" />
<include name="slf4j/slf4j-api-1.7.2.jar" />
<include name="slf4j/slf4j-log4j12-1.7.2.jar" />
<include name="stringtemplate/ST-4.0.8.jar" />
<include name="thrift/libthrift-0.7.0.jar" />
<include name="xz-java-1.3/xz-1.3.jar" />
</fileset>
<path id="classpath-no-src">
<fileset refid="buck.jars" />
<fileset refid="third-party.jars" />
<pathelement location="${classes.dir}" />
<pathelement location="${dx.classes.dir}" />
</path>
<path id="classpath">
<path refid="classpath-no-src" />
<pathelement location="${src.dir}" />
<pathelement location="${immutables.gensrc.dir}" />
</path>
<path id="classpath-generate-immutables">
<fileset refid="buck.jars" />
<fileset refid="third-party.jars" />
<pathelement location="${aosp.classes.dir}" />
</path>
<path id="junit">
<pathelement location="${third-party.dir}/java/junit/junit-4.11.jar" />
<pathelement location="${third-party.dir}/java/hamcrest/hamcrest-core-1.3.jar" />
<pathelement location="${third-party.dir}/java/hamcrest/hamcrest-library-1.3.jar" />
<pathelement location="${third-party.dir}/java/testng/testng-6.8.jar" />
</path>
<target name="clean" description="remove all generated files">
<delete dir="${build.dir}" />
</target>
<!-- Default target so that a command line build can
do more than one thing. -->
<target name="default" depends="compile, dx, client, report-generator-jar" />
<target name="checkversion">
<!-- The nio Files class was only introduced in Java 7. -->
<available property="jdk7" classname="java.nio.file.Files"/>
<fail message="Require JDK 7 or higher" unless="jdk7"/>
</target>
<target name="compile-testrunner" depends="checkversion">
<mkdir dir="${testrunner.classes.dir}" />
<javac srcdir="${src.dir}"
includes="com/facebook/buck/junit/**,src/com/facebook/buck/util/concurrent/MoreExecutors.java"
destdir="${testrunner.classes.dir}"
classpathref="junit"
debug="on"
includeAntRuntime="no"
>
<compilerarg value="-Xlint:rawtypes" />
<compilerarg value="-Xlint:unchecked" />
<compilerarg value="-Xlint:serial" />
</javac>
</target>
<target name="compile-bootstrapper" depends="checkversion">
<mkdir dir="${bootstrapper.classes.dir}" />
<ecj destdir="${bootstrapper.classes.dir}">
<javac-params>
<include name="${bootstrapper.src.dir}/**/*.java" />
</javac-params>
</ecj>
</target>
<path id="immutables-classpath">
<path refid="classpath" />
<pathelement location="${immutables-value-standalone.jar}" />
<pathelement location="${src.dir}" />
<pathelement location="${aosp.classes.dir}" />
</path>
<!-- The set of Immutables value type source files which have not
yet been run through the javac annotation processor. -->
<fileset dir="${src.dir}" id="immutables-srcs">
<!-- Speed up the build by only running javac on files containing Immutables. -->
<contains text="org.immutables" />
<exclude name="com/facebook/buck/android/support/**" />
<exclude name="com/facebook/buck/cli/quickstart/**" />
<exclude name="com/facebook/buck/junit/**" />
<!-- Only run javac on immutables files which have changed since the last build. -->
<modified>
<param name="cache.cachefile" value="${build.dir}/immutables.modified.properties" />
</modified>
</fileset>
<target name="check-immutables">
<!--
javac rules don't support filesets, but they do support comma-separated lists of
sources in the includes parameter.
However, if the includes parameter is empty, the javac rule will build everything,
which we don't want. So we have to skip the generate-immutables step entirely
in that case.
This sets ${immutables-srcs-flattened} to a comma-separated list of files to build,
then sets ${generate-immutables-needed} to true iff that variable is non-empty.
-->
<pathconvert property="immutables-srcs-flattened" pathsep="," refid="immutables-srcs">
<map from="${src.dir}/" to=""/>
</pathconvert>
<condition property="generate-immutables-needed">
<length string="${immutables-srcs-flattened}" when="greater" length="0" />
</condition>
</target>
<target name="compile-aosp" depends="checkversion">
<mkdir dir="${aosp.classes.dir}" />
<ecj srcdir="${aosp.src.dir}" destdir="${aosp.classes.dir}">
<ecj-params>
<!-- ManifestMerger.java has redundant null checks -->
<compilerarg value="-err:-null" />
</ecj-params>
</ecj>
</target>
<target name="generate-immutables" depends="compile-aosp, check-immutables" if="${generate-immutables-needed}">
<mkdir dir="${immutables.gensrc.dir}" />
<javac srcdir="${src.dir}:${immutables.gensrc.dir}"
classpathref="classpath-generate-immutables"
includeAntRuntime="no"
includes="${immutables-srcs-flattened}">
<compilerarg value="-processorpath" />
<compilerarg value="${immutables-value-standalone.jar}" />
<compilerarg value="-processor" />
<compilerarg value="org.immutables.value.internal.processor.Processor" />
<compilerarg value="-proc:only" />
<compilerarg value="-s" />
<compilerarg value="${immutables.gensrc.dir}" />
</javac>
</target>
<macrodef name="ecj" description="Compile Java using the ecj compiler with strict checks.">
<attribute name="srcdir" default="${src.dir}" />
<attribute name="classpathref" default="classpath-no-src" />
<attribute name="destdir" default="${classes.dir}" />
<!--
javac-params can contain any extra parameters to the javac ant command.
include and exclude elements are automatically relative to ${src.dir}.
According to http://ant.apache.org/manual/Tasks/javac.html, the only way
to enumerate the .java inputs to javac in Ant is to set the sourcepath
to the empty string, set the srcdir to something, and use include/exclude
elements to filter things under the srcdir.
-->
<element name="javac-params" optional="true" />
<!--
ecj-params can contain any extra paramters to the Eclipse batch compiler.
-->
<element name="ecj-params" optional="true" />
<sequential>
<javac srcdir="@{srcdir}"
sourcepath=""
destdir="@{destdir}"
classpathref="@{classpathref}"
debug="on"
deprecation="on"
includeAntRuntime="no"
compiler="org.eclipse.jdt.core.JDTCompilerAdapter"
>
<javac-params />
<!--
ecj does not appear to support -Werror. As suggested by
http://stackoverflow.com/a/14927725/396304, we specify an Eclipse preferences
file to ECJ with the rules we want to enforce set to error.
To see the full list of compiler options available, read the Javadoc for JavaCore at:
http://help.eclipse.org/kepler/index.jsp?topic=%2Forg.eclipse.jdt.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fjdt%2Fcore%2FJavaCore.html
Apparently Eclipse refuses to publish traditional Javadoc with manageable URLs.
-->
<compilerarg line="-properties ${eclipse.dir}/org.eclipse.jdt.core.prefs" />
<compilerarg value="-Xlint:rawtypes" />
<compilerarg value="-Xlint:unchecked" />
<compilerarg value="-Xlint:serial" />
<compilerarg value="-time" />
<compilerclasspath>
<pathelement location="${eclipse.dir}/org.eclipse.jdt.core_3.9.2.v20140114-1555.jar" />
<pathelement location="${eclipse.dir}/jdtCompilerAdapter.jar" />
</compilerclasspath>
<ecj-params />
</javac>
</sequential>
</macrodef>
<target name="compile"
depends="compile-testrunner, compile-bootstrapper, dx, generate-immutables"
description="compile Java source code">
<mkdir dir="${classes.dir}" />
<ecj>
<javac-params>
<!-- //src/com/facebook/buck/io:io -->
<include name="com/facebook/buck/io/PathListing.java" />
<!-- //src/com/facebook/buck/log:log -->
<include name="com/facebook/buck/log/CommandThreadAssociation.java" />
<include name="com/facebook/buck/log/CommandThreadFactory.java" />
<include name="com/facebook/buck/log/ConsoleHandler.java" />
<include name="com/facebook/buck/log/GlobalState.java" />
<include name="com/facebook/buck/log/LogConfig.java" />
<include name="com/facebook/buck/log/LogConfigPaths.java" />
<include name="com/facebook/buck/log/LogFormatter.java" />
<include name="com/facebook/buck/log/Logger.java" />
<!-- //src/com/facebook/buck/util:concurrent -->
<include name="com/facebook/buck/util/concurrent/MoreExecutors.java" />
<include name="com/facebook/buck/util/concurrent/MoreFutures.java" />
<include name="com/facebook/buck/util/concurrent/TimeSpan.java" />
<!-- //src/com/facebook/buck/util:exceptions -->
<include name="com/facebook/buck/util/ExceptionWithHumanReadableMessage.java" />
<include name="com/facebook/buck/util/HumanReadableException.java" />
<include name="com/facebook/buck/util/WatchmanWatcherException.java" />
<!-- //src/com/facebook/buck/util:io -->
<include name="com/facebook/buck/util/Ansi.java" />
<include name="com/facebook/buck/util/AnsiEnvironmentChecking.java" />
<include name="com/facebook/buck/util/Console.java" />
<include name="com/facebook/buck/util/CapturingPrintStream.java" />
<include name="com/facebook/buck/util/DefaultDirectoryTraverser.java" />
<include name="com/facebook/buck/util/DirectoryTraverser.java" />
<include name="com/facebook/buck/util/DirectoryTraversal.java" />
<include name="com/facebook/buck/util/DirtyPrintStreamDecorator.java" />
<include name="com/facebook/buck/util/ImmutableProcessExecutorParams.java" />
<include name="com/facebook/buck/util/InputStreamConsumer.java" />
<include name="com/facebook/buck/util/MoreFiles.java" />
<include name="com/facebook/buck/util/MorePaths.java" />
<include name="com/facebook/buck/util/MorePosixFilePermissions.java" />
<include name="com/facebook/buck/util/PkillProcessManager.java" />
<include name="com/facebook/buck/util/ProcessExecutor.java" />
<include name="com/facebook/buck/util/ProcessExecutorParams.java" />
<include name="com/facebook/buck/util/ProcessManager.java" />
<include name="com/facebook/buck/util/ProjectFilesystem.java" />
<include name="com/facebook/buck/util/Threads.java" />
<include name="com/facebook/buck/util/Verbosity.java" />
<!-- //src/com/facebook/buck/util:constants -->
<include name="com/facebook/buck/util/BuckConstant.java" />
<!-- //src/com/facebook/buck/util/environment:platform -->
<include name="com/facebook/buck/util/environment/Platform.java" />
<!-- //src/com/facebook/buck/util/immutables:immutables -->
<include name="com/facebook/buck/util/immutables/BuckStyleImmutable.java" />
<!-- //src/com/facebook/buck/zip:stream -->
<include name="com/facebook/buck/zip/AppendingZipOutputStream.java" />
<include name="com/facebook/buck/zip/ByteIo.java" />
<include name="com/facebook/buck/zip/CentralDirectory.java" />
<include name="com/facebook/buck/zip/CustomZipOutputStream.java" />
<include name="com/facebook/buck/zip/CustomZipEntry.java" />
<include name="com/facebook/buck/zip/EntryAccounting.java" />
<include name="com/facebook/buck/zip/OverwritingZipOutputStream.java" />
<include name="com/facebook/buck/zip/ZipOutputStreams.java" />
<!-- //src/com/facebook/buck/timing:timing -->
<include name="com/facebook/buck/timing/*.java" />
<src path="${immutables.gensrc.dir}" />
</javac-params>
</ecj>
<!-- Copy in scripts we need at run time when using an unpacked buck -->
<copy file="src/com/facebook/buck/json/buck.py" todir="${classes.dir}/com/facebook/buck/json"/>
<!--
Compile code from AOSP using the default compiler.
Using ecj spits out too many warnings that are not our responsibility to fix.
-->
<javac destdir="${classes.dir}"
classpathref="classpath"
debug="on"
deprecation="on"
includeAntRuntime="no"
>
<src path="${aosp.src.dir}" />
<compilerarg value="-Xlint:rawtypes" />
<compilerarg value="-Xlint:unchecked" />
<compilerarg value="-Xlint:serial" />
</javac>
<!--
Note that the inputs to this <ecj> task overlap with those from the previous
<ecj> task. It's too much work to exclude them here.
-->
<ecj>
<javac-params>
<!--
These patterns are excluded because they are compiled elsewhere
and are deliberately isolated from Buck's core.
-->
<exclude name="com/facebook/buck/android/support/**" />
<exclude name="com/facebook/buck/cli/bootstrapper/**" />
<exclude name="com/facebook/buck/cli/quickstart/**" />
<exclude name="com/facebook/buck/junit/**" />
<src path="${immutables.gensrc.dir}" />
</javac-params>
</ecj>
</target>
<fileset dir="${third-party.dir}/java" id="dx.jars">
<include name="guava/guava-18.0.jar" />
</fileset>
<path id="dx.classpath">
<fileset refid="dx.jars" />
</path>
<target name="dx-check-build">
<uptodate property="dx-build-not-required" targetfile="${build.dir}/dx.jar">
<srcfiles dir="${dx.src.dir}" includes="**/*.java" />
<srcfiles dir="${third-party.dir}/java/guava" includes="guava-*.jar" />
<srcfiles dir="${third-party.dir}/java/junit" includes="junit-*.jar" />
</uptodate>
</target>
<target name="dx" depends="dx-check-build" unless="dx-build-not-required">
<mkdir dir="${dx.classes.dir}" />
<javac destdir="${dx.classes.dir}"
classpathref="dx.classpath"
debug="on"
deprecation="on"
includeAntRuntime="no"
>
<src path="${dx.src.dir}" />
</javac>
<jar destfile="${build.dir}/dx.jar">
<zipfileset includes="**/*.class" src="${third-party.dir}/java/guava/guava-18.0.jar"/>
<zipfileset includes="**/*.class" src="${third-party.dir}/java/junit/junit-4.11.jar" />
<fileset dir="${dx.classes.dir}" />
<manifest>
<attribute name="Main-Class" value="com.android.dx.command.Main" />
</manifest>
</jar>
</target>
<!--
Note: two of the dx tests (the two tests for the merger) run the command
"dalvik" and expect it to be a working dalvik virtual machine.
Fulfilling this expectation is no easy task. Here's how I did it.
- Be on Linux (Dalvik doesn't build for Mac).
- Check out Android (I used ICS because I had it lying around).
- make -kj25 dalvik-host
- If you built on a remote machine, rsync "out" to where you are
developing Buck, inside of a dedicated directory called "android"
or something.
- Edit android/out/host/linux-x86/dalvik to change the log tags to
"*:w", because a spurious info message was messing up the test.
- Delete android/out/host/linux-x86/dx so the tests will use our dx.
- Run this rule as
ANDROID_BUILD_TOP=/path/to/android PATH=$PATH:$ANDROID_BUILD_TOP/out/host/linux-x86/bin ant dx-tests
-->
<target name="dx-tests" depends="dx">
<exec
failonerror="true"
dir="${dx.test.dir}"
executable="./run-all-tests">
<env key="PATH" path="${env.PATH}:${dx.etc.dir}"/>
</exec>
</target>
<target name="jar" depends="buck-jar, report-generator-jar"/>
<target name="buck-jar"
depends="compile"
description="build buck.jar"
>
<jar destfile="${build.dir}/buck.jar" update="true">
<zipfileset refid="buck.jars" />
<zipfileset refid="third-party.jars" />
<fileset dir="${src.dir}"
excludes="**/*.java, **/BUCK"
/>
<fileset dir="${classes.dir}" />
<manifest>
<attribute name="Main-Class" value="com.facebook.buck.cli.Main" />
</manifest>
</jar>
</target>
<target name="report-generator-jar" depends="compile">
<jar destfile="${build.dir}/report-generator.jar">
<zipfileset excludes="**/*SF **/*RSA" src="${third-party.dir}/java/jacoco/org.jacoco.core-0.7.2.201409121644.jar"/>
<zipfileset excludes="**/*SF **/*RSA" src="${third-party.dir}/java/jacoco/org.jacoco.report-0.7.2.201409121644.jar"/>
<zipfileset excludes="**/*SF **/*RSA" src="${third-party.dir}/java/asm/asm-debug-all-5.0.3.jar"/>
<fileset dir="${classes.dir}">
<include name="com/facebook/buck/java/ReportGenerator.class"/>
</fileset>
<manifest>
<attribute name="Main-Class" value="com.facebook.buck.java.ReportGenerator" />
</manifest>
</jar>
</target>
<path id="tests.classpath">
<path refid="classpath" />
<fileset dir="${third-party.dir}/java">
<include name="cglib/cglib-nodep-2.2.jar" />
<include name="easymock/easymock-3.0.jar" />
<include name="hamcrest/hamcrest-core-1.3.jar" />
<include name="hamcrest/hamcrest-library-1.3.jar" />
<include name="junit/junit-4.11.jar" />
<include name="objenesis/objenesis-1.2.jar" />
</fileset>
<pathelement location="${testclasses.dir}" />
<pathelement location="${test.dir}" />
<pathelement location="${testrunner.classes.dir}" />
<pathelement location="${immutables.gensrc.dir}" />
<pathelement location="${immutables.gensrc.test.dir}" />
</path>
<!-- The set of Immutables value type source files which have not
yet been run through the javac annotation processor. -->
<fileset dir="${test.dir}" id="immutables-test-srcs">
<!-- Speed up the build by only running javac on files containing Immutables. -->
<contains text="org.immutables" />
<exclude name="**/testdata/**" />
<!-- Only run javac on immutables files which have changed since the last build. -->
<modified>
<param name="cache.cachefile" value="${build.dir}/immutables.test.modified.properties" />
</modified>
</fileset>
<target name="check-test-immutables">
<!--
javac rules don't support filesets, but they do support comma-separated lists of
sources in the includes parameter.
However, if the includes parameter is empty, the javac rule will build everything,
which we don't want. So we have to skip the generate-immutables step entirely
in that case.
This sets ${immutables-test-srcs-flattened} to a comma-separated list of files to build,
then sets ${generate-test-immutables-needed} to true iff that variable is non-empty.
-->
<pathconvert property="immutables-test-srcs-flattened" pathsep="," refid="immutables-test-srcs">
<map from="${test.dir}/" to=""/>
</pathconvert>
<condition property="generate-test-immutables-needed">
<length string="${immutables-test-srcs-flattened}" when="greater" length="0" />
</condition>
</target>
<target name="generate-test-immutables" depends="compile, check-test-immutables" if="${generate-test-immutables-needed}">
<mkdir dir="${immutables.gensrc.test.dir}" />
<javac srcdir="${test.dir}:${immutables.gensrc.test.dir}"
includes="${immutables-test-srcs-flattened}"
classpathref="tests.classpath"
includeAntRuntime="no">
<compilerarg value="-processorpath" />
<compilerarg value="${immutables-value-standalone.jar}" />
<compilerarg value="-processor" />
<compilerarg value="org.immutables.value.internal.processor.Processor" />
<compilerarg value="-proc:only" />
<compilerarg value="-s" />
<compilerarg value="${immutables.gensrc.test.dir}" />
</javac>
</target>
<target name="compile-tests"
depends="compile, generate-test-immutables"
>
<mkdir dir="${testclasses.dir}" />
<mkdir dir="${immutables.gensrc.dir}" />
<ecj srcdir="${test.dir}"
destdir="${testclasses.dir}"
classpathref="tests.classpath"
>
<javac-params>
<exclude name="**/testdata/**" />
</javac-params>
</ecj>
</target>
<target name="java-test"
depends="compile-tests"
description="runs the Java tests"
>
<junit failureproperty="hasFailingTests"
showoutput="true"
forkmode="perBatch"
haltonerror="on">
<sysproperty key="buck.path_to_compile_asset_catalogs_py" value="${buck.path_to_compile_asset_catalogs_py}" />
<sysproperty key="buck.path_to_compile_asset_catalogs_build_phase_sh" value="${buck.path_to_compile_asset_catalogs_build_phase_sh}" />
<sysproperty key="buck.logging_config_file" value="${buck.test_logging_config_file}" />
<sysproperty key="log4j.configuration" value="file:${buck.log4j_config_file}" />
<sysproperty key="java.util.logging.config.class" value="com.facebook.buck.log.LogConfig" />
<!-- See DEFS for details on why this property is needed. -->
<sysproperty key="sun.zip.disableMemoryMapping" value="true" />
<formatter type="plain" usefile="false" />
<batchtest fork="yes">
<fileset dir="${test.dir}">
<!--
Do not exclude tests that start with "Abstract", as there are some tests for abstract
classes.
-->
<include name="**/*${test.class}.java" />
<exclude name="**/testdata/**" />
</fileset>
</batchtest>
<classpath refid="tests.classpath" />
</junit>
<fail if="hasFailingTests" />
</target>
<target name="py-test" description="runs the Python tests" depends="buck-py-test, class-loader-py-test, asset-catalogs-py-test, pathlib-py-test" />
<target name="buck-py-test" description="tests the BUCK parser">
<exec executable="python" failonerror="true">
<env key="PYTHONPATH" path="${pathlib.dir}" />
<arg value="src/com/facebook/buck/json/buck_test.py" />
</exec>
</target>
<target name="class-loader-py-test" description="tests BUCK's class loader setup">
<exec executable="python" failonerror="true">
<env key="PYTHONPATH" path="${pathlib.dir}" />
<arg value="test/com/facebook/buck/cli/bootstrapper/class_loader_test.py" />
</exec>
</target>
<target name="asset-catalogs-py-test" description="tests the asset catalogs compiler">
<exec executable="python" failonerror="true">
<arg value="src/com/facebook/buck/apple/compile_asset_catalogs_test.py" />
</exec>
</target>
<target name="pathlib-py-test" description="tests pathlib.py">
<exec executable="python" failonerror="true" dir="${pathlib.dir}">
<!-- Needed on Python 2.6. -->
<env key="PYTHONPATH" path="${unittest2.dir}" />
<arg value="test_pathlib.py" />
</exec>
</target>
<path id="pmd-classpath">
<fileset dir="${basedir}/pmd" includes="*.jar" />
</path>
<!--
Runs pmd on the file(s) specified in the property "lint.files",
separated by commas. Writes output to ${lint.outputpath}.
-->
<target name="pmd-files-xml" if="lint.files">
<taskdef name="pmd"
classpathref="pmd-classpath"
classname="net.sourceforge.pmd.ant.PMDTask"
/>
<pmd failOnRuleViolation="true" rulesetfiles="pmd/rules.xml">
<ruleset>buck</ruleset>
<formatter type="xml" toFile="${lint.outputpath}" />
<fileset dir="${basedir}" includes="${lint.files}">
<exclude name="**/testdata/**"/>
</fileset>
</pmd>
</target>
<!--
Runs pmd on all source and test files.
-->
<target name="pmd">
<taskdef name="pmd"
classpathref="pmd-classpath"
classname="net.sourceforge.pmd.ant.PMDTask"
/>
<pmd failOnRuleViolation="true" rulesetfiles="pmd/rules.xml">
<ruleset>buck</ruleset>
<fileset dir="${src.dir}">
<include name="**/*.java"/>
</fileset>
<fileset dir="${test.dir}">
<include name="**/*.java"/>
<exclude name="**/testdata/**"/>
</fileset>
</pmd>
</target>
<path id="checkstyle-classpath">
<fileset dir="${basedir}/third-party/java/checkstyle" includes="*.jar" />
</path>
<!--
Runs checkstyle on the file(s) specified in the property "lint.files",
separated by commas.
-->
<target name="checkstyle-files-xml" if="lint.files">
<taskdef resource="checkstyletask.properties"
classpathref="checkstyle-classpath"/>
<checkstyle config="checkstyle.xml">
<formatter type="xml" toFile="${lint.outputpath}" />
<fileset dir="${basedir}" includes="${lint.files}">
<exclude name="**/testdata/**"/>
</fileset>
</checkstyle>
</target>
<!--
Runs checkstyle on the file(s) specified in the property "lint.files",
separated by commas.
-->
<target name="checkstyle-xml">
<taskdef resource="checkstyletask.properties"
classpathref="checkstyle-classpath"/>
<checkstyle config="checkstyle.xml">
<formatter type="xml" toFile="${lint.outputpath}" />
<fileset dir="${src.dir}">
<include name="**/*.java"/>
</fileset>
<fileset dir="${test.dir}">
<include name="**/*.java"/>
<exclude name="**/testdata/**"/>
</fileset>
</checkstyle>
</target>
<!--
Runs checkstyle on all source and test files.
-->
<target name="checkstyle">
<taskdef resource="checkstyletask.properties"
classpathref="checkstyle-classpath"/>
<checkstyle config="checkstyle.xml">
<fileset dir="${src.dir}">
<include name="**/*.java"/>
</fileset>
<fileset dir="${test.dir}">
<include name="**/*.java"/>
<exclude name="**/testdata/**"/>
</fileset>
<formatter type="plain"/>
</checkstyle>
</target>
<target name="lint" depends="pmd, checkstyle" />
<target name="test" depends="java-test, py-test" description="runs the unit tests" />
<macrodef name="buck-javadoc" description="generates HTML documentation for Java code">
<attribute name="destdir" />
<attribute name="classpathref" />
<attribute name="access" default="protected" />
<element name="additional-links" optional="true" />
<sequential>
<delete dir="@{destdir}" />
<mkdir dir="@{destdir}" />
<record name="@{destdir}/javadoc.log" action="start" />
<javadoc destdir="@{destdir}"
access="@{access}"
classpathref="@{classpathref}"
windowtitle="Buck"
failonerror="true"
>
<fileset dir="${src.dir}">
<include name="**/*.java" />
<exclude name="com/facebook/buck/cli/quickstart/**" />
</fileset>
<fileset dir="${immutables.gensrc.dir}" />
<link href="http://docs.oracle.com/javase/7/docs/api/" />
<link href="http://docs.guava-libraries.googlecode.com/git-history/v18.0/javadoc/"
offline="true"
packagelistloc="third-party/java/guava"/>
<!-- The latest version of the javadocs is only for 4.10 -->
<link href="https://junit-team.github.io/junit/javadoc/latest/" />
<additional-links />
</javadoc>
<record name="@{destdir}/javadoc.log" action="stop" />
</sequential>
</macrodef>
<target name="-javadoc-deps" depends="compile" />
<path id="javadoc.classpath">
<path refid="classpath" />
<!-- Buck test runner has references to JUnit and TestNG. -->
<pathelement location="${third-party.dir}/java/junit/junit-4.11.jar" />
<pathelement location="${third-party.dir}/java/testng/testng-6.8.jar" />
</path>
<target name="javadoc"
description="generates HTML documentation for Java code"
depends="-javadoc-deps">
<buck-javadoc destdir="${javadoc.dir}"
classpathref="javadoc.classpath"
>
</buck-javadoc>
</target>
<path id="javadoc-with-android.classpath">
<path refid="javadoc.classpath" />
<!-- Buck's Android support library has references to Android. -->
<pathelement location="${env.ANDROID_HOME}/platforms/android-16/android.jar" />
</path>
<macrodef name="javadoc-with-android">
<attribute name="destdir" />
<attribute name="access" />
<sequential>
<fail unless="env.ANDROID_HOME" message="ANDROID_HOME not set." />
<buck-javadoc destdir="@{destdir}"
classpathref="javadoc-with-android.classpath"
access="@{access}"
>
<additional-links>
<!--
This is the recommended way to link to Android's Javadoc.
This problem derives from Android's refusal to publish the package-list file
with their Javadoc: http://stackoverflow.com/a/2823592/396304.
Surprisingly, the generated Javadoc does link to http://d.android.com/
rather than a local file:/// URI that points to the local $ANDROID_HOME.
-->
<link offline="true" href="http://d.android.com/reference" packagelistLoc="${env.ANDROID_HOME}/docs/reference"/>
</additional-links>
</buck-javadoc>
</sequential>
</macrodef>
<target name="javadoc-with-android"
description="generates HTML documentation for Java code with links to Android"
depends="-javadoc-deps">
<javadoc-with-android destdir="${javadoc-with-android.dir}" access="protected" />
</target>
<target name="verify-javadoc"
description="verify that full Javadoc ran without errors"
depends="-javadoc-deps">
<!-- Runs javadoc with -private to catch errors in all possible docblocks. -->
<javadoc-with-android destdir="${javadoc-all.dir}" access="private" />
<exec executable="${basedir}/scripts/verify-javadoc.py" failonerror="true">
<arg value="${javadoc-all.dir}/javadoc.log" />
</exec>
</target>
<target name="travis" depends="test, verify-javadoc" />
<target name="client" description="install nailgun buckd c client (non Windows only)">
<mkdir dir="${build.dir}" />
<exec dir="${basedir}"
executable="gcc"
failonerror="true"
osfamily="unix">
<arg line="-Wall -pedantic -O3 -o ${build.dir}/ng ${client.dir}/nailgun-client/ng.c" />
</exec>
</target>
<target name="pre-checkin" depends="clean, default, compile-tests, lint"/>
<target name="all" depends="jar, test, javadoc, client" />
</project>