<?xml version="1.0" encoding="UTF-8"?>
<!--
    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="INSTRUMENT Build" default="build" basedir=".">
    <description>Build for INSTRUMENT component</description>

    <property name="hy.module" value="instrument" />
    <property name="hy.hdk" location="${basedir}/../../deploy" />
    <import file="${hy.hdk}/build/ant/properties.xml" />

    <property file="../../make/depends.properties" />

    <target name="build" depends="compile-java, build-jar" />

    <target name="clean" depends="clean-java,clean-native,clean-test" />

    <target name="test" depends="-test-module">
        <fail message="Some tests failed">
            <condition>
                <or>
                    <isset property="test.failures" />
                    <isset property="test.errors" />
                </or>
            </condition>
        </fail>
    </target>

    <!-- internal target for local and global test run sequence -->
    <target name="-test-module" depends="build, run-tests" />

    <!-- Build native code -->
    <target name="build-native" depends="build-native-all" />
    <target name="build-native-all" >
        <make dir="src/main/native/instrument/${hy.os.family}" />
    </target>
    
    <target name="clean-java" depends="class-patternset">
        <delete file="${hy.jdk}/jre/lib/boot/instrument.jar" />
        <delete file="${hy.jdk}/jre/lib/boot/instrument-src.jar" />
        <delete failonerror="false">
            <fileset refid="classes" />
        </delete>
        <delete-patternset module="${hy.module}" />
    </target>

    <target name="clean-native">
        <make dir="src/main/native/instrument/${hy.os.family}" target="clean" />
    </target>

    <target name="clean-test">
        <delete dir="${tests.hdk.dir}" failonerror="false" />
        <delete failonerror="false" dir="bin"/>
    </target>

    <target name="compile-java">
        <echo message="Compiling ${hy.module} classes" />

        <mkdir dir="../../build/classes" />

        <javac sourcepath=""
            srcdir="src/main/java"
            destdir="../../build/classes"
               compiler="${hy.javac.compiler}"
               memoryMaximumSize="${hy.javac.maxmem}"
               source="${hy.javac.source}" 
               target="${hy.javac.target}"
               debug="${hy.javac.debug}">
               
            <compilerarg line="${build.compilerarg}" />

            <bootclasspath>
                <fileset dir="${hy.jdk}/jre/lib/boot">
                    <include name="**/*.jar" />
                </fileset>
            </bootclasspath>
        </javac>
    </target>

    <target name="findbugs" depends="build-jar">
        <run-findBugs
            jarFile="${hy.jdk}/jre/lib/boot/instrument.jar"
            excludeFilter="make/findbugs-exclude-filter.xml"
            outputFile="${findBugs.report}/instrument.xml"/>
    </target>

    <target name="build-jar" depends="svn-info,class-patternset">
        <jar destfile="${hy.jdk}/jre/lib/boot/instrument.jar"
             manifest="META-INF/MANIFEST.MF"
             compress="${hy.jar.compress}">
            <fileset refid="classes" />
            <fileset refid="resources" />
            <manifest>
                <attribute name="Implementation-Version" value="${svn.info}"/> 
            </manifest>

            <metainf refid="hy.required.metainf-files"/>
        </jar>

        <jar destfile="${hy.jdk}/jre/lib/boot/instrument-src.jar">
            <fileset dir="src/main/java" />
            <manifest>
                <attribute name="Implementation-Version" value="${svn.info}"/> 
            </manifest>

            <metainf refid="hy.required.metainf-files"/>
        </jar>
    </target>

    <target name="test-jar" depends="svn-info,compile-tests">
        <mkdir dir="${tests.hdk.dir}" />
        
        <copy file="make/run-test.xml" tofile="${tests.hdk.dir}/build.xml" />
        
        <jar destfile="${tests.hdk.dir}/instrument_tests.jar">
            <fileset dir="bin/test" />
            <manifest>
                <attribute name="Implementation-Version" value="${svn.info}"/> 
            </manifest>
            <metainf refid="hy.required.metainf-files"/>
        </jar>

        <mkdir dir="${tests.excludes.hdk.dir}"/>
        <copy todir="${tests.excludes.hdk.dir}">
            <fileset dir="make" includes="exclude*"/>
            <filterchain>
                <tokenfilter>
                    <replaceregex pattern="\.java" replace="\.class" flags="g"/>
                </tokenfilter>
            </filterchain>
        </copy>

        <copy todir="${tests.resources.hdk.dir}" includeemptydirs="false">
            <fileset dir="src/test/resources">
                <exclude name="**/*.java" />
            </fileset>
        </copy>
        
        <copy file="../../${junit.jar}"
              tofile="${hy.hdk}/build/test/junit.jar" />
    </target>

    <target name="compile-tests">
        <compile-tests description="instrument tests">
            <javac-elements>
                <src>
                    <pathelement location="src/test/java" />
                </src>
            </javac-elements>
        </compile-tests>
    </target>

    <target name="run-tests" depends="test-jar">
        <ant dir="${tests.hdk.dir}" target="test-module" />
    </target>

    <target name="class-patternset">
        <make-patternset module="${hy.module}" />
    </target>

</project>
