blob: 32c0c1ba52c5031778dac22535112b427c6ad215 [file] [log] [blame]
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<project name="Avro" default="compile"
xmlns:ivy="antlib:org.apache.ivy.ant"
xmlns:mvn="urn:maven-artifact-ant">
<!-- Load user's default properties. -->
<property file="${user.home}/build.properties" />
<property name="Org" value="Apache"/>
<property name="org" value="apache"/>
<property name="Name" value="Avro"/>
<property name="name" value="avro"/>
<loadresource property="version">
<file file="${basedir}/../../share/VERSION.txt"/>
</loadresource>
<property name="fullname" value="${name}-${version}"/>
<property name="year" value="2010"/>
<property name="share.dir" value="${basedir}/../../share"/>
<property name="top.build" value="${basedir}/../../build"/>
<property name="dist.dir" value="${basedir}/../../dist/java"/>
<property name="src.dir" value="${basedir}/src"/>
<property name="java.src.dir" value="${src.dir}/java"/>
<property name="build.dir" value="${basedir}/build"/>
<property name="lib.dir" value="${basedir}/lib"/>
<property name="build.classes" value="${build.dir}/classes"/>
<property name="build.doc" value="${build.dir}/doc"/>
<property name="build.javadoc" value="${build.doc}/api/java"/>
<property name="build.javadoc.log" value="${build.dir}/javadoc.log"/>
<property name="test.count" value="100"/>
<property name="test.junit.output.format" value="plain"/>
<property name="test.java.src.dir" value="${basedir}/src/test/java"/>
<property name="test.schemata.dir" value="${share.dir}/test/schemas"/>
<property name="test.genavro.dir" value="${basedir}/src/test/genavro"/>
<property name="test.genavro.mode" value="run" />
<property name="test.java.build.dir" value="${build.dir}/test"/>
<property name="test.java.generated.build.dir" value="${test.java.build.dir}/generated"/>
<property name="test.java.generated.dir" value="${test.java.generated.build.dir}/src"/>
<property name="test.java.classes" value="${test.java.build.dir}/classes"/>
<property name="test.java.generated.classes" value="${test.java.generated.build.dir}/classes"/>
<property name="test.java.include" value="Test*"/>
<property name="javadoc.link.java"
value="http://java.sun.com/javase/6/docs/api/"/>
<property name="javadoc.link.jackson"
value="http://jackson.codehaus.org/0.9.3/javadoc/"/>
<property name="javadoc.link.servlet"
value="http://java.sun.com/products/servlet/2.3/javadoc/"/>
<property name="javadoc.packages" value="org.${org}.${name}.*"/>
<property name="javac.encoding" value="ISO-8859-1"/>
<property name="javac.debug" value="on"/>
<property name="javac.optimize" value="on"/>
<property name="javac.deprecation" value="off"/>
<property name="javac.version" value="1.6"/>
<property name="javac.args" value=""/>
<property name="javac.args.warnings" value="-Xlint:unchecked"/>
<property name="ivy.version" value="2.1.0"/>
<property name="ivy.url"
value="http://repo2.maven.org/maven2/org/apache/ivy/ivy" />
<property name="ivy.home" value="${user.home}/.ant" />
<property name="ivy.lib" value="${build.dir}/lib"/>
<property name="ivy.test.lib" value="${build.dir}/test/lib"/>
<property name="mvn.repo"
value="https://repository.apache.org/content/repositories/snapshots"/>
<!-- Eclipse properties -->
<property name="build.dir.eclipse" value=".eclipse"/>
<property name="build.dir.eclipse-main-classes" value="${build.dir.eclipse}/classes-main"/>
<property name="build.dir.eclipse-main-generated-classes" value="${build.dir.eclipse}/classes-main-generated"/>
<property name="build.dir.eclipse-test-classes" value="${build.dir.eclipse}/classes-test"/>
<!-- the normal classpath -->
<path id="libs">
<fileset dir="${ivy.lib}">
<include name="**/*.jar" />
</fileset>
</path>
<path id="java.classpath">
<pathelement location="${build.classes}"/>
<fileset dir="${lib.dir}">
<include name="**/*.jar" />
<exclude name="**/excluded/" />
</fileset>
<fileset dir="${ant.home}/lib">
<include name="ant.jar" />
</fileset>
<path refid="libs" />
</path>
<path id="test.libs">
<fileset dir="${ivy.test.lib}">
<include name="**/*.jar" />
</fileset>
</path>
<path id="test.java.classpath">
<pathelement location="${test.java.classes}" />
<pathelement location="${test.java.generated.classes}" />
<path refid="java.classpath"/>
<path refid="test.libs"/>
</path>
<target name="init">
<mkdir dir="${build.dir}"/>
<mkdir dir="${build.classes}"/>
<mkdir dir="${test.java.build.dir}"/>
<mkdir dir="${test.java.classes}"/>
<mkdir dir="${test.java.generated.classes}"/>
<mkdir dir="${ivy.lib}"/>
<mkdir dir="${ivy.test.lib}"/>
<condition property="ivy.jar.exists">
<available file="${lib.dir}/ivy-${ivy.version}.jar"/>
</condition>
</target>
<target name="javacc" depends="ivy-retrieve-build">
<mkdir dir="${build.dir}/src/org/apache/avro/genavro"/>
<copy tofile="${ivy.lib}/javacc.jar" file="${ivy.lib}/javacc-5.0.jar"
overwrite="true"/>
<javacc target="${java.src.dir}/org/apache/avro/genavro/genavro.jj"
outputdirectory="${build.dir}/src/org/apache/avro/genavro"
javacchome="${ivy.lib}"/>
</target>
<target name="compile" depends="javacc,ivy-retrieve">
<java-compiler
excludes="**/ipc/** **/*Requestor.java **/*Responder.java **/tool/**">
<src path="${build.dir}/src"/>
<src path="${java.src.dir}"/>
</java-compiler>
<java-avro-compiler/>
<java-compiler>
<src path="${build.dir}/src"/>
<src path="${java.src.dir}"/>
</java-compiler>
<copy todir="${build.classes}">
<fileset file="${basedir}/../../NOTICE.txt"/>
<fileset file="${basedir}/../../share/VERSION.txt"/>
</copy>
</target>
<target name="ivy-download" unless="ivy.jar.exists" depends="init">
<delete dir="${lib.dir}"
includes="ivy-*.jar" excludes="ivy-${ivy.version}.jar"/>
<get src="${ivy.url}/${ivy.version}/ivy-${ivy.version}.jar"
dest="${lib.dir}/ivy-${ivy.version}.jar" usetimestamp="true"/>
</target>
<target name="ivy-init" depends="ivy-download" unless="ivy.initialized">
<taskdef resource="org/apache/ivy/ant/antlib.xml"
uri="antlib:org.apache.ivy.ant" classpathref="java.classpath"/>
<!-- ensure that ivy taskdef is only run once, otw ant will error -->
<property name="ivy.initialized" value="true"/>
</target>
<target name="ivy-retrieve" depends="init,ivy-init">
<ivy:retrieve type="jar" conf="default"
pattern="${ivy.lib}/[artifact]-[revision].[ext]"/>
</target>
<target name="ivy-retrieve-tools" depends="init,ivy-init">
<!-- Place in separate directory, since these artificats will
be packaged in the tools jar. -->
<ivy:retrieve type="jar" conf="tools"
pattern="${ivy.lib}/tools/[artifact]-[revision].[ext]"/>
</target>
<target name="ivy-retrieve-test" depends="init,ivy-init">
<ivy:retrieve type="jar" conf="test"
pattern="${ivy.test.lib}/[artifact]-[revision].[ext]"/>
</target>
<target name="ivy-retrieve-build" depends="init,ivy-init">
<ivy:retrieve type="jar" conf="build"
pattern="${ivy.lib}/[artifact]-[revision].[ext]"/>
</target>
<macrodef name="java-compiler">
<attribute name="dest" default="${build.classes}"/>
<attribute name="includes" default="**/*.java"/>
<attribute name="excludes" default=""/>
<attribute name="classpath" default="java.classpath"/>
<element name="src" implicit="yes"/>
<sequential>
<javac
destdir="@{dest}"
includes="@{includes}"
excludes="@{excludes}"
encoding="${javac.encoding}"
debug="${javac.debug}"
optimize="${javac.optimize}"
target="${javac.version}"
source="${javac.version}"
deprecation="${javac.deprecation}">
<compilerarg line="${javac.args} ${javac.args.warnings}" />
<classpath refid="@{classpath}"/>
<src />
</javac>
</sequential>
</macrodef>
<target name="jar" depends="compile" description="Build jar file.">
<jar jarfile="${build.dir}/${fullname}.jar"
basedir="${build.classes}">
<manifest>
<section name="org/${org}/${name}">
<attribute name="Implementation-Title" value="${Name}"/>
<attribute name="Implementation-Version" value="${version}"/>
<attribute name="Implementation-Vendor" value="${Org}"/>
</section>
</manifest>
</jar>
</target>
<target name="checkstyle-java" depends="compile">
<taskdef resource="checkstyletask.properties">
<classpath refid="test.java.classpath" />
</taskdef>
<checkstyle config="${java.src.dir}/checkstyle.xml"
classpathref="test.java.classpath">
<fileset dir="${java.src.dir}">
<include name="**/*.java"/>
</fileset>
<fileset dir="${test.java.src.dir}">
<include name="**/*.java"/>
</fileset>
</checkstyle>
</target>
<target name="compile-test-java" depends="ivy-retrieve-test,ivy-retrieve-tools,compile">
<java-avro-compiler src="${test.schemata.dir}"
generated="${test.java.generated.dir}"
dest="${test.java.generated.classes}"
classpath="test.java.classpath"/>
<java-compiler dest="${test.java.classes}"
classpath="test.java.classpath">
<src path="${test.java.src.dir}" />
</java-compiler>
<taskdef
name="paranamer"
classname="com.thoughtworks.paranamer.ant.ParanamerGeneratorTask">
<classpath refid="java.classpath" />
</taskdef>
<paranamer sourceDirectory="${test.java.generated.dir}"
outputDirectory="${test.java.generated.classes}"/>
<paranamer sourceDirectory="${test.java.src.dir}"
outputDirectory="${test.java.classes}"/>
</target>
<macrodef name="java-avro-compiler">
<attribute name="src" default="${share.dir}/schemas"/>
<attribute name="generated" default="${build.dir}/src"/>
<attribute name="dest" default="${build.classes}"/>
<attribute name="classpath" default="java.classpath"/>
<sequential>
<taskdef name="protocol"
classname="org.apache.avro.specific.ProtocolTask">
<classpath refid="java.classpath" />
</taskdef>
<taskdef name="schema" classname="org.apache.avro.specific.SchemaTask">
<classpath refid="java.classpath" />
</taskdef>
<mkdir dir="@{generated}"/>
<protocol destdir="@{generated}">
<fileset dir="@{src}">
<include name="**/*.avpr" />
</fileset>
</protocol>
<schema destdir="@{generated}">
<fileset dir="@{src}">
<include name="**/*.avsc" />
</fileset>
</schema>
<java-compiler dest="@{dest}"
classpath="@{classpath}">
<src path="@{generated}" />
</java-compiler>
</sequential>
</macrodef>
<target name="test" depends="test-java,test-tools"/>
<target name="rat" depends="ivy-retrieve-test">
<typedef resource="org/apache/rat/anttasks/antlib.xml"
uri="antlib:org.apache.rat.anttasks">
<classpath refid="test.java.classpath"/>
</typedef>
<rat:report xmlns:rat="antlib:org.apache.rat.anttasks"
reportFile="${top.build}/rat-report.log">
<fileset dir="${top.build}/avro-src-${version}/"
excludesfile="${share.dir}/rat-excludes.txt"/>
</rat:report>
<condition property="rat.passed">
<isfileselected file="${top.build}/rat-report.log">
<containsregexp expression="^0 Unknown Licenses"/>
</isfileselected>
</condition>
<fail unless="rat.passed">Unknown licenses: See build/rat-report.log.</fail>
</target>
<macrodef name="test-runner">
<attribute name="files.location" />
<attribute name="tests.pattern" />
<attribute name="test.dir" default="${test.java.build.dir}" />
<sequential>
<junit showoutput="yes"
printsummary="withOutAndErr"
haltonfailure="no"
fork="yes" forkMode="once"
errorProperty="tests.failed" failureProperty="tests.failed">
<sysproperty key="test.count" value="${test.count}"/>
<sysproperty key="test.dir" value="@{test.dir}"/>
<sysproperty key="share.dir" value="${share.dir}"/>
<sysproperty key="test.validate" value="${test.validate}"/>
<sysproperty key="test.genavro.dir" value="${test.genavro.dir}" />
<sysproperty key="test.genavro.mode" value="${test.genavro.mode}" />
<classpath refid="test.java.classpath"/>
<formatter type="${test.junit.output.format}"/>
<batchtest todir="${test.java.build.dir}" unless="testcase">
<fileset dir="@{files.location}"
includes="@{tests.pattern}"
excludes="**/${test.java.exclude}.java" />
</batchtest>
<batchtest todir="${test.java.build.dir}" if="testcase">
<fileset dir="@{files.location}" includes="**/${testcase}.java"/>
</batchtest>
</junit>
<fail if="tests.failed">Tests Failed!</fail>
</sequential>
</macrodef>
<target name="test-java" depends="unit-test-java,checkstyle-java,javadoc"
description="Run java tests" />
<target name="unit-test-java" depends="compile-test-java"
description="Run java unit tests">
<test-runner files.location="${test.java.src.dir}" tests.pattern="**/${test.java.include}.java"/>
</target>
<target name="interop-data-generate" depends="compile-test-java"
description="Generate java interop data files.">
<mkdir dir="${top.build}/interop/data"/>
<java classname="org.apache.avro.RandomData"
classpathref="test.java.classpath">
<arg value="${share.dir}/test/schemas/interop.avsc"/>
<arg value="${top.build}/interop/data/java.avro"/>
<arg value="${test.count}"/>
</java>
</target>
<target name="interop-data-test"
description="Run java data file interoperability tests">
<test-runner files.location="${test.java.classes}"
tests.pattern="**/TestDataFile$InteropTest.class"
test.dir="${top.build}/interop/data" />
</target>
<target name="interop-rpc-start" depends="compile-test-java"
description="Start the daemons for rpc interoperability tests">
<delete dir="${share.dir}/test/interop/rpc/java"/>
<mkdir dir="${share.dir}/test/interop/rpc/java"/>
<!-- Start the servers. As servers block the ant main thread, these need
to be created in parallel threads-->
<parallel>
<daemons>
<java classname="org.apache.avro.TestProtocolSpecific$InteropTest">
<classpath refid="test.java.classpath"/>
<sysproperty key="test.dir"
value="${share.dir}/test/interop/rpc/java"/>
</java>
</daemons>
<!-- Give some time to start -->
<sequential>
<sleep seconds="2"/>
</sequential>
</parallel>
</target>
<target name="interop-rpc-test"
description="Run java rpc interoperability tests">
<test-runner files.location="${test.java.classes}" tests.pattern="**/TestProtocolSpecific$InteropTest.class" />
</target>
<target name="tools" depends="compile,ivy-retrieve-tools"
description="Build standalone tools jar file">
<jar jarfile="${build.dir}/avro-tools-${version}.jar">
<manifest>
<attribute name="Main-Class" value="org.apache.avro.tool.Main"/>
<attribute name="Implementation-Title" value="${Name}"/>
<attribute name="Implementation-Version" value="${version}"/>
<attribute name="Implementation-Vendor" value="${Org}"/>
</manifest>
<fileset dir="${build.classes}" />
<zipgroupfileset dir="${ivy.lib}/tools" includes="*.jar"/>
</jar>
<chmod file="${build.dir}/avro-tools-${version}.jar" perm="ugo+x"/>
</target>
<target name="test-tools" depends="tools,compile-test-java"
description="Tests tools">
<exec executable="${basedir}/src/test/bin/test_tools.sh"
failonerror="true">
<env key="TOOLS" value="${build.dir}/avro-tools-${version}.jar"/>
<env key="TMPDIR" value="${test.java.build.dir}/tools"/>
</exec>
</target>
<target name="javadoc" depends="compile" description="Generate javadoc">
<mkdir dir="${build.javadoc}"/>
<record name="${build.javadoc.log}" action="start"/>
<javadoc
overview="${java.src.dir}/overview.html"
packagenames="org.${org}.${name}.*"
destdir="${build.javadoc}"
author="true"
version="true"
use="true"
windowtitle="${Name} ${version} API"
doctitle="${Name} ${version} API"
bottom="Copyright &amp;copy; ${year} The ${Org} Software Foundation"
>
<packageset dir="${java.src.dir}"/>
<link href="${javadoc.link.java}"/>
<link href="${javadoc.link.jackson}"/>
<link href="${javadoc.link.servlet}"/>
<classpath >
<path refid="java.classpath" />
</classpath>
</javadoc>
<record name="${build.javadoc.log}" action="stop"/>
<condition property="javadoc.warnings">
<isfileselected file="${build.javadoc.log}">
<contains text=": warning - "/>
</isfileselected>
</condition>
<fail if="javadoc.warnings">Javadoc warnings!</fail>
</target>
<target name="source">
<jar jarfile="${build.dir}/${fullname}-sources.jar">
<fileset dir="${java.src.dir}" includes="**/*.java"/>
</jar>
</target>
<target name="javadoc-jar" depends="javadoc">
<jar jarfile="${build.dir}/${fullname}-javadoc.jar">
<fileset dir="${build.javadoc}" includes="**/*"/>
</jar>
</target>
<target name="pom" depends="ivy-init">
<ivy:makepom ivyfile="${basedir}/ivy.xml"
pomfile="${dist.dir}/${fullname}.pom">
<mapping conf="default" scope="compile"/>
<mapping conf="test" scope="test"/>
</ivy:makepom>
</target>
<target name="dist" depends="jar, tools, javadoc, pom, source, javadoc-jar"
description="Build distribution">
<mkdir dir="${dist.dir}"/>
<copy todir="${dist.dir}">
<fileset file="${build.dir}/${fullname}.jar"/>
<fileset file="${build.dir}/${fullname}-sources.jar"/>
<fileset file="${build.dir}/${fullname}-javadoc.jar"/>
<fileset file="${build.dir}/avro-tools-${version}.jar"/>
</copy>
<chmod file="${dist.dir}/avro-tools-${version}.jar" perm="ugo+x"/>
<copy todir="${top.build}/avro-doc-${version}/api/java">
<fileset dir="${build.javadoc}"/>
</copy>
</target>
<target name="clean" description="Delete build files, and their directories">
<delete dir="${build.dir}"/>
</target>
<!-- Begin Eclipse targets -->
<property name="ant-eclipse.dir" value="${build.dir}/ant-eclipse"/>
<property name="ant-eclipse.lib.dir" value="${ant-eclipse.dir}/lib"/>
<available file="${ant-eclipse.lib.dir}/ant-eclipse-1.0-jvm1.2.jar"
property="ant-eclipse.jar.exists"/>
<path id="ant-eclipse.classpath">
<fileset dir="${ant-eclipse.lib.dir}">
<include name="**/*.jar" />
</fileset>
</path>
<target name="ant-eclipse-retrieve" unless="ant-eclipse.jar.exists"
depends="ivy-init"
description="Retrieves the ant-eclipse binary.">
<mkdir dir="${ant-eclipse.lib.dir}"/>
<ivy:settings id="ivy.ant-eclipse.settings"
file="${basedir}/ivysettings-ant-eclipse.xml" />
<ivy:retrieve conf="eclipse"
settingsRef="ivy.ant-eclipse.settings"
pattern="${build.dir}/[module]-[revision].[ext]"/>
<untar src="${build.dir}/ant-eclipse-1.0.bz2"
dest="${ant-eclipse.dir}" compression="bzip2">
<patternset>
<include name="lib/ant-eclipse-1.0-jvm1.2.jar"/>
</patternset>
</untar>
<delete file="${build.dir}/ant-eclipse-1.0.bz2" />
</target>
<target name="eclipse"
depends="compile-test-java,ant-eclipse-retrieve"
description="Create eclipse project files">
<taskdef name="eclipse"
classname="prantl.ant.eclipse.EclipseTask"
classpathref="ant-eclipse.classpath" />
<eclipse updatealways="true">
<project name="${ant.project.name}" />
<classpath>
<!-- Use Eclipse to compile Avro runtime -->
<source path="${java.src.dir}"
output="${build.dir.eclipse-main-classes}" />
<source path="${test.java.src.dir}"
output="${build.dir.eclipse-test-classes}" />
<!-- Even though these are generated, Eclipse can compile these -->
<source path="${build.dir}/src"
output="${build.dir.eclipse-main-generated-classes}" />
<output path="${build.dir.eclipse-main-classes}" />
<!-- Tests require that the generated code has paranamer applied to it,
so we use the ant build for that. -->
<library path="${test.java.generated.classes}" source="${test.java.generated.dir}"/>
<library pathref="libs" exported="true" />
<library pathref="test.libs" exported="false" />
</classpath>
</eclipse>
</target>
<target name="clean-eclipse" description="Clean eclipse files">
<delete file=".classpath" />
<delete file=".eclipse" />
<delete file=".project" />
<delete dir=".settings" />
<delete dir="${ant-eclipse.lib.dir}" />
<delete dir="${build.dir.eclipse}" />
</target>
<!-- End Eclipse targets -->
<target name="mvn-install" depends="jar,pom,source,javadoc-jar"
description="Installs avro to local m2 cache">
<typedef resource="org/apache/maven/artifact/ant/antlib.xml"
uri="urn:maven-artifact-ant"
classpathref="java.classpath"/>
<mvn:pom file="${dist.dir}/${fullname}.pom" id="avro"/>
<mvn:install file="${build.dir}/${fullname}.jar">
<attach file="${build.dir}/${fullname}-sources.jar"
classifier="sources" />
<attach file="${build.dir}/${fullname}-javadoc.jar"
classifier="javadoc" />
<pom refid="avro"/>
</mvn:install>
</target>
<target name="mvn-deploy" depends="jar,pom,source,javadoc-jar"
description="Deploys Avro to Maven repo.">
<typedef resource="org/apache/maven/artifact/ant/antlib.xml"
uri="urn:maven-artifact-ant"
classpathref="java.classpath"/>
<mvn:pom file="${dist.dir}/${fullname}.pom" id="avro"/>
<mvn:deploy file="${build.dir}/${fullname}.jar">
<remoteRepository id="avro.mvn.repo" url="${mvn.repo}"/>
<attach file="${build.dir}/${fullname}-sources.jar"
classifier="sources" />
<attach file="${build.dir}/${fullname}-javadoc.jar"
classifier="javadoc" />
<pom refid="avro"/>
</mvn:deploy>
</target>
</project>