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

<!--
    build.xml

    Author: Lasse Collin <lasse.collin@tukaani.org>

    This file has been put into the public domain.
    You can do whatever you want with this file.
-->

<project name="XZ" default="jar">

    <property file="build.properties"/>

    <target name="clean"
            description="Deletes generated files except 'extdoc'">
        <delete dir="${build_dir}"/>
    </target>

    <target name="distclean" depends="clean"
            description="Deletes all generated files">
        <delete dir="extdoc"/>
    </target>

    <target name="dist" description="Creates a source package (.zip)">
        <mkdir dir="${dist_dir}"/>
        <zip destfile="${dist_file}">
            <fileset dir="." includesfile="fileset-misc.txt"/>
            <fileset dir="." includesfile="fileset-src.txt"/>
            <fileset dir="." includesfile="fileset-src9.txt"/>
        </zip>
    </target>

    <target name="doc"
            description="Generates HTML documentation with javadoc">
        <mkdir dir="${doc_dir}"/>
        <mkdir dir="${extdoc_dir}"/>
        <!-- Ant 1.10.9 doesn't recognize element-list. To workaround this
             we rename element-list to package-list when downloading.
             javadoc from Java 15 seems to be fine with this hack. -->
        <get src="${extdoc_url}/${extdoc_file}"
             dest="${extdoc_dir}/package-list" skipexisting="true"/>
        <javadoc sourcepath="${src_dir}" destdir="${doc_dir}"
                 packagenames="org.tukaani.xz"
                 windowtitle="XZ data compression"
                 nodeprecatedlist="true" nohelp="true"
                 linkoffline="${extdoc_url} ${extdoc_dir}"/>
    </target>

    <target name="compile" description="Compiles the classes">
        <mkdir dir="${classes_dir}"/>
        <javac srcdir="." sourcepath="${src_dir}" destdir="${classes_dir}"
               includeAntRuntime="false" debug="${debug}"
               source="${sourcever}" target="${sourcever}"
               release="${sourcever}"
               includesfile="fileset-src.txt"
               excludes="**/package-info.java">
            <compilerarg compiler="modern" line="-Xlint -Xlint:-options"/>
        </javac>

        <!-- Build Java 9 files only if sourcever9 is set: -->
        <mkdir dir="${classes9_dir}"/>
        <condition property="exclude_java9" value="**">
            <not><isset property="sourcever9"/></not>
        </condition>

        <!-- Regular Java 9 files excluding module-info.java: -->
        <javac srcdir="." sourcepath="${src_dir}"
               destdir="${classes9_dir}"
               classpath="${classes_dir}"
               includeAntRuntime="false" debug="${debug}"
               release="${sourcever9}"
               includesfile="fileset-src9.txt"
               excludes="${exclude_java9} **/module-info.java">
            <compilerarg compiler="modern" line="-Xlint"/>
        </javac>

        <!-- module-info.java needs special treatment because it wants to
             be on the source path and also see source files from the
             package being exported. -->
        <javac srcdir="." sourcepath="${src9_dir}:${src_dir}"
               destdir="${classes9_dir}"
               includeAntRuntime="false" debug="${debug}"
               release="${sourcever9}"
               includes="src9/module-info.java"
               excludes="${exclude_java9}">
            <compilerarg compiler="modern" line="-Xlint"/>
        </javac>
    </target>

    <target name="jar" depends="compile"
            description="Creates JAR packages">
        <mkdir dir="${jar_dir}"/>

        <jar destfile="${jar_dir}/xz.jar">
            <fileset dir="${classes_dir}" includes="org/tukaani/xz/**"/>
            <zipfileset prefix="META-INF/versions/9/" dir="${classes9_dir}"/>
            <manifest>
                <attribute name="Implementation-Title" value="${title}"/>
                <attribute name="Implementation-Version" value="${version}"/>
                <attribute name="Implementation-URL" value="${homepage}"/>
                <attribute name="Sealed" value="true"/>
                <attribute name="Multi-Release" value="true"/>
                <!-- Attributes required for OSGi bundles. -->
                <attribute name="Bundle-ManifestVersion" value="2"/>
                <attribute name="Bundle-SymbolicName" value="org.tukaani.xz"/>
                <attribute name="Bundle-Version" value="${version}"/>
                <attribute name="Export-Package" value="org.tukaani.xz"/>
                <attribute name="Bundle-Name" value="${title}"/>
                <attribute name="Bundle-DocURL" value="${homepage}"/>
            </manifest>
        </jar>

        <jar destfile="${jar_dir}/TestAllocSpeed.jar" basedir="${classes_dir}"
             includes="TestAllocSpeed.class">
            <manifest>
                <attribute name="Main-Class" value="TestAllocSpeed"/>
                <attribute name="Class-Path" value="xz.jar"/>
            </manifest>
        </jar>

        <jar destfile="${jar_dir}/XZEncDemo.jar" basedir="${classes_dir}"
             includes="XZEncDemo.class">
            <manifest>
                <attribute name="Main-Class" value="XZEncDemo"/>
                <attribute name="Class-Path" value="xz.jar"/>
            </manifest>
        </jar>

        <jar destfile="${jar_dir}/XZDecDemo.jar" basedir="${classes_dir}"
             includes="XZDecDemo.class">
            <manifest>
                <attribute name="Main-Class" value="XZDecDemo"/>
                <attribute name="Class-Path" value="xz.jar"/>
            </manifest>
        </jar>

        <jar destfile="${jar_dir}/XZSeekEncDemo.jar" basedir="${classes_dir}"
             includes="XZSeekEncDemo.class">
            <manifest>
                <attribute name="Main-Class" value="XZSeekEncDemo"/>
                <attribute name="Class-Path" value="xz.jar"/>
            </manifest>
        </jar>

        <jar destfile="${jar_dir}/XZSeekDecDemo.jar" basedir="${classes_dir}"
             includes="XZSeekDecDemo.class">
            <manifest>
                <attribute name="Main-Class" value="XZSeekDecDemo"/>
                <attribute name="Class-Path" value="xz.jar"/>
            </manifest>
        </jar>

        <jar destfile="${jar_dir}/LZMAEncDemo.jar" basedir="${classes_dir}"
             includes="LZMAEncDemo.class">
            <manifest>
                <attribute name="Main-Class" value="LZMAEncDemo"/>
                <attribute name="Class-Path" value="xz.jar"/>
            </manifest>
        </jar>

        <jar destfile="${jar_dir}/LZMADecDemo.jar" basedir="${classes_dir}"
             includes="LZMADecDemo.class">
            <manifest>
                <attribute name="Main-Class" value="LZMADecDemo"/>
                <attribute name="Class-Path" value="xz.jar"/>
            </manifest>
        </jar>
    </target>

    <!-- It's an ugly quick hack. Maybe some day there will be a cleaner
         version (e.g. by using Maven). -->
    <target name="maven" depends="dist, doc, jar"
            description="Creates the files for a Maven repository">
        <mkdir dir="${maven_dir}"/>

        <copy file="${pom_template}" tofile="${maven_dir}/xz-${version}.pom"
              overwrite="true">
            <filterset>
                <filter token="VERSION" value="${version}"/>
                <filter token="TITLE" value="${title}"/>
                <filter token="HOMEPAGE" value="${homepage}"/>
            </filterset>
        </copy>

        <copy file="${jar_dir}/xz.jar" tofile="${maven_dir}/xz-${version}.jar"
              preservelastmodified="true" overwrite="true"/>

        <jar destfile="${maven_dir}/xz-${version}-javadoc.jar"
             basedir="${doc_dir}"/>

        <jar destfile="${maven_dir}/xz-${version}-sources.jar">
            <fileset dir="${src_dir}" includes="org/tukaani/xz/**"/>
            <zipfileset prefix="META-INF/versions/9/" dir="${src9_dir}"/>
        </jar>
    </target>

</project>
