<?xml version="1.0"?>

<!--
   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

       https://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="apache-ant" default="main" basedir=".">

  <!-- Give user a chance to override without editing this file
       (and without typing -D on each invocation) -->
  <property file=".ant.properties"/>
  <property file="${user.home}/.ant.properties"/>
  <property environment="env"/>

  <!--
       ===================================================================
         Set the properties that control names and versions
       ===================================================================
  -->
  <property name="Name" value="Apache Ant"/>
  <property name="name" value="ant"/>
  <!-- this is the directory corresponding to groupId of Ant in the Maven repository -->
  <property name="groupid" value="org/apache/ant"/>
  <property name="project.version" value="1.10.18"/>
  <!-- pom.version is used when doing a distribution and must match with what is checked in under src/etc/poms -->
  <property name="pom.version" value="1.10.18"/>
  <property name="manifest-version" value="1.10.18"/>
  <property name="bootstrap.jar" value="ant-bootstrap.jar"/>

  <property name="ant.package" value="org/apache/tools/ant"/>
  <property name="taskdefs.package" value="${ant.package}/taskdefs"/>
  <property name="condition.package" value="${taskdefs.package}/condition"/>
  <property name="modules.package" value="${taskdefs.package}/modules"/>
  <property name="optional.package" value="${taskdefs.package}/optional"/>
  <property name="type.package" value="${ant.package}/types"/>
  <property name="optional.type.package" value="${type.package}/optional"/>
  <property name="apache-resolver.type.package" value="${type.package}/resolver"/>
  <property name="util.package" value="${ant.package}/util"/>
  <property name="regexp.package" value="${util.package}/regexp"/>

  <property name="optional.jars.prefix" value="ant"/>
  <property name="optional.jars.whenmanifestonly" value="skip"/>

  <!--
       ===================================================================
         Set the properties related to the source tree
       ===================================================================
  -->
  <property name="src.dir" value="src"/>
  <property name="java.dir" value="${src.dir}/main"/>
  <property name="script.dir" value="${src.dir}/script"/>
  <property name="resource.dir" value="${src.dir}/resources"/>
  <property name="src.junit" value="${src.dir}/tests/junit"/>
  <property name="src.antunit" value="${src.dir}/tests/antunit"/>
  <property name="etc.dir" value="${src.dir}/etc"/>
  <property name="tests.etc.dir" value="${etc.dir}/testcases"/>
  <property name="lib.dir" value="lib"/>
  <property name="manual.dir" value="manual"/>

  <!--
       ===================================================================
         Set the properties for the build area
       ===================================================================
  -->
  <property name="build.dir" value="build"/>
  <property name="bootstrap.dir" location="bootstrap"/>
  <property name="build.classes" value="${build.dir}/classes"/>
  <property name="build.lib" value="${build.dir}/lib"/>
  <property name="build.lib-src" value="${build.dir}/lib-src"/>
  <property name="build.javadocs" value="${build.dir}/javadocs"/>
  <property name="build.tests" value="${build.dir}/testcases"/>
  <property name="build.tests.javadocs" value="${build.dir}/javadocs.test/"/>
  <property name="build.junit.xml" location="${build.tests}/xml"/>
  <property name="build.junit.tmpdir" location="${build.tests}/tmp"/>
  <property name="build.junit.reports" location="${build.tests}/reports"/>
  <property name="build.pkg.dir" value="${build.dir}/pkg"/>
  <property name="antunit.xml" location="${build.dir}/antunit/xml"/>
  <property name="antunit.tmpdir" location="${build.dir}/antunit/tmp"/>
  <property name="antunit.reports" location="${build.dir}/antunit/reports"/>
  <property name="antunit.loglevel" value="none"/>
  <!-- the absolute path -->
  <property name="build.classes.value" location="${build.classes}"/>
  <property name="build.tests.value" location="${build.tests}"/>

  <!--
       ===================================================================
         Set the properties that control various build options
       ===================================================================
  -->
  <property name="debug" value="true"/>
  <property name="setpermissions.fail" value="true"/>
  <property name="setpermissions.nonposixmode" value="tryDosOrPass"/>
  <property name="deprecation" value="false"/>
  <property name="optimize" value="true"/>
  <property name="javac.target" value="1.8"/>
  <property name="javac.source" value="1.8"/>
  <property name="javac.release" value="8"/>
  <property name="junit.filtertrace" value="off"/>
  <property name="junit.summary" value="no"/>
  <property name="test.haltonfailure" value="false"/>
  <property name="junit.fork" value="true"/>
  <property name="junit.forkmode" value="once"/>
  <condition property="junit.threads" value="2" else="0">
    <and>
      <equals arg1="${junit.fork}" arg2="true"/>
      <equals arg1="${junit.forkmode}" arg2="perTest"/>
    </and>
  </condition>
  <property name="expandproperty.files"
            value="**/version.txt,**/defaultManifest.mf"/>
  <property name="junit.collector.dir" value="${build.dir}/failingTests"/>
  <property name="junit.collector.class" value="FailedTests"/>

  <!--
       ===================================================================
         Set the paths used in the build
       ===================================================================
  -->
  <path id="classpath">
    <fileset dir="lib/optional" includes="*.jar"/>
  </path>

  <path id="tests-classpath">
    <pathelement location="${build.classes}"/>
    <path refid="classpath"/>
  </path>
  <path id="tests-runtime-classpath">
    <path refid="tests-classpath"/>
    <pathelement location="${build.tests}"/>
    <!--
        include the test source and test data dirs
        so that we can pick resources via getResource(AsStream)
     -->
    <pathelement location="${src.junit}"/>
    <pathelement location="${tests.etc.dir}"/>
    <!-- Otherwise many tests fail with "com.sun.tools.javac.Main is not on the classpath.": -->
    <pathelement location="${java.home}/../lib/tools.jar"/>
  </path>

  <!--
        ===================================================================
          Set up properties for the distribution area
        ===================================================================
   -->
  <property name="dist.name" value="apache-${name}-${project.version}"/>
  <property name="dist.base" value="distribution"/>
  <property name="dist.base.source" value="${dist.base}/source"/>
  <property name="dist.base.binaries" value="${dist.base}/binaries"/>
  <property name="dist.base.manual" value="${dist.base}/manual"/>
  <property name="dist.dir" location="dist"/>
  <property name="dist.bin" value="${dist.dir}/bin"/>
  <property name="dist.lib" value="${dist.dir}/lib"/>
  <property name="dist.manual" value="${dist.dir}/manual"/>
  <property name="dist.etc" value="${dist.dir}/etc"/>
  <property name="dist.javadocs" value="${dist.dir}/manual/api"/>

  <property name="src.dist.dir" value="dist-src"/>
  <property name="src.dist.src" value="${src.dist.dir}/src"/>
  <property name="src.dist.manual" value="${src.dist.dir}/manual"/>
  <property name="src.dist.lib" value="${src.dist.dir}/lib"/>

  <property name="java-repository.dir" value="java-repository/${groupid}"/>

  <!--
       ===================================================================
         Set up selectors to be used by javac, junit and jar to exclude
         files that have dependencies that are not available
       ===================================================================
  -->

  <selector id="needs.jdk9+">
    <filename name="${modules.package}/"/>
  </selector>

  <!-- Kaffe has some JDK 1.5 features including java.lang.Readable,
       but not all of them -->
  <selector id="not.in.kaffe">
    <or>
      <filename name="${condition.package}/IsReachable*"/>
    </or>
  </selector>

  <selector id="needs.apache-resolver">
    <filename name="${apache-resolver.type.package}/"/>
  </selector>

  <selector id="needs.junit">
    <and>
      <filename name="${optional.package}/junit/"/>
      <not>
          <or>
            <filename name="${optional.package}/junit/JUnit4TestMethodAdapter*"/>
            <filename name="${optional.package}/junit/CustomJUnit4TestAdapterCache*"/>
          </or>
      </not>
    </and>
  </selector>

  <selector id="needs.junit4">
      <or>
         <filename name="${optional.package}/junit/JUnit4TestMethodAdapter*"/>
         <filename name="${optional.package}/junit/CustomJUnit4TestAdapterCache*"/>
      </or>
  </selector>

  <selector id="needs.junitlauncher">
    <or>
      <filename name="${optional.package}/junitlauncher/"/>
      <filename name="org/example/junitlauncher/Tracker.java"/>
    </or>
  </selector>

  <selector id="needs.junit.engine.vintage">
    <or>
      <!-- we need JUnit vintage engine only in tests where we test the junitlauncher task -->
      <filename name="${optional.package}/junitlauncher/**/JUnitLauncherTaskTest.java"/>
      <filename name="org/example/junitlauncher/vintage/**/*"/>
    </or>
  </selector>

  <selector id="needs.junit.engine.jupiter">
    <or>
      <!-- we need JUnit jupiter engine only in tests where we test the junitlauncher task -->
      <filename name="${optional.package}/junitlauncher/**/JUnitLauncherTaskTest.java"/>
      <filename name="${optional.package}/junitlauncher/OutputDirLocationTest.java"/>
      <filename name="org/example/junitlauncher/jupiter/**/*"/>
    </or>
  </selector>

  <selector id="needs.apache-regexp">
    <filename name="${regexp.package}/JakartaRegexp*"/>
  </selector>

  <selector id="needs.apache-oro">
    <or>
      <filename name="${regexp.package}/JakartaOro*"/>
    </or>
  </selector>

  <selector id="needs.apache-bcel">
    <or>
      <filename name="${ant.package}/filters/util/JavaClassHelper*"/>
      <filename name="${util.package}/depend/bcel/"/>
      <filename name="${optional.type.package}/depend/ClassFileSetTest*"/>
    </or>
  </selector>

  <selector id="needs.apache-log4j">
    <filename name="${ant.package}/listener/Log4jListener*"/>
  </selector>

  <selector id="needs.commons-logging">
    <filename name="${ant.package}/listener/CommonsLoggingListener*"/>
  </selector>

  <selector id="needs.apache-bsf">
    <or>
      <filename name="${util.package}/ScriptRunner.*"/>
      <filename name="${util.package}/optional/ScriptRunner*"/>
    </or>
  </selector>

  <selector id="needs.javamail">
    <or>
      <filename name="${ant.package}/taskdefs/email/MimeMailer*"/>
    </or>
  </selector>

  <selector id="needs.jakartamail">
    <or>
      <filename name="${ant.package}/taskdefs/email/JakartaMimeMailer*"/>
    </or>
  </selector>

  <selector id="needs.netrexx">
    <filename name="${optional.package}/NetRexxC*"/>
  </selector>

  <selector id="needs.commons-net">
    <or>
      <filename name="${optional.package}/net/FTP*"/>
      <filename name="${optional.package}/net/RExec*"/>
      <filename name="${optional.package}/net/TelnetTask*"/>
    </or>
  </selector>

  <selector id="needs.antlr">
    <filename name="${optional.package}/ANTLR*"/>
  </selector>

  <selector id="needs.imageio">
    <or>
      <filename name="${optional.package}/image/ImageIO*"/>
      <filename name="${optional.type.package}/imageio/"/>
    </or>
  </selector>

  <selector id="needs.jmf">
    <filename name="${optional.package}/sound/"/>
  </selector>

  <selector id="needs.jai">
    <or>
      <filename name="${optional.package}/image/Image.*"/>
      <filename name="${optional.package}/image/ImageTest.*"/>
      <filename name="${optional.type.package}/image/"/>
    </or>
  </selector>

  <selector id="needs.jdepend">
    <filename name="${optional.package}/jdepend/"/>
  </selector>

  <selector id="needs.swing">
    <filename name="${optional.package}/splash/"/>
  </selector>

  <selector id="needs.jsch">
    <filename name="${optional.package}/ssh/"/>
  </selector>

  <!-- needs TraceListenerEx3 interface implemented by PrintTraceListener -->
  <selector id="needs.apache-xalan2">
    <filename name="${optional.package}/Xalan2TraceSupport*"/>
  </selector>

  <selector id="needs.xz">
    <or>
      <filename name="${optional.package}/xz/"/>
      <filename name="${type.package}/optional/xz/"/>
    </or>
  </selector>

  <selector id="needs.graaljs">
    <filename name="${optional.package}/script/graal/*"/>
  </selector>

  <selector id="ant.launcher">
    <filename name="${ant.package}/launch/"/>
  </selector>

  <selector id="ant.core">
    <not>
      <or>
        <selector refid="needs.antlr"/>
        <selector refid="needs.apache-bcel"/>
        <selector refid="needs.apache-bsf"/>
        <selector refid="needs.apache-log4j"/>
        <selector refid="needs.apache-oro"/>
        <selector refid="needs.apache-regexp"/>
        <selector refid="needs.apache-resolver"/>
        <selector refid="needs.apache-xalan2"/>
        <selector refid="needs.commons-logging"/>
        <selector refid="needs.commons-net"/>
        <selector refid="needs.imageio"/>
        <selector refid="needs.jai"/>
        <selector refid="needs.javamail"/>
        <selector refid="needs.jakartamail"/>
        <selector refid="needs.jdepend"/>
        <selector refid="needs.jmf"/>
        <selector refid="needs.jsch"/>
        <selector refid="needs.junit"/>
        <selector refid="needs.junit4"/>
        <selector refid="needs.junitlauncher"/>
        <selector refid="needs.netrexx"/>
        <selector refid="needs.swing"/>
        <selector refid="needs.xz"/>
        <selector refid="ant.launcher"/>
      </or>
    </not>
  </selector>

  <patternset id="onlinetests">
    <exclude name="**/GetTest.java" if="offline"/>
    <exclude name="**/HttpTest.java" if="offline"/>
  </patternset>

  <patternset id="teststhatfail">
    <!-- Property 'run.failing.tests' should force Ant to run these tests. -->
    <!-- Because the whole patternset can not be excluded, you have to add -->
    <!-- an unless-attribute on each exclude-element.                      -->
    <exclude unless="run.failing.tests" name="${optional.package}/BeanShellScriptTest.java"/>
    <exclude unless="run.failing.tests" name="${optional.package}/jdepend/JDependTest.java"/>
  </patternset>

  <!-- tests that need an XML Schema-supporting parser to work -->
  <selector id="needs.xmlschema">
    <or>
      <filename name="${optional.package}/SchemaValidateTest.*"/>
      <filename name="${optional.package}/XmlValidateTest.*"/>
    </or>
  </selector>

  <!--
       ===================================================================
         Set up a patternsets that matches the parts of our JUnit testsuite
         that may be useful for task developers.
       ===================================================================
  -->
  <patternset id="useful.tests">
    <include name="${ant.package}/AntAssert*"/>
    <include name="${ant.package}/BuildFileTest*"/>
    <include name="${ant.package}/BuildFileRule*"/>
    <include name="${ant.package}/FileUtilities*"/>
    <include name="${ant.package}/MagicTestNames*"/>
    <include name="${regexp.package}/RegexpMatcherTest*"/>
    <include name="${regexp.package}/RegexpTest*"/>
    <include name="${optional.package}/AbstractXSLTLiaisonTest*"/>
    <include name="${ant.package}/types/AbstractFileSetTest*"/>
  </patternset>

  <!--
       ===================================================================
         Check to see what optional dependencies are available
       ===================================================================
  -->
  <target name="check-optional-packages">
    <condition property="ignoresystemclasses">
      <not>
        <equals arg1="${build.sysclasspath}" arg2="only"/>
      </not>
    </condition>
    <property name="ignoresystemclasses" value="false"/>
    <available property="jdk9+" classname="java.lang.module.ModuleDescriptor"/>
    <condition property="jdk10+">
      <javaversion atleast="10"/>
    </condition>
    <available property="kaffe" classname="kaffe.util.NotImplemented"/>
    <available property="harmony"
               classname="org.apache.harmony.luni.util.Base64"/>
    <available property="apache-bsf.present"
               classname="org.apache.bsf.BSFManager"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="netrexx.present"
               classname="netrexx.lang.Rexx"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="apache-resolver.present"
               classname="org.apache.xml.resolver.tools.CatalogResolver"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="apache-xalan2.present"
               classname="org.apache.xalan.trace.TraceListenerEx3"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="junit.present"
               classname="junit.framework.TestCase"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="junit4.present"
               classname="org.junit.Test"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="junitlauncher.present"
               classname="org.junit.platform.launcher.Launcher"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="junit.engine.vintage.present"
               classname="org.junit.vintage.engine.VintageTestEngine"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="junit.engine.jupiter.present"
               classname="org.junit.jupiter.engine.JupiterTestEngine"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="antunit.present"
               classname="org.apache.ant.antunit.AntUnit"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="commons-net.present"
               classname="org.apache.commons.net.ftp.FTPClient"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="antlr.present"
               classname="antlr.Tool"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="apache-regexp.present"
               classname="org.apache.regexp.RE"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="apache-oro.present"
               classname="org.apache.oro.text.regex.Perl5Matcher"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="imageio.present"
               classname="javax.imageio.ImageIO"
               classpathref="classpath"/>
    <available property="jmf.present"
               classname="javax.sound.sampled.Clip"
               classpathref="classpath"/>
    <available property="jai.present"
               classname="javax.media.jai.JAI"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="jdepend.present"
               classname="jdepend.framework.JDepend"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="apache-log4j.present"
               classname="org.apache.log4j.Logger"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="commons-logging.present"
               classname="org.apache.commons.logging.LogFactory"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="xalan.envcheck"
               classname="org.apache.xalan.xslt.EnvironmentCheck"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="which.present"
               classname="org.apache.env.Which"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="xerces.present"
               classname="org.apache.xerces.parsers.SAXParser"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="apache-bcel.present"
               classname="org.apache.bcel.Constants"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="javamail.present"
               classname="javax.mail.Transport"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="jakartamail.present"
               classname="jakarta.mail.Transport"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="graaljs.present"
               classname="com.oracle.truffle.js.scriptengine.GraalJSScriptEngine"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>

    <condition property="javaxmail.complete">
      <and>
        <available classname="javax.activation.DataHandler"/>
        <available classname="javax.mail.Transport"/>
      </and>
    </condition>
    <condition property="jakartamail.complete">
      <and>
        <available classname="jakarta.activation.DataHandler"/>
        <available classname="jakarta.mail.Transport"/>
      </and>
    </condition>
    <condition property="javamail.complete">
      <or>
        <isset property="javaxmail.complete"/>
        <isset property="jakartamail.complete"/>
      </or>
    </condition>

    <condition property="tests.and.ant.share.classloader">
      <or>
        <equals arg1="${junit.fork}" arg2="true"/>
        <equals arg1="${build.sysclasspath}" arg2="only"/>
      </or>
    </condition>

    <condition property="sun.tools.present">
      <and>
        <available classname="sun.tools.native2ascii.Main"/>
        <available classname="com.sun.tools.javah.Main"/>
      </and>
    </condition>

    <condition property="tests.are.on.system.classpath">
      <or>
        <resourcecount count="1">
          <intersect>
            <path path="${java.class.path}"/>
            <file file="${build.tests}"/>
          </intersect>
        </resourcecount>
        <istrue value="${junit.fork}"/>
      </or>
    </condition>

    <echo level="verbose"> tests.are.on.system.classpath=${tests.are.on.system.classpath}</echo>

    <condition property="jasper.present">
      <and>
        <available classname="org.apache.jasper.compiler.Compiler"/>
        <available classname="org.apache.jasper.JasperException"/>
      </and>
    </condition>

    <condition property="swing.present">
      <or>
        <not>
          <isset property="kaffe"/>
        </not>
        <available classname="javax.swing.ImageIcon"
          classpathref="classpath"/>
      </or>
    </condition>

    <available property="rhino.present"
               classname="org.mozilla.javascript.Scriptable"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="beanshell.present"
               classname="bsh.StringUtil"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="xerces1.present"
               classname="org.apache.xerces.framework.XMLParser"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="jsch.present"
               classname="com.jcraft.jsch.Session"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    <available property="xz.present"
               classname="org.tukaani.xz.XZOutputStream"
               classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>

    <property name="build.compiler" value="modern"/>

    <!-- check for XSD support in the parser -->
    <condition property="xmlschema.present">
      <or>
        <parsersupports feature="http://apache.org/xml/features/validation/schema"/>
        <parsersupports feature="http://java.sun.com/xml/jaxp/properties/schemaSource"/>
      </or>
    </condition>

    <!--
    Java8 introduced a HTML checker 'doclint' which is very strict and breaks
    the build if there is a HTML error in the JavaDoc.
    -->
    <condition
            property="javadoc.doclint.none"
            value="-Xdoclint:none"
            else="">
      <not><isset property="withDoclint"/></not>
    </condition>

    <condition property="cyclonedx.antlib.present">
      <and>
        <available
            classname="org.apache.ant.cyclonedx.ComponentBomTask"
            classpathref="classpath"
            ignoresystemclasses="${ignoresystemclasses}"/>
        <!-- https://github.com/CycloneDX/cyclonedx-core-java/issues/848 -->
        <isset property="jdk9+"/>
      </and>
    </condition>
  </target>

  <!--
       ===================================================================
         Prepare the build
       ===================================================================
  -->
  <target name="prepare" depends="check-optional-packages">
    <tstamp>
      <format property="year" pattern="yyyy"/>
    </tstamp>
    <filterchain id="ant.filters">
       <expandproperties/>
    </filterchain>
  </target>

  <!--
       ===================================================================
         Build the code
       ===================================================================
  -->
  <target name="build" depends="prepare, compile, compile-jdk9+" unless="skip.build"
          description="--> compiles the source code">

    <!-- Builds and verifies that the classes belonging in the confined package of
    junitlauncher task do not depend on classes they aren't meant to -->
    <!-- first wipe out the "confined" package that might have been built already
     due to the javac above -->
    <delete dir="${build.classes}/${optional.package}/junitlauncher/confined/"/>
    <javac srcdir="${java.dir}"
           includeantruntime="false"
           destdir="${build.classes}"
           debug="${debug}"
           deprecation="${deprecation}"
           includes="${optional.package}/junitlauncher/confined/**"
           target="${javac.target}"
           source="${javac.source}"
           release="${javac.release}"
           optimize="${optimize}">
      <compilerarg line="-proc:none"/>
      <classpath>
        <!-- A very limited classpath which only doesn't include optional libraries,
         which the classes in confined package aren't meant to depend on -->
        <fileset dir="${build.classes}">
          <!-- exclude the org/apache/tools/ant/taskdefs/optional/junitlauncher package
          from the classpath, since the confined package isn't meant to depend on
          classes in this package -->
          <exclude name="org/apache/tools/ant/taskdefs/optional/junitlauncher/*"/>
        </fileset>
      </classpath>

    </javac>

    <copy todir="${build.classes}">
      <fileset dir="${java.dir}">
        <include name="**/*.properties"/>
        <include name="**/*.dtd"/>
        <include name="**/*.xml"/>
      </fileset>
      <fileset dir="${resource.dir}"/>
    </copy>

    <copy todir="${build.classes}"
      overwrite="true" encoding="UTF-8">
      <fileset dir="${java.dir}">
        <include name="**/version.txt"/>
        <include name="**/defaultManifest.mf"/>
      </fileset>
      <filterchain refid="ant.filters"/>
    </copy>

    <copy todir="${build.classes}/${optional.package}/junit/xsl">
      <fileset dir="${etc.dir}">
        <include name="junit-frames.xsl"/>
        <include name="junit-noframes.xsl"/>
        <include name="junit-frames-saxon.xsl"/>
        <include name="junit-noframes-saxon.xsl"/>
      </fileset>
    </copy>
  </target>

  <target name="compile" depends="prepare">
    <mkdir dir="${build.classes}"/>
    <javac srcdir="${java.dir}"
           includeantruntime="false"
           destdir="${build.classes}"
           debug="${debug}"
           deprecation="${deprecation}"
           excludes="${optional.package}/junitlauncher/confined/**"
           target="${javac.target}"
           source="${javac.source}"
           release="${javac.release}"
           optimize="${optimize}">
      <compilerarg line="-proc:none"/>
      <classpath refid="classpath"/>

      <selector id="conditional-patterns">
        <not>
          <or>
            <selector refid="needs.jdk9+"/>
            <selector refid="not.in.kaffe" if="kaffe"/>
            <selector refid="needs.apache-resolver" unless="apache-resolver.present"/>
            <selector refid="needs.junit" unless="junit.present"/> <!-- TODO should perhaps use -source 1.4? -->
            <selector refid="needs.junit4" unless="junit4.present"/>
            <selector refid="needs.junitlauncher" unless="junitlauncher.present"/>
            <selector refid="needs.junit.engine.vintage" unless="junit.engine.vintage.present"/>
            <selector refid="needs.junit.engine.jupiter" unless="junit.engine.jupiter.present"/>
            <selector refid="needs.apache-regexp" unless="apache-regexp.present"/>
            <selector refid="needs.apache-oro" unless="apache-oro.present"/>
            <selector refid="needs.apache-bcel" unless="apache-bcel.present"/>
            <selector refid="needs.apache-log4j" unless="apache-log4j.present"/>
            <selector refid="needs.commons-logging" unless="commons-logging.present"/>
            <selector refid="needs.apache-bsf" unless="apache-bsf.present"/>
            <selector refid="needs.javamail" unless="javamail.present"/>
            <selector refid="needs.jakartamail" unless="jakartamail.present"/>
            <selector refid="needs.netrexx" unless="netrexx.present"/>
            <selector refid="needs.commons-net" unless="commons-net.present"/>
            <selector refid="needs.antlr" unless="antlr.present"/>
            <selector refid="needs.imageio" unless="imageio.present"/>
            <selector refid="needs.jmf" unless="jmf.present"/>
            <selector refid="needs.jai" unless="jai.present"/>
            <selector refid="needs.jdepend" unless="jdepend.present"/>
            <selector refid="needs.swing" unless="swing.present"/>
            <selector refid="needs.jsch" unless="jsch.present"/>
            <selector refid="needs.xz" unless="xz.present"/>
            <selector refid="needs.xmlschema" unless="xmlschema.present"/>
            <selector refid="needs.apache-xalan2" unless="apache-xalan2.present"/>
          </or>
        </not>
      </selector>
    </javac>
  </target>

  <target name="compile-jdk9+" depends="prepare" if="jdk9+">
    <mkdir dir="${build.classes}"/>

    <javac srcdir="${java.dir}"
           includeantruntime="false"
           destdir="${build.classes}"
           debug="${debug}"
           deprecation="${deprecation}"
           target="${javac.target}"
           source="${javac.source}"
           optimize="${optimize}">
      <compilerarg line="-proc:none"/>
      <classpath refid="classpath"/>

      <selector id="conditional-patterns-jdk9+">
          <or>
            <selector refid="needs.jdk9+"/>
          </or>
      </selector>
    </javac>
  </target>

  <!--
       ===================================================================
         Create the all of the Apache Ant jars
       ===================================================================
  -->
  <target name="jars" depends="build"
          description="--> creates the Apache Ant jars">

    <copy todir="${build.dir}">
      <fileset dir="${basedir}">
        <include name="LICENSE"/>
        <include name="LICENSE.xerces"/>
        <include name="LICENSE.dom"/>
        <include name="LICENSE.sax"/>
        <include name="NOTICE"/>
      </fileset>
      <mapper type="glob" from="*" to="*.txt"/>
    </copy>

    <jar destfile="${build.lib}/${name}-launcher.jar"
         basedir="${build.classes}" index="true"
         whenmanifestonly="fail">
      <selector refid="ant.launcher"/>
      <metainf dir="${build.dir}">
        <include name="LICENSE.txt"/>
        <include name="NOTICE.txt"/>
      </metainf>
      <manifest>
        <attribute name="Main-Class" value="org.apache.tools.ant.launch.Launcher"/>
      </manifest>
    </jar>

    <jar destfile="${build.lib}/${name}.jar"
         basedir="${build.classes}" index="true"
         whenmanifestonly="fail">
      <!-- Verification: (cd dist/lib; for j in *.jar; do jar tf $j; done) | egrep -v '/$|META-INF/MANIFEST\.MF' | sort | uniq -d -->
      <selector refid="ant.core"/>
      <metainf dir="${build.dir}">
        <include name="LICENSE.txt"/>
        <include name="NOTICE.txt"/>
      </metainf>
      <manifest>
        <attribute name="Main-Class" value="org.apache.tools.ant.Main"/>
        <section name="${ant.package}/">
          <attribute name="Extension-Name"
                     value="org.apache.tools.ant"/>
          <attribute name="Specification-Title"
                     value="Apache Ant"/>
          <attribute name="Specification-Version"
                     value="${manifest-version}"/>
          <attribute name="Specification-Vendor"
                     value="Apache Software Foundation"/>
          <attribute name="Implementation-Title"
                     value="org.apache.tools.ant"/>
          <attribute name="Implementation-Version"
                     value="${manifest-version}"/>
          <attribute name="Implementation-Vendor"
                     value="Apache Software Foundation"/>
        </section>
      </manifest>

      <fileset dir="${manual.dir}">
        <include name="images/ant_logo_large.gif"/>
      </fileset>
    </jar>

    <jar destfile="${build.lib}/${bootstrap.jar}"
         basedir="${build.classes}"
         whenmanifestonly="fail">
      <include name="${ant.package}/Main.class"/>
      <metainf dir="${build.dir}">
        <include name="LICENSE.txt"/>
        <include name="NOTICE.txt"/>
      </metainf>
      <manifest>
        <attribute name="Main-Class" value="org.apache.tools.ant.Main"/>
        <attribute name="Class-Path" value="ant.jar xalan.jar"/>
      </manifest>
    </jar>

    <macrodef name="optional-jar">
      <attribute name="dep"/>
      <sequential>
        <jar destfile="${build.lib}/${optional.jars.prefix}-@{dep}.jar"
             basedir="${build.classes}" index="true"
             whenmanifestonly="${optional.jars.whenmanifestonly}">
          <selector refid="needs.@{dep}"/>
          <metainf dir="${build.dir}">
            <include name="LICENSE.txt"/>
            <include name="NOTICE.txt"/>
          </metainf>
          <manifest>
            <section name="${optional.package}/">
              <attribute name="Extension-Name"
                         value="org.apache.tools.ant"/>
              <attribute name="Specification-Title"
                         value="Apache Ant"/>
              <attribute name="Specification-Version"
                         value="${manifest-version}"/>
              <attribute name="Specification-Vendor"
                         value="Apache Software Foundation"/>
              <attribute name="Implementation-Title"
                         value="org.apache.tools.ant"/>
              <attribute name="Implementation-Version"
                         value="${manifest-version}"/>
              <attribute name="Implementation-Vendor"
                         value="Apache Software Foundation"/>
            </section>
          </manifest>
        </jar>
      </sequential>
    </macrodef>

    <optional-jar dep="apache-resolver"/>
    <optional-jar dep="junit"/>
    <optional-jar dep="junit4"/>
    <optional-jar dep="junitlauncher"/>
    <optional-jar dep="apache-regexp"/>
    <optional-jar dep="apache-oro"/>
    <optional-jar dep="apache-bcel"/>
    <optional-jar dep="apache-log4j"/>
    <optional-jar dep="commons-logging"/>
    <optional-jar dep="apache-bsf"/>
    <optional-jar dep="javamail"/>
    <optional-jar dep="jakartamail"/>
    <optional-jar dep="netrexx"/>
    <optional-jar dep="commons-net"/>
    <optional-jar dep="antlr"/>
    <optional-jar dep="imageio"/>
    <optional-jar dep="jmf"/>
    <optional-jar dep="jai"/>
    <optional-jar dep="swing"/>
    <optional-jar dep="jsch"/>
    <optional-jar dep="jdepend"/>
    <optional-jar dep="apache-xalan2"/>
    <optional-jar dep="xz"/>

  </target>

  <!--   Creates jar of test utility classes -->
  <target name="test-jar" depends="compile-tests"
          description="--> creates the Apache Ant Test Utilities jar">

    <fail unless="junit.present">
      We cannot build the test jar unless JUnit is present,
      as JUnit is needed to compile the test classes.
    </fail>
    <jar destfile="${build.lib}/${name}-testutil.jar" index="true"
         basedir="${build.tests}">
      <patternset refid="useful.tests"/>
      <metainf dir="${build.dir}">
        <include name="LICENSE.txt"/>
        <include name="NOTICE.txt"/>
      </metainf>
    </jar>
  </target>

  <!--
       ===================================================================
         Create the all of the Apache Ant source jars
       ===================================================================
  -->
  <target name="jars-sources" description="--> creates the Apache Ant source jars">
    <mkdir dir="${build.lib-src}"/>
    <jar destfile="${build.lib-src}/${name}-launcher.jar"
         basedir="${java.dir}"
         whenmanifestonly="fail">
      <selector refid="ant.launcher"/>
      <metainf dir="${build.dir}">
        <include name="LICENSE.txt"/>
        <include name="NOTICE.txt"/>
      </metainf>
    </jar>

    <jar destfile="${build.lib-src}/${name}.jar"
         basedir="${java.dir}"
         whenmanifestonly="fail">
      <selector refid="ant.core"/>
      <metainf dir="${build.dir}">
        <include name="LICENSE.txt"/>
        <include name="NOTICE.txt"/>
      </metainf>
    </jar>

    <jar destfile="${build.lib-src}/${bootstrap.jar}"
         basedir="${java.dir}"
         whenmanifestonly="fail">
      <include name="${ant.package}/Main.java"/>
      <metainf dir="${build.dir}">
        <include name="LICENSE.txt"/>
        <include name="NOTICE.txt"/>
      </metainf>
    </jar>

    <macrodef name="optional-src-jar">
      <attribute name="dep"/>
      <sequential>
        <jar destfile="${build.lib-src}/${optional.jars.prefix}-@{dep}.jar"
             basedir="${java.dir}"
             whenmanifestonly="${optional.jars.whenmanifestonly}">
          <selector refid="needs.@{dep}"/>
          <metainf dir="${build.dir}">
            <include name="LICENSE.txt"/>
            <include name="NOTICE.txt"/>
          </metainf>
        </jar>
      </sequential>
    </macrodef>

    <optional-src-jar dep="apache-resolver"/>
    <optional-src-jar dep="junit"/>
    <optional-src-jar dep="junit4"/>
    <optional-src-jar dep="junitlauncher"/>
    <optional-src-jar dep="apache-regexp"/>
    <optional-src-jar dep="apache-oro"/>
    <optional-src-jar dep="apache-bcel"/>
    <optional-src-jar dep="apache-log4j"/>
    <optional-src-jar dep="commons-logging"/>
    <optional-src-jar dep="apache-bsf"/>
    <optional-src-jar dep="javamail"/>
    <optional-src-jar dep="jakartamail"/>
    <optional-src-jar dep="netrexx"/>
    <optional-src-jar dep="commons-net"/>
    <optional-src-jar dep="antlr"/>
    <optional-src-jar dep="imageio"/>
    <optional-src-jar dep="jmf"/>
    <optional-src-jar dep="jai"/>
    <optional-src-jar dep="swing"/>
    <optional-src-jar dep="jsch"/>
    <optional-src-jar dep="jdepend"/>
    <optional-src-jar dep="apache-xalan2"/>
    <optional-src-jar dep="xz"/>

  </target>

  <target name="test-jar-source"
          description="--> creates the Apache Ant Test Utilities source jar">
    <mkdir dir="${build.lib-src}"/>
    <jar destfile="${build.lib-src}/${name}-testutil.jar"
         basedir="${src.junit}">
      <patternset refid="useful.tests"/>
      <metainf dir="${build.dir}">
        <include name="LICENSE.txt"/>
        <include name="NOTICE.txt"/>
      </metainf>
    </jar>
  </target>

  <!--
       ===================================================================
         Create the essential distribution that can run Apache Ant
       ===================================================================
  -->
  <target name="dist-lite" depends="jars,test-jar,component-boms,-ant-dist-warn-jdk9+"
          description="--> creates a minimum distribution to run Apache Ant">

    <mkdir dir="${dist.dir}"/>
    <mkdir dir="${dist.bin}"/>
    <mkdir dir="${dist.lib}"/>

    <copy todir="${dist.lib}">
      <fileset dir="${build.lib}">
        <exclude name="${bootstrap.jar}"/>
      </fileset>
    </copy>

    <copy todir="${dist.lib}">
      <fileset dir="${lib.dir}">
        <include name="*.jar"/>
        <include name="*.zip"/>
      </fileset>
    </copy>

    <copy todir="${dist.bin}">
      <fileset dir="${script.dir}"/>
    </copy>

    <fixcrlf srcdir="${dist.bin}" eol="dos" includes="*.bat,*.cmd"/>
    <fixcrlf srcdir="${dist.bin}" eol="unix">
      <include name="ant"/>
      <include name="antRun"/>
      <include name="*.pl"/>
    </fixcrlf>

    <setpermissions mode="755" failonerror="${setpermissions.fail}"
                    nonPosixMode="${setpermissions.nonposixmode}">
      <fileset dir="${dist.bin}">
        <include name="**/ant"/>
        <include name="**/antRun"/>
        <include name="**/*.pl"/>
        <include name="**/*.py"/>
      </fileset>
    </setpermissions>

  </target>

  <!--
        ===================================================================
          Create the complete distribution
        ===================================================================
   -->
  <target name="dist" description="--> creates a complete distribution">
    <antcall inheritAll="false" target="dist-internal">
      <param name="dist.dir" value="${dist.name}"/>
    </antcall>
  </target>

  <target name="dist-javadocs" depends="javadocs" unless="javadoc.notrequired">
    <mkdir dir="${dist.javadocs}"/>
    <copy todir="${dist.javadocs}" overwrite="true">
      <fileset dir="${build.javadocs}"/>
    </copy>
  </target>

  <macrodef name="checksums">
    <element name="resources" implicit="true"/>
    <sequential>
      <checksum fileext=".sha512" algorithm="sha-512">
        <resources/>
      </checksum>
    </sequential>
  </macrodef>

  <target name="dist-internal" depends="dist-lite,dist-javadocs">
    <mkdir dir="${dist.manual}"/>
    <mkdir dir="${dist.etc}"/>

    <copy todir="${dist.lib}" file="${lib.dir}/README"/>
    <copy todir="${dist.lib}" file="${lib.dir}/libraries.properties"/>

    <copy todir="${dist.lib}">
      <fileset dir="${src.dir}/etc/poms">
        <include name="*/pom.xml"/>
      </fileset>
      <mapper type="regexp" from="^(.*)[/\\]pom.xml" to="\1.pom"/>
      <filterchain>
        <tokenfilter>
          <replaceregex pattern="${pom.version}" replace="${project.version}"/>
        </tokenfilter>
      </filterchain>
    </copy>
    <copy todir="${dist.lib}">
      <fileset dir="${src.dir}/etc/poms">
        <include name="pom.xml"/>
      </fileset>
      <mapper type="glob" from="pom.xml" to="ant-parent.pom"/>
      <filterchain>
        <tokenfilter>
          <replaceregex pattern="${pom.version}" replace="${project.version}"/>
        </tokenfilter>
      </filterchain>
    </copy>

    <copy todir="${dist.manual}">
      <fileset dir="${manual.dir}"/>
    </copy>

    <copy todir="${dist.dir}">
      <fileset dir="${basedir}">
        <include name="CONTRIBUTORS"/>
        <include name="README"/>
        <include name="INSTALL"/>
        <include name="LICENSE"/>
        <include name="LICENSE.xerces"/>
        <include name="LICENSE.dom"/>
        <include name="LICENSE.sax"/>
        <include name="NOTICE"/>
        <include name="TODO"/>
        <include name="WHATSNEW"/>
        <include name="KEYS"/>
        <include name="contributors.xml"/>
        <include name="fetch.xml"/>
        <include name="get-m2.xml"/>
        <include name="patch.xml"/>
      </fileset>
    </copy>

    <setpermissions mode="755" failonerror="${setpermissions.fail}"
                    nonPosixMode="${setpermissions.nonposixmode}">
      <fileset dir="${dist.bin}">
        <include name="**/ant"/>
        <include name="**/antRun"/>
        <include name="**/*.pl"/>
        <include name="**/*.py"/>
      </fileset>
    </setpermissions>

    <!-- publish some useful stylesheets -->
    <copy todir="${dist.etc}">
      <fileset dir="${etc.dir}">
        <include name="junit-frames.xsl"/>
        <include name="junit-noframes.xsl"/>
        <include name="junit-frames-xalan1.xsl"/>
        <include name="coverage-frames.xsl"/>
        <include name="maudit-frames.xsl"/>
        <include name="mmetrics-frames.xsl"/>
        <include name="changelog.xsl"/>
        <include name="jdepend.xsl"/>
        <include name="jdepend-frames.xsl"/>
        <include name="checkstyle/*.xsl"/>
        <include name="log.xsl"/>
        <include name="tagdiff.xsl"/>
      </fileset>
      <fileset dir="${build.lib}">
        <include name="${bootstrap.jar}"/>
      </fileset>
    </copy>
  </target>

  <!--
       ===================================================================
         Target to create bootstrap build
       ===================================================================
  -->
  <target name="bootstrap" description="--> creates a bootstrap build">
    <antcall inheritAll="false" target="dist-lite">
      <param name="dist.dir" value="${bootstrap.dir}"/>
    </antcall>
  </target>

  <!--
       ===================================================================
         Create the source distribution
       ===================================================================
  -->
  <target name="src-dist"
          description="--> creates a source distribution">

    <mkdir dir="${src.dist.dir}"/>

    <copy todir="${src.dist.lib}">
      <fileset dir="${lib.dir}">
        <include name="optional/junit-3.8.2.jar"/>
        <include name="optional/junit-4.13.2.jar"/>
        <include name="optional/hamcrest-3.0.jar"/>
        <include name="README"/>
        <include name="libraries.properties"/>
      </fileset>
    </copy>

    <mkdir dir="${src.dist.lib}/optional"/>

    <copy todir="${src.dist.src}">
      <fileset dir="${src.dir}"/>
    </copy>

    <copy todir="${src.dist.manual}">
      <fileset dir="${manual.dir}">
        <exclude name="api/"/>
      </fileset>
    </copy>

    <copy todir="${src.dist.dir}">
      <fileset dir="${basedir}">
        <include name="CONTRIBUTORS"/>
        <include name="INSTALL"/>
        <include name="KEYS"/>
        <include name="LICENSE"/>
        <include name="LICENSE.dom"/>
        <include name="LICENSE.sax"/>
        <include name="LICENSE.xerces"/>
        <include name="NOTICE"/>
        <include name="README"/>
        <include name="TODO"/>
        <include name="WHATSNEW"/>
        <include name="bootstrap.bat"/>
        <include name="bootstrap.sh"/>
        <include name="build.bat"/>
        <include name="build.sh"/>
        <include name="build.xml"/>
        <include name="contributors.xml"/>
        <include name="fetch.xml"/>
        <include name="get-m2.xml"/>
        <include name="patch.xml"/>
      </fileset>
    </copy>

    <fixcrlf srcdir="${src.dist.dir}" eol="dos" includes="*.bat,*.cmd"/>
    <fixcrlf srcdir="${src.dist.dir}" eol="unix">
      <include name="**/*.sh"/>
      <include name="**/*.pl"/>
      <include name="**/ant"/>
      <include name="**/antRun"/>
    </fixcrlf>
    <fixcrlf srcdir="${src.dist.dir}">
      <include name="**/*.java"/>
      <exclude name="${tests.etc.dir}/taskdefs/fixcrlf/expected/Junk?.java"/>
      <exclude name="${tests.etc.dir}/taskdefs/fixcrlf/input/Junk?.java"/>
    </fixcrlf>

    <setpermissions mode="755" failonerror="${setpermissions.fail}"
                    nonPosixMode="${setpermissions.nonposixmode}">
      <dirset dir="${src.dist.dir}"/>
    </setpermissions>

    <setpermissions mode="644" failonerror="${setpermissions.fail}"
                    nonPosixMode="${setpermissions.nonposixmode}">
      <fileset dir="${src.dist.dir}"/>
    </setpermissions>

    <setpermissions mode="755" failonerror="${setpermissions.fail}"
                    nonPosixMode="${setpermissions.nonposixmode}">
      <fileset dir="${src.dist.dir}">
        <include name="**/*.sh"/>
        <include name="**/*.pl"/>
        <include name="**/*.py"/>
        <include name="**/ant"/>
        <include name="**/antRun"/>
      </fileset>
    </setpermissions>

  </target>

  <!--
       ===================================================================
         Create the binary distribution
       ===================================================================
  -->
  <target name="-distribution-prep">
    <delete dir="${dist.base}"/>
    <delete dir="${dist.name}"/>
    <delete dir="${java-repository.dir}"/>
    <mkdir dir="${dist.base}"/>
    <mkdir dir="${dist.base.source}"/>
    <mkdir dir="${dist.base.binaries}"/>
    <mkdir dir="${dist.base.manual}"/>
    <mkdir dir="${java-repository.dir}"/>
    <antcall inheritAll="false" target="dist-internal">
      <param name="dist.dir" value="${dist.name}"/>
    </antcall>
  </target>

  <target name="zip-distribution" depends="-distribution-prep"
          description="--> creates the zip distribution">
    <zip destfile="${dist.base.binaries}/${dist.name}-bin.zip">
      <zipfileset dir="${dist.name}/.." filemode="755">
        <include name="${dist.name}/bin/ant"/>
        <include name="${dist.name}/bin/antRun"/>
        <include name="${dist.name}/bin/*.pl"/>
        <include name="${dist.name}/bin/*.py"/>
      </zipfileset>
      <fileset dir="${dist.name}/..">
        <include name="${dist.name}/"/>
        <exclude name="${dist.name}/bin/ant"/>
        <exclude name="${dist.name}/bin/antRun"/>
        <exclude name="${dist.name}/bin/*.pl"/>
        <exclude name="${dist.name}/bin/*.py"/>
      </fileset>
    </zip>
  </target>

  <condition property="buildosxpackage">
    <and>
       <os family="mac"/>
       <isset property="buildosxpackage.required"/>
    </and>
  </condition>

  <target name="pkg-distribution" depends="zip-distribution" if="buildosxpackage">
    <mkdir dir="${build.pkg.dir}"/>
    <unzip src="${dist.base.binaries}/${dist.name}-bin.zip" dest="${build.pkg.dir}">
      <mapper type="regexp" from="^([^/]*)/(.*)$$" to="\2"/>
    </unzip>
    <chmod perm="+x" type="file">
      <fileset dir="${build.pkg.dir}/bin">
        <include name="ant"/>
        <include name="antRun"/>
        <include name="*.pl"/>
        <include name="*.py"/>
      </fileset>
    </chmod>
    <exec executable="/usr/bin/pkgbuild">
      <arg value="--root"/>
      <arg value="${build.pkg.dir}"/>
      <arg value="--identifier"/>
      <arg value="org.apache.ant"/>
      <arg value="--version"/>
      <arg value="${project.version}"/>
      <arg value="--install-location"/>
      <arg value="/usr/local/ant"/>
      <arg value="${dist.base.binaries}/${dist.name}.pkg"/>
    </exec>
  </target>

  <target name="tar-distribution" depends="-distribution-prep"
          description="--> creates the tar distribution">
    <tar longfile="gnu"
         destfile="${dist.base.binaries}/${dist.name}-bin.tar">
      <!-- removes redundant definition of permissions, but seems to
           drop dirs (and to be slow)
           <zipfileset src="${dist.base.binaries}/${dist.name}-bin.zip"/>
      -->
      <tarfileset dir="${dist.name}/.." mode="755" username="ant" group="ant">
        <include name="${dist.name}/bin/ant"/>
        <include name="${dist.name}/bin/antRun"/>
        <include name="${dist.name}/bin/*.pl"/>
        <include name="${dist.name}/bin/*.py"/>
      </tarfileset>
      <tarfileset dir="${dist.name}/.." username="ant" group="ant">
        <include name="${dist.name}/"/>
        <exclude name="${dist.name}/bin/ant"/>
        <exclude name="${dist.name}/bin/antRun"/>
        <exclude name="${dist.name}/bin/*.pl"/>
        <exclude name="${dist.name}/bin/*.py"/>
      </tarfileset>
    </tar>
    <gzip destfile="${dist.base.binaries}/${dist.name}-bin.tar.gz"
          src="${dist.base.binaries}/${dist.name}-bin.tar"/>
    <bzip2 destfile="${dist.base.binaries}/${dist.name}-bin.tar.bz2"
           src="${dist.base.binaries}/${dist.name}-bin.tar"/>
    <xz destfile="${dist.base.binaries}/${dist.name}-bin.tar.xz"
        src="${dist.base.binaries}/${dist.name}-bin.tar"/>
    <delete file="${dist.base.binaries}/${dist.name}-bin.tar"/>
  </target>

  <target name="main-distribution" depends="pkg-distribution,-tar-distribution-sboms,jars-sources,test-jar-source"
          description="--> creates the zip, pkg, and tar distributions">

    <copy todir="${java-repository.dir}">
      <fileset dir="${dist.name}/lib">
        <include name="ant*.jar"/>
      </fileset>
      <mapper type="regexp" from="ant(.*).jar" to="ant\1/${project.version}/ant\1-${project.version}.jar"/>
    </copy>
    <copy todir="${java-repository.dir}">
      <fileset dir="${dist.name}/lib">
        <include name="*.pom"/>
      </fileset>
      <mapper>
        <mapper type="regexp" from="ant(.*).pom" to="ant\1/${project.version}/ant\1-${project.version}.pom"/>
      </mapper>
    </copy>
    <copy todir="${java-repository.dir}">
      <fileset dir="${build.lib-src}">
        <include name="ant*.jar"/>
      </fileset>
      <mapper type="regexp" from="ant(.*).jar" to="ant\1/${project.version}/ant\1-${project.version}-sources.jar"/>
    </copy>
    <copy todir="${java-repository.dir}">
      <fileset dir="${dist.name}/lib">
        <include name="ant*.cdx.*"/>
      </fileset>
      <mapper type="regexp" from="ant(.*).cdx.(.*)" to="ant\1/${project.version}/ant\1-${project.version}.cdx.\2"/>
    </copy>
    <jar destfile="${java-repository.dir}/ant/${project.version}/ant-${project.version}-javadoc.jar"
      basedir="${build.javadocs}">
      <metainf dir="${build.dir}">
        <include name="LICENSE.txt"/>
        <include name="NOTICE.txt"/>
      </metainf>
    </jar>

    <zip destfile="${dist.base.manual}/${dist.name}-manual.zip">
      <zipfileset dir="${dist.name}/manual" prefix="${dist.name}"/>
      <zipfileset file="NOTICE" prefix="${dist.name}"/>
    </zip>
    <tar longfile="gnu"
         destfile="${dist.base.manual}/${dist.name}-manual.tar">
      <tarfileset dir="${dist.name}/manual" prefix="${dist.name}"/>
      <tarfileset file="NOTICE" prefix="${dist.name}"/>
    </tar>
    <gzip destfile="${dist.base.manual}/${dist.name}-manual.tar.gz"
          src="${dist.base.manual}/${dist.name}-manual.tar"/>
    <bzip2 destfile="${dist.base.manual}/${dist.name}-manual.tar.bz2"
           src="${dist.base.manual}/${dist.name}-manual.tar"/>
    <xz destfile="${dist.base.manual}/${dist.name}-manual.tar.xz"
        src="${dist.base.manual}/${dist.name}-manual.tar"/>
    <delete file="${dist.base.manual}/${dist.name}-manual.tar"/>

    <delete dir="${dist.name}"/>
    <checksums>
      <fileset dir="${dist.base.binaries}/">
        <exclude name="**/*.asc"/>
        <exclude name="**/*.sha512"/>
      </fileset>
      <fileset dir="${dist.base.manual}/">
        <exclude name="**/*.asc"/>
        <exclude name="**/*.sha512"/>
      </fileset>
    </checksums>

    <antcall inheritAll="false" target="src-dist">
      <param name="src.dist.dir" value="${dist.name}"/>
    </antcall>
    <zip destfile="${dist.base.source}/${dist.name}-src.zip">
      <zipfileset dir="${dist.name}/.." filemode="755">
        <include name="${dist.name}/bootstrap.sh"/>
        <include name="${dist.name}/build.sh"/>
      </zipfileset>
      <fileset dir="${dist.name}/..">
        <include name="${dist.name}/"/>
        <exclude name="${dist.name}/bootstrap.sh"/>
        <exclude name="${dist.name}/build.sh"/>
      </fileset>
    </zip>
    <tar longfile="gnu"
         destfile="${dist.base.source}/${dist.name}-src.tar">
      <!--
          <zipfileset src="${dist.base.source}/${dist.name}-src.zip"/>
      -->
      <tarfileset dir="${dist.name}/.." mode="755" username="ant" group="ant">
        <include name="${dist.name}/bootstrap.sh"/>
        <include name="${dist.name}/build.sh"/>
      </tarfileset>
      <tarfileset dir="${dist.name}/.." username="ant" group="ant">
        <include name="${dist.name}/"/>
        <exclude name="${dist.name}/bootstrap.sh"/>
        <exclude name="${dist.name}/build.sh"/>
      </tarfileset>
    </tar>
    <gzip destfile="${dist.base.source}/${dist.name}-src.tar.gz"
          src="${dist.base.source}/${dist.name}-src.tar"/>
    <bzip2 destfile="${dist.base.source}/${dist.name}-src.tar.bz2"
           src="${dist.base.source}/${dist.name}-src.tar"/>
    <xz destfile="${dist.base.source}/${dist.name}-src.tar.xz"
        src="${dist.base.source}/${dist.name}-src.tar"/>
    <delete file="${dist.base.source}/${dist.name}-src.tar"/>
    <delete dir="${dist.name}"/>
    <checksums>
      <fileset dir="${dist.base.source}/">
        <exclude name="**/*.asc"/>
        <exclude name="**/*.sha512"/>
      </fileset>
    </checksums>
  </target>

  <target name="distribution" depends="main-distribution,distribution-sboms"
          description="--> creates the full Apache Ant distribution">
  </target>

  <!--
       ===================================================================
         Cleans up build and distribution directories
       ===================================================================
  -->
  <target name="clean"
          description="--> cleans up build and dist directories">
    <delete dir="${build.dir}"/>
    <delete dir="${dist.base}"/>
    <delete dir="${dist.dir}"/>
    <delete>
      <fileset dir="." includes="**/*~" defaultexcludes="no"/>
    </delete>
  </target>

  <!--
       ===================================================================
         Cleans everything
       ===================================================================
  -->
  <target name="allclean" depends="clean"
          description="--> cleans up everything">
    <delete file="${bootstrap.dir}/bin/antRun"/>
    <delete file="${bootstrap.dir}/bin/antRun.bat"/>
    <delete>
      <fileset dir="${bootstrap.dir}/bin" includes="*.pl"/>
      <fileset dir="${bootstrap.dir}/bin" includes="*.py"/>
    </delete>
  </target>

  <!--
       ===================================================================
         Installs Apache Ant
       ===================================================================
  -->
  <target name="install">
    <fail message="You must set the property ant.install=/where/to/install" unless="ant.install"/>
    <antcall inheritAll="false" target="dist-internal">
      <param name="dist.dir" value="${ant.install}"/>
    </antcall>
  </target>

  <target name="install-lite">
    <fail message="You must set the property ant.install=/where/to/install" unless="ant.install"/>
    <antcall inheritAll="false" target="dist-lite">
      <param name="dist.dir" value="${ant.install}"/>
    </antcall>
  </target>

  <!--
       ===================================================================
         Creates the API documentation
       ===================================================================
  -->
  <target name="check-javadoc" depends="prepare">
    <uptodate property="javadoc.notrequired"
              targetfile="${build.javadocs}/packages.html">
      <srcfiles dir="${java.dir}" includes="**/*.java"/>
    </uptodate>
    <uptodate property="tests.javadoc.notrequired"
              targetfile="${build.tests.javadocs}/packages.html">
      <srcfiles dir="${src.junit}">
        <patternset refid="useful.tests"/>
      </srcfiles>
    </uptodate>
  </target>

  <target name="javadocs" depends="check-javadoc"
          description="--> creates the API documentation" unless="javadoc.notrequired">
    <mkdir dir="${build.javadocs}"/>
    <javadoc useexternalfile="yes"
             destdir="${build.javadocs}"
             failonerror="true"
             author="true"
             version="true"
             locale="en"
             windowtitle="${Name} API"
             doctitle="${Name}"
             maxmemory="1000M"
             verbose="${javadoc.verbose}"
             additionalparam="${javadoc.doclint.none}">

      <packageset dir="${java.dir}"/>

      <!-- hide some meta information for javadoc -->
      <tag name="todo" description="To do:" scope="all"/>
      <tag name="ant.task" enabled="false" description="Task:" scope="types"/>
      <tag name="ant.datatype" enabled="false" description="Data type:" scope="types"/>
      <tag name="ant.attribute" enabled="false" description="Attribute:" scope="types"/>
      <tag name="ant.attribute.group" enabled="false" description="Attribute group:" scope="types"/>
      <tag name="ant.element" enabled="false" description="Nested element:" scope="types"/>
      <group title="Apache Ant Core" packages="org.apache.tools.ant*"/>
      <group title="Core Tasks" packages="org.apache.tools.ant.taskdefs*"/>
      <group title="Core Types" packages="org.apache.tools.ant.types*"/>
      <group title="Optional Tasks" packages="org.apache.tools.ant.taskdefs.optional*"/>
      <group title="Optional Types" packages="org.apache.tools.ant.types.optional*"/>
      <group title="Ant Utilities" packages="org.apache.tools.ant.util*"/>
      <classpath refid="tests-classpath"/>
    </javadoc>
  </target>

  <target name="test-javadocs" depends="check-javadoc" unless="tests.javadoc.notrequired"
          description="--> creates the API documentation for test utilities">
    <mkdir dir="${build.tests.javadocs}"/>
    <javadoc useexternalfile="yes"
             destdir="${build.tests.javadocs}"
             failonerror="true"
             author="true"
             version="true"
             locale="en"
             windowtitle="${Name} Test Utilities"
             doctitle="${Name}"
             additionalparam="${javadoc.doclint.none}">

      <!-- hide some meta information for javadoc -->
      <tag name="pre" description="Precondition:" scope="all"/>

      <fileset dir="${src.junit}">
        <patternset refid="useful.tests"/>
      </fileset>
      <classpath refid="tests-classpath"/>
    </javadoc>
  </target>

  <!--
       ===================================================================
         Compile testcases
       ===================================================================
  -->
  <target name="compile-tests" depends="build" if="junit.present">
    <mkdir dir="${build.tests}"/>

    <javac srcdir="${src.junit}"
           includeantruntime="false"
           destdir="${build.tests}"
           debug="${debug}"
           target="${javac.target}"
           source="${javac.source}"
           release="${javac.release}"
           deprecation="${deprecation}">
      <compilerarg line="-proc:none"/>
      <classpath refid="tests-classpath"/>

      <selector refid="conditional-patterns"/>
    </javac>

    <!-- Used by AntlibTest.testAntlibResource: -->
    <jar jarfile="${build.tests}/org/apache/tools/ant/taskdefs/test2-antlib.jar">
      <manifest>
        <attribute name="Extension-name"
                   value="org.apache.tools.ant"/>
        <attribute name="Specification-Title"
                   value="Apache Ant"/>
        <attribute name="Specification-Version"
                   value="${manifest-version}"/>
        <attribute name="Specification-Vendor"
                   value="Apache Software Foundation"/>
        <attribute name="Implementation-Title"
                   value="org.apache.tools.ant"/>
        <attribute name="Implementation-Version"
                   value="${manifest-version}"/>
        <attribute name="Implementation-Vendor"
                   value="Apache Software Foundation"/>
      </manifest>
      <zipfileset dir="${tests.etc.dir}" fullpath="taskdefs/test.antlib.xml">
        <include name="taskdefs/test2.antlib.xml"/>
      </zipfileset>
    </jar>
  </target>

  <target name="dump-info" depends="dump-sys-properties,run-which"/>

  <target name="dump-sys-properties" depends="xml-check" unless="which.present">
    <echo message="java.vm.info=${java.vm.info}"/>
    <echo message="java.vm.name=${java.vm.name}"/>
    <echo message="java.vm.vendor=${java.vm.vendor}"/>
    <echo message="java.vm.version=${java.vm.version}"/>
    <echo message="os.arch=${os.arch}"/>
    <echo message="os.name=${os.name}"/>
    <echo message="os.version=${os.version}"/>
    <echo message="file.encoding=${file.encoding}"/>
    <echo message="user.language=${user.language}"/>
    <echo message="ant.version=${ant.version}"/>
  </target>

  <!-- helper class from Xalan2 to check for jar versioning of xml/xsl processors -->
  <target name="xml-check" depends="check-optional-packages" if="xalan.envcheck" unless="which.present">
    <java classname="org.apache.xalan.xslt.EnvironmentCheck"/>
  </target>

  <target name="run-which" depends="check-optional-packages" if="which.present">
    <java classname="org.apache.env.Which" taskname="which" classpathref="classpath"/>
  </target>

  <!-- test to see if we are online or not. can take a while when we are off line, so
       setting the property is a good shortcut-->
  <target name="probe-offline">
    <condition property="offline">
      <or>
        <isset property="offline"/>
        <not>
          <http url="http://www.apache.org/"/>
        </not>
      </or>
    </condition>
    <echo level="verbose"> offline=${offline}</echo>
  </target>

  <!--
       ===================================================================
         Run testcase
       ===================================================================
  -->

  <target name="check-failed">
    <condition property="tests.failed">
      <or>
        <isset property="junit.failed"/>
        <isset property="antunit.failed"/>
      </or>
    </condition>
  </target>

  <target name="test" depends="junit-report,antunit-report,check-failed"
          description="--> run unit tests and reports">
    <fail if="tests.failed" unless="ignore.tests.failed">Unit tests failed; see:
${build.junit.reports}
${antunit.reports}
    </fail>
  </target>

  <target name="run-tests" depends="junit-tests,antunit-tests,check-failed"
          description="--> run unit tests without reports">
    <fail if="tests.failed" message="Unit tests failed"/>
  </target>

  <target name="test-init" depends="probe-offline,check-optional-packages,dump-info">
    <mkdir dir="${build.junit.tmpdir}"/>
    <condition property="sun.io.useCanonCaches" value="false">
      <not>
        <javaversion atleast="9"/>
      </not>
    </condition>
    <macrodef name="test-junit">
      <element name="junit-nested" implicit="true"/>
      <sequential>
        <!-- Delete 'old' collector classes -->
        <delete failonerror="false">
          <fileset dir="${junit.collector.dir}" includes="${junit.collector.class}*.class"/>
        </delete>
        <!-- compile the FailedTests class if present -->
        <mkdir dir="${junit.collector.dir}"/>
        <!-- FIXME: removed junit collector build code
        <javac srcdir="${junit.collector.dir}" destdir="${junit.collector.dir}">
          <classpath id="failure.cp">
            <pathelement location="${build.classes}"/>
            <pathelement location="${build.tests}"/>
          </classpath>
        </javac>
        -->
        <available file="${junit.collector.dir}/${junit.collector.class}.class"
                   property="hasFailingTests"/>
        <!-- run the tests -->
        <mkdir dir="${build.junit.xml}"/>
        <property name="test.junit.vmargs" value=""/>
        <property name="ant.junit.failureCollector"
                  value="${junit.collector.dir}/${junit.collector.class}"/>
        <!-- TODO includeantruntime="false" does not solve "multiple versions of ant detected in path for junit" warning -->
        <junit printsummary="${junit.summary}"
               haltonfailure="${test.haltonfailure}"
               fork="${junit.fork}"
               forkmode="${junit.forkmode}"
               threads="${junit.threads}"
               tempdir="${build.dir}"
               failureproperty="junit.failed"
               errorproperty="junit.failed"
               filtertrace="${junit.filtertrace}">
          <sysproperty key="ant.home" value="${ant.home}"/>
          <sysproperty key="build.classes.value" value="${build.classes.value}"/>
          <sysproperty key="build.tests.value" value="${build.tests.value}"/>
          <sysproperty key="offline" value="${offline}"/>
          <sysproperty key="tests-classpath.value"
                       value="${toString:tests-runtime-classpath}"/>
          <sysproperty key="root" file="${basedir}"/>
          <sysproperty key="build.compiler" value="${build.compiler}"/>
          <sysproperty key="tests.and.ant.share.classloader"
                       value="${tests.and.ant.share.classloader}"/>
          <sysproperty key="java.io.tmpdir" file="${build.junit.tmpdir}"/>
          <!-- in Java8 the canonical cache seems to interfere with
               our symlink tests -->
          <syspropertyset>
            <propertyref name="sun.io.useCanonCaches"/>
          </syspropertyset>
          <classpath>
            <path refid="tests-runtime-classpath"/>
            <pathelement location="${junit.collector.dir}"/>
            <!-- FIXME: remove failure collector build code for the moment
                 <path refid="failure.cp"/>
            -->
          </classpath>
          <!-- FIXME: remove failure collector build code for the moment
               <formatter type="failure" usefile="false"/>
          -->
          <formatter type="xml"/>
          <jvmarg line="${test.junit.vmargs}"/>
          <!-- FIXME: remove failure collector build code for the moment
               <test name="${junit.collector.class}" if="hasFailingTests"/>
          -->
          <junit-nested/>
        </junit>
      </sequential>
    </macrodef>

    <fail>"testcase" cannot be specified with "junit.testcase" or "antunit.testcase".
      <condition>
        <and>
          <isset property="testcase"/>
          <or>
            <isset property="antunit.testcase"/>
            <isset property="junit.testcase"/>
          </or>
        </and>
      </condition>
    </fail>

    <condition property="antunit.testcase" value="${testcase}">
      <available file="${src.antunit}/${testcase}"/>
    </condition>

    <condition property="junit.testcase" value="${testcase}">
      <available classname="${testcase}" classpathref="tests-runtime-classpath" ignoresystemclasses="${ignoresystemclasses}"/>
    </condition>

    <fail>Cannot locate test ${testcase}
      <condition>
        <and>
          <isset property="testcase"/>
          <not>
            <or>
              <isset property="antunit.testcase"/>
              <isset property="junit.testcase"/>
            </or>
          </not>
        </and>
      </condition>
    </fail>

    <condition property="run.junit">
      <and>
        <not><equals arg1="${testcase}" arg2="${antunit.testcase}"/></not>
        <isset property="junit.present"/>
        <available file="${src.junit}"/>
      </and>
    </condition>

    <condition property="junit.single">
      <and>
        <isset property="junit.testcase"/>
        <isset property="run.junit"/>
      </and>
    </condition>

    <condition property="junit.batch">
      <and>
        <not><isset property="junit.testcase"/></not>
        <isset property="run.junit"/>
      </and>
    </condition>

    <condition property="run.antunit">
      <and>
        <not><equals arg1="${testcase}" arg2="${junit.testcase}"/></not>
        <isset property="antunit.present"/>
        <available file="${src.antunit}"/>
      </and>
    </condition>

    <condition property="run.antunit.report">
      <isset property="run.antunit"/>
    </condition>

    <condition property="run.junit.report">
      <isset property="run.junit"/>
    </condition>
  </target>

  <target name="junit-report" depends="junit-tests,junit-report-only"/>

  <target name="junit-report-only" depends="test-init" if="${run.junit.report}">
    <mkdir dir="${build.junit.reports}"/>
    <junitreport todir="${build.junit.reports}">
      <fileset dir="${build.junit.xml}">
        <include name="TEST-*.xml"/>
      </fileset>
      <report format="frames" todir="${build.junit.reports}"/>
    </junitreport>
  </target>

  <target name="junit-tests" depends="junit-batch,graaljs-tests,junit-single-test"/>

  <target name="graaljs-tests" depends="compile-tests,test-init"
          if="graaljs.present">
    <junit printsummary="${junit.summary}"
           haltonfailure="${test.haltonfailure}"
           fork="true"
           forkmode="perTest"
           tempdir="${build.dir}"
           failureproperty="junit.failed"
           errorproperty="junit.failed"
           filtertrace="${junit.filtertrace}">
      <sysproperty key="ant.home" value="${ant.home}"/>
      <sysproperty key="build.classes.value" value="${build.classes.value}"/>
      <sysproperty key="build.tests.value" value="${build.tests.value}"/>
      <sysproperty key="offline" value="${offline}"/>
      <sysproperty key="tests-classpath.value"
                   value="${toString:tests-runtime-classpath}"/>
      <sysproperty key="root" file="${basedir}"/>
      <sysproperty key="build.compiler" value="${build.compiler}"/>
      <sysproperty key="tests.and.ant.share.classloader"
                   value="${tests.and.ant.share.classloader}"/>
      <sysproperty key="java.io.tmpdir" file="${build.junit.tmpdir}"/>
      <classpath>
        <path refid="tests-runtime-classpath"/>
        <pathelement location="${junit.collector.dir}"/>
      </classpath>
      <formatter type="xml"/>
      <batchtest todir="${build.junit.xml}" unless="hasFailingTests">
        <fileset dir="${src.junit}" excludes="**/Abstract*">
          <selector refid="needs.graaljs" if="graaljs.present"/>
        </fileset>
      </batchtest>
    </junit>
  </target>

  <target name="junit-batch" depends="compile-tests,test-init" if="junit.batch">

    <property name="junit.includes" value="**/*Test*"/>
    <property name="junit.excludes" value=""/>

    <test-junit>
      <formatter type="brief" usefile="false"/>

      <batchtest todir="${build.junit.xml}" unless="hasFailingTests">
        <fileset dir="${src.junit}"
                 includes="${junit.includes}" excludes="${junit.excludes}">

          <!-- abstract classes, not testcases -->
          <exclude name="${taskdefs.package}/TaskdefsTest.java"/>
          <exclude name="${ant.package}/BuildFileTest.java"/>
          <exclude name="${ant.package}/MagicTestNames.java"/>
          <exclude name="${regexp.package}/RegexpMatcherTest.java"/>
          <exclude name="${regexp.package}/RegexpTest.java"/>
          <exclude name="${optional.package}/AbstractXSLTLiaisonTest.java"/>
          <exclude name="${ant.package}/types/AbstractFileSetTest.java"/>
          <exclude name="${ant.package}/types/selectors/BaseSelectorTest.java"/>

          <!-- helper classes, not testcases -->
          <exclude name="org/example/"/>
          <exclude name="${taskdefs.package}/TaskdefTest*Task.java"/>
          <exclude name="${optional.package}/junit/TestFormatter.java"/>
          <exclude name="${ant.package}/TestHelper.java"/>

          <!-- JUnit 5 / junitlauncher tests that aren't meant to run by junit task -->
          <exclude name="${optional.package}/junitlauncher/"/>

          <!-- interactive tests -->
          <exclude name="${taskdefs.package}/TestProcess.java"/>
          <exclude name="${optional.package}/splash/SplashScreenTest.java"/>

          <!-- GraalVM JavaScript Nashorn compat tests influencing current JVM -->
          <exclude name="${optional.package}/script/graal/"/>

          <!-- only run these tests if their required libraries are installed -->
          <selector refid="conditional-patterns"/>

          <!-- tests excluded if the test is run in offline mode -->
          <patternset refid="onlinetests"/>

          <!-- failing tests excluded unless run.failing.tests is set -->
          <patternset refid="teststhatfail"/>

          <!-- needs BSF to work -->
          <exclude name="${optional.package}/Rhino*.java"
                   unless="apache-bsf.present"/>
          <exclude name="${optional.package}/Rhino*.java"
                   unless="rhino.present"/>
          <exclude name="${optional.package}/script/*.java"
                   unless="apache-bsf.present"/>
          <exclude name="${optional.package}/script/*.java"
                   unless="rhino.present"/>
          <exclude name="${optional.package}/BeanShellScriptTest.java"
                   unless="apache-bsf.present"/>
          <exclude name="${optional.package}/BeanShellScriptTest.java"
                   unless="beanshell.present"/>
          <exclude name="${optional.type.package}/Script*.java"
                   unless="apache-bsf.present"/>
          <exclude name="${optional.type.package}/Script*.java"
                   unless="rhino.present"/>

          <!-- fail if testcases can be loaded from the system classloader -->
          <exclude name="${ant.package}/AntClassLoaderDelegationTest.java"
                   if="tests.are.on.system.classpath"/>
          <exclude name="${optional.package}/junit/JUnitClassLoaderTest.java"
                   if="tests.are.on.system.classpath"/>

          <!-- these tests need to be localised before being ran???? -->
          <exclude name="${optional.package}/PvcsTest.java"/>

          <exclude name="${optional.package}/junit/JUnitReportTest.java"
                   unless="run.junitreport"/>

          <!-- needs xerces to work -->
          <exclude name="${ant.package}/IncludeTest.java"
                   unless="xerces1.present"/>
          <exclude name="${type.package}/selectors/ModifiedSelectorTest.java"
                   unless="xerces1.present"/>

          <!-- needs resolver.jar to work -->
          <exclude name="${optional.package}/XmlValidateCatalogTest.java"
                   unless="apache-resolver.present"/>

          <!-- needs jasperc -->
          <exclude name="${optional.package}/JspcTest.java"
                   unless="jasper.present"/>

          <!-- needs JavaMail -->
          <exclude name="${taskdefs.package}/email/EmailTaskTest.java"
                   unless="javamail.complete"/>

          <!--  These tests only passes if testcases and Ant classes have
               been loaded by the same classloader - will throw
               IllegalAccessExceptions otherwise.  -->
          <exclude name="${taskdefs.package}/SQLExecTest.java"
                   unless="tests.and.ant.share.classloader"/>
          <exclude name="${taskdefs.package}/cvslib/ChangeLogWriterTest.java"
                   unless="tests.and.ant.share.classloader"/>
          <exclude name="${taskdefs.package}/cvslib/ChangeLogParserTest.java"
                   unless="tests.and.ant.share.classloader"/>
          <exclude name="${optional.package}/sos/SOSTest.java"
                   unless="tests.and.ant.share.classloader"/>
          <exclude name="${optional.package}/vss/MSVSSTest.java"
                   unless="tests.and.ant.share.classloader"/>
          <exclude name="${optional.package}/TraXLiaisonTest.java"
                   unless="tests.and.ant.share.classloader"/>
          <exclude name="${taskdefs.package}/ProcessDestroyerTest.java"
                   unless="tests.and.ant.share.classloader"/>
          <exclude name="${taskdefs.package}/ProtectedJarMethodsTest.java"
                   unless="tests.and.ant.share.classloader"/>
          <exclude name="${ant.package}/launch/LocatorTest.java"
                   unless="tests.and.ant.share.classloader"/>
          <exclude name="${ant.package}/DefaultLoggerTest.java"
                   unless="tests.and.ant.share.classloader"/>
          <exclude name="${taskdefs.package}/ZipExtraFieldTest.java"
                   unless="tests.and.ant.share.classloader"/>

          <!-- can only run if cvs is installed on your machine
               enable by setting the property have.cvs
          -->
          <exclude name="${taskdefs.package}/AbstractCvsTaskTest.java"
                   unless="have.cvs"/>

          <!-- needs a local ftp server and the entry of a user/password combination -->
          <exclude name="${optional.package}/net/FTPTest.java"/>

          <!-- test needs special setup -->
          <exclude name="${optional.package}/ssh/ScpTest.java"/>

          <!-- test fails if build/classes and ant.jar are using the same
               classloader  -->
          <exclude name="${ant.package}/util/ClasspathUtilsTest.java"
                   if="tests.and.ant.share.classloader"/>
        </fileset>
      </batchtest>
    </test-junit>
  </target>

  <target name="junit-single-test" depends="compile-tests,junit-single-test-only"
          description="--> runs the single unit test at $${junit.testcase}"/>

  <target name="junit-single-test-only" depends="test-init" if="junit.single"
          description="--> runs the single unit test at $${junit.testcase} (no compile)">
    <test-junit>
      <formatter type="plain" usefile="false"/>
      <test name="${junit.testcase}" todir="${build.junit.xml}"/>
    </test-junit>
  </target>

  <target name="interactive-tests" depends="compile-tests"
          description="--> runs interactive tests">
    <java classpathref="tests-runtime-classpath"
          classname="org.apache.tools.ant.taskdefs.TestProcess"
          fork="true"/>
  </target>

  <target name="-antunit-check-location">
    <condition property="antunit.recommended.location">
      <or>
        <equals arg1="${ant.home}" arg2="${bootstrap.dir}"/>
        <equals arg1="${ant.home}" arg2="${dist.dir}"/>
      </or>
    </condition>
  </target>

  <target name="-antunit-warn-location" depends="-antunit-check-location" if="run.antunit" unless="${antunit.recommended.location}">
      <echo>AntUnit tests must be run with ${bootstrap.dir} (or ${dist.dir}), not ${ant.home}. Try './build.sh antunit-tests' for example.</echo>
  </target>

  <target name="-ant-dist-warn-jdk9+" unless="jdk9+">
      <echo>Java 9+ features won't be available in the distribution</echo>
  </target>

  <target name="antunit-tests" depends="build,test-init,-antunit-warn-location" if="run.antunit"
          description="--> run the antunit tests">
    <condition property="antunit.includes" value="${antunit.testcase}"
               else="**/test.xml,**/*-test.xml">
      <isset property="antunit.testcase"/>
    </condition>

    <property name="antunit.excludes" value=""/>

    <mkdir dir="${antunit.xml}"/>
    <au:antunit xmlns:au="antlib:org.apache.ant.antunit"
                failonerror="false" errorproperty="antunit.failed">
      <fileset dir="${src.antunit}" includes="${antunit.includes}"
               excludes="${antunit.excludes}"/>
      <au:plainlistener logLevel="${antunit.loglevel}"/>
      <au:xmllistener todir="${antunit.xml}"/>
      <propertyset>
        <propertyref name="antunit.tmpdir"/>
        <propertyref name="ant.home"/>
        <propertyref name="jenkins"/>
      </propertyset>
    </au:antunit>
  </target>

  <target name="antunit-report" depends="antunit-tests,antunit-report-only"/>

  <target name="antunit-report-only" depends="test-init" if="run.antunit.report">
    <length>
      <fileset dir="${antunit.xml}" includes="TEST-*.xml"/>
    </length>
    <mkdir dir="${antunit.reports}"/>
    <junitreport todir="${antunit.reports}">
      <fileset dir="${antunit.xml}" includes="TEST-*.xml"/>
      <report styledir="${src.antunit}" format="frames"
              todir="${antunit.reports}"/>
    </junitreport>
    <length>
      <fileset dir="${antunit.xml}" includes="TEST-*.xml"/>
    </length>
  </target>

  <!-- JetBrains builds need this target -->
  <target name="printFailingTests" depends="print-failing-tests"/>

  <target name="print-failing-tests">
    <property name="failingtests.dir" value="${build.dir}/errors"/>
    <mkdir dir=""/>
    <xslt style="${etc.dir}/printFailingTests.xsl"
          destdir="${failingtests.dir}" extension=".txt"
          basedir="${build.dir}" includes="testcases/**/TEST-*.xml,antunit/xml/TEST-*.xml"/>
    <echo>+-------------------------------------------------------------------------------------</echo>
    <echo>| FAILING TESTS:</echo>
    <echo>+-------------------------------------------------------------------------------------</echo>
    <concat>
      <!-- generated message files if they arent empty -->
      <fileset dir="${failingtests.dir}">
        <size value="0" when="more"/>
      </fileset>
      <!-- 'skip' empty lines -->
      <filterchain>
        <linecontains>
          <contains value="|"/>
        </linecontains>
      </filterchain>
    </concat>
    <echo>+-------------------------------------------------------------------------------------</echo>
  </target>

  <!--
       ===================================================================
         Main target - runs dist-lite by default
       ===================================================================
  -->
  <target name="main" depends="dist-lite"
          description="--> creates a minimum distribution in ./dist"/>

  <!--
       ===================================================================
         MSI target - creates an MSI installer file with the help of
                      the WiX toolset and the dotnet Antlib.
       ===================================================================
  -->
  <target name="msi" depends="dist-internal" xmlns:dn="antlib:org.apache.ant.dotnet"
          description="--> creates an MSI file for Ant, requires WiX and the dotnet Antlib">

    <property name="msi.dir" value="${build.dir}"/>
    <property name="msi.name" value="${name}-${project.version}.msi"/>
    <property name="msi.file" value="${msi.dir}/${msi.name}"/>
    <property name="wix.home" value="${user.home}/wix"/>
    <property name="wixobj.dir" value="${build.dir}/wix"/>

    <property name="dist.dir.resolved" location="${dist.dir}"/>

    <mkdir dir="${wixobj.dir}"/>

    <dn:wix target="${msi.file}"
            mode="both" wixHome="${wix.home}" wixobjDestDir="${wixobj.dir}">
      <sources dir="${etc.dir}" includes="*.wxs"/>
      <moresources dir="${dist.dir}"/>

      <candleParameter name="dist.dir" value="${dist.dir.resolved}"/>
      <candleParameter name="version" value="${manifest-version}"/>
    </dn:wix>
  </target>

  <!--
       ===================================================================
         CycloneDX targets - create SBOMs
       ===================================================================
  -->
  <target name="-init-cyclonedx"
          depends="check-optional-packages"
          xmlns:cdx="antlib:org.apache.ant.cyclonedx"
          if="cyclonedx.antlib.present">
    <typedef uri="antlib:org.apache.ant.cyclonedx"
      resource="org/apache/ant/cyclonedx/antlib.xml">
      <classpath refid="classpath"/>
    </typedef>

    <cdx:organization
        name="Apache Ant Project Management Committee"
        id="ant-pmc">
      <url url="https://ant.apache.org/"/>
    </cdx:organization>
    <cdx:license
        licenseId="Apache-2.0"
        id="apache-2">
      <url url="https://www.apache.org/licenses/LICENSE-2.0.txt"/>
    </cdx:license>
    <cdx:externalreferenceset id="ant-common-refs">
      <externalReference
          type="VCS"
          url="https://gitbox.apache.org/repos/asf/ant.git"/>
      <externalReference
          type="ISSUE_TRACKER"
          url="https://bz.apache.org/bugzilla/buglist.cgi?product=Ant"/>
      <externalReference
          type="WEBSITE"
          url="https://ant.apache.org/"/>
      <externalReference
          type="ADVISORIES"
          url="https://ant.apache.org/security.html#Apache%20Ant%20Security%20Vulnerabilities"/>
      <externalReference
          type="MAILING_LIST"
          url="https://ant.apache.org/mail.html"/>
      <externalReference
          type="DOCUMENTATION"
          url="https://ant.apache.org/manual/"/>
      <externalReference
          type="SOURCE_DISTRIBUTION"
          url="https://ant.apache.org/srcdownload.cgi"/>
      <externalReference
          type="DISTRIBUTION"
          url="https://ant.apache.org/bindownload.cgi"/>
      <externalReference
          type="LICENSE"
          url="https://www.apache.org/licenses/LICENSE-2.0.txt"/>
      <externalReference
          type="RELEASE_NOTES"
          url="https://github.com/apache/ant/blob/master/WHATSNEW"/>
      <externalReference
          type="SECURITY_CONTACT"
          url="https://www.apache.org/security/"/>
      <externalReference
          type="rfc-9116"
          url="https://ant.apache.org/.well-known/security.txt"/>
    </cdx:externalreferenceset>
  </target>

  <target name="component-boms"
          depends="-init-cyclonedx,jars,test-jar"
          xmlns:cdx="antlib:org.apache.ant.cyclonedx"
          if="cyclonedx.antlib.present">

    <property file="${lib.dir}/libraries.properties"/>

    <macrodef name="ant-componentbom">
      <attribute name="suffix"/>
      <attribute name="description"/>
      <element name="deps" optional="true"/>
      <element name="additionalBomContent" optional="true"/>
      <sequential>
        <cdx:componentbom
            bomName="${name}@{suffix}.cdx"
            outputdirectory="${build.lib}"
            format="all"
            useComponentSupplier="true"
            useComponentManufacturer="true">
          <component
              id="cdx-ant@{suffix}"
              name="ant@{suffix}"
              group="org.apache.ant"
              version="${pom.version}"
              description="@{description}"
              publisher="The Apache Software Foundation"
              supplierIsManufacturer="true">
            <file file="${build.lib}/${name}@{suffix}.jar"/>
            <supplier refid="ant-pmc"/>
            <license refid="apache-2"/>
            <externalReferenceSet refid="ant-common-refs"/>
            <deps/>
          </component>
          <license refid="apache-2"/>
          <additionalBomContent/>
        </cdx:componentbom>
      </sequential>
    </macrodef>
    <ant-componentbom
        suffix="-launcher"
        description="Apache Ant Launcher"/>
    <ant-componentbom
        suffix=""
        description="Apache Ant Core">
      <deps>
        <dependency componentRef="cdx-ant-launcher"/>
      </deps>
      <additionalBomContent>
        <additionalComponent refid="cdx-ant-launcher"/>
      </additionalBomContent>
    </ant-componentbom>

    <macrodef name="optional-sbom">
      <attribute name="dep"/>
      <attribute name="nameSuffix"/>
      <element name="additionalContent" implicit="true" optional="true"/>
      <sequential>
        <ant-componentbom
            suffix="-@{dep}"
            description="Apache Ant @{nameSuffix}"
            if:set="@{dep}.present" xmlns:if="ant:if">
          <deps>
            <dependency componentRef="cdx-ant"/>
            <dependency componentRef="cdx-@{dep}"/>
          </deps>
          <additionalBomContent>
            <additionalComponent refid="cdx-ant"/>
            <additionalComponent refid="cdx-ant-launcher"/>
            <additionalComponent refid="cdx-@{dep}"/>
            <additionalContent/>
          </additionalBomContent>
        </ant-componentbom>
      </sequential>
    </macrodef>

    <cdx:component
        id="cdx-apache-resolver"
        name="xml-resolver"
        group="xml-resolver"
        version="${xml-resolver.version}"
        description="xml-commons provides an Apache-hosted set of DOM, SAX, and JAXP interfaces for use in other xml-based projects. Our hope is that we can standardize on both a common version and packaging scheme for these critical XML standards interfaces to make the lives of both our developers and users easier."
        publisher="The Apache Software Foundation">
      <license refid="apache-2"/>
      <externalReference
          type="WEBSITE"
          url="http://xml.apache.org/commons/components/resolver/"/>
    </cdx:component>
    <optional-sbom dep="apache-resolver" nameSuffix="+ Apache Resolver"/>

    <cdx:component
        id="cdx-junit"
        name="junit"
        group="junit"
        version="${junit.version}"
        description="JUnit is a unit testing framework for Java, created by Erich Gamma and Kent Beck."
        publisher="JUnit">
      <license licenseId="EPL-1.0">
        <url url="http://www.eclipse.org/legal/epl-v10.html"/>
      </license>
      <externalReference
          type="WEBSITE"
          url="http://junit.org"/>
      <dependency componentRef="cdx-hamcrest"/>
    </cdx:component>
    <cdx:component
        id="cdx-hamcrest"
        name="hamcrest"
        group="org.hamcrest"
        version="${hamcrest.version}"
        description="Core API and libraries of hamcrest matcher framework.">
      <license licenseId="BSD-3-Clause">
        <url url="https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE"/>
      </license>
      <externalReference
          type="WEBSITE"
          url="http://hamcrest.org/JavaHamcrest/"/>
    </cdx:component>
    <optional-sbom dep="junit" nameSuffix="+ JUnit">
      <additionalComponent refid="cdx-hamcrest"/>
    </optional-sbom>

    <cdx:component
        id="cdx-junit4"
        refid="cdx-junit"/>
    <optional-sbom dep="junit4" nameSuffix="+ JUnit 4">
      <additionalComponent refid="cdx-hamcrest"/>
    </optional-sbom>

    <cdx:component
        id="cdx-junitlauncher"
        name="junit-platform-launcher"
        group="org.junit.platform"
        version="${junit-platform-launcher.version}"
        description='Module "junit-platform-launcher" of JUnit 5.'
        unknownDependencies="true">
      <license licenseId="EPL-2.0">
        <url url="https://www.eclipse.org/legal/epl-v20.html"/>
      </license>
      <externalReference
          type="WEBSITE"
          url="https://junit.org/junit5"/>
    </cdx:component>
    <optional-sbom dep="junitlauncher" nameSuffix="+ JUnit 5"/>

    <cdx:component
        id="cdx-apache-regexp"
        name="jakarta-regexp"
        group="jakarta-regexp"
        version="${jakarta-regexp.version}"
        unknownDependencies="true">
      <license refid="apache-2"/>
    </cdx:component>
    <optional-sbom dep="apache-regexp" nameSuffix="+ Apache Regexp"/>

    <cdx:component
        id="cdx-apache-oro"
        name="oro"
        group="oro"
        version="${oro.version}"
        unknownDependencies="true">
      <license refid="apache-2"/>
    </cdx:component>
    <optional-sbom dep="apache-oro" nameSuffix="+ Apache Oro"/>

    <cdx:component id="cdx-apache-bcel">
      <sbomLink>
        <url
            url="https://repo1.maven.org/maven2/org/apache/bcel/bcel/${bcel.version}/bcel-${bcel.version}-cyclonedx.json"/>
      </sbomLink>
    </cdx:component>
    <optional-sbom dep="apache-bcel" nameSuffix="+ BCEL"/>

    <cdx:component
        id="cdx-apache-log4j"
        name="log4j"
        group="log4j"
        version="${log4j.version}">
      <license refid="apache-2"/>
    </cdx:component>
    <optional-sbom dep="apache-log4j" nameSuffix="+ Log4J 1.x"/>

    <cdx:component
        id="cdx-commons-logging"
        name="commons-logging-api"
        group="commons-logging"
        version="${commons-logging-api.version}"
        description="Commons Logging is a thin adapter allowing configurable bridging to other, well known logging systems.">
      <license refid="apache-2"/>
    </cdx:component>
    <optional-sbom dep="commons-logging" nameSuffix="+ Commons Logging"/>

    <cdx:component
        id="cdx-apache-bsf"
        name="bsf"
        group="bsf"
        version="${bsf.version}"
        unknownDependencies="true">
      <license refid="apache-2"/>
    </cdx:component>
    <optional-sbom dep="apache-bsf" nameSuffix="+ BSF"/>

    <cdx:component
        id="cdx-javamail"
        name="javax.mail"
        group="com.sun.mail"
        version="${javax.mail.version}"
        unknownDependencies="true"/>
    <optional-sbom dep="javamail" nameSuffix="+ JavaMail"/>

    <cdx:component
        id="cdx-jakartamail"
        name="jakarta.mail"
        group="com.sun.mail"
        version="${jakarta.mail.version}"
        unknownDependencies="true"/>
    <optional-sbom dep="jakartamail" nameSuffix="+ JakartaMail"/>

    <cdx:component
        id="cdx-netrexx"
        bomRef="https://www.netrexx.org/files/NetRexxC-${netrexx.version}.jar"
        name="netrexx"
        version="${netrexx.version}"
        unknownDependencies="true">
      <license licenseId="ICU">
        <url url="https://github.com/RexxLA/NetRexx/blob/master/LICENSE"/>
      </license>
      <externalReference
          type="WEBSITE"
          url="https://www.netrexx.org/"/>
      <externalReference
          type="DISTRIBUTION"
          url="https://www.netrexx.org/downloads.nsp"/>
    </cdx:component>
    <optional-sbom dep="netrexx" nameSuffix="+ NetRexx"/>

    <cdx:component id="cdx-commons-net">
      <sbomLink>
        <url
            url="https://repo1.maven.org/maven2/commons-net/commons-net/${commons-net.version}/commons-net-${commons-net.version}-cyclonedx.json"/>
      </sbomLink>
    </cdx:component>
    <optional-sbom dep="commons-net" nameSuffix="+ Commons Net"/>

    <cdx:component
        id="cdx-antlr"
        name="antlr"
        group="antlr"
        version="${antlr.version}"
        description="A framework for constructing recognizers, compilers, and translators from grammatical descriptions containing Java, C#, C++, or Python actions.">
      <license name="BSD License">
        <url url="http://www.antlr.org/license.html"/>
      </license>
      <externalReference
          type="WEBSITE"
          url="http://www.antlr.org/"/>
    </cdx:component>
    <optional-sbom dep="antlr" nameSuffix="+ ANTLR"/>

    <ant-componentbom
        suffix="-imageio"
        description="Apache Ant + ImageIO"
        if:set="imageio.present" xmlns:if="ant:if">
      <deps>
        <dependency componentRef="cdx-ant"/>
      </deps>
      <additionalBomContent>
        <additionalComponent refid="cdx-ant"/>
        <additionalComponent refid="cdx-ant-launcher"/>
      </additionalBomContent>
    </ant-componentbom>

    <ant-componentbom
        suffix="-jmf"
        description="Apache Ant + JMF"
        if:set="jmf.present" xmlns:if="ant:if">
      <deps>
        <dependency componentRef="cdx-ant"/>
      </deps>
      <additionalBomContent>
        <additionalComponent refid="cdx-ant"/>
        <additionalComponent refid="cdx-ant-launcher"/>
      </additionalBomContent>
    </ant-componentbom>

    <cdx:component
        id="cdx-jai"
        name="jai-core"
        group="javax.media"
        description="The Java Advanced Imaging API extends the Java 2 platform by allowing sophisticated, high-performance image processing to be incorporated into Java applets and applications. It is a set of classes providing imaging functionality beyond that of Java 2D and the Java Foundation classes, though it is designed for compatibility with those APIs. This API implements a set of core image processing capabilities including image tiling, regions of interest, deferred execution and a set of core image processing operators, including many common point, area, and frequency domain operators."
        version="${jai-core.version}"
        unknownDependencies="true">
      <license name="Sun Microsystems, Inc. Binary Code License Agreement"/>
    </cdx:component>
    <optional-sbom dep="jai" nameSuffix="+ JAI"/>

    <ant-componentbom
        suffix="-swing"
        description="Apache Ant + Swing"
        if:set="jmf.present" xmlns:if="ant:if">
      <deps>
        <dependency componentRef="cdx-ant"/>
      </deps>
      <additionalBomContent>
        <additionalComponent refid="cdx-ant"/>
        <additionalComponent refid="cdx-ant-launcher"/>
      </additionalBomContent>
    </ant-componentbom>

    <cdx:component
        id="cdx-jsch"
        name="jsch"
        group="com.jcraft"
        description="JSch is a pure Java implementation of SSH2"
        version="${jsch.version}">
      <externalReference
          type="WEBSITE"
          url="http://www.jcraft.com/"/>
      <license name="Revised BSD">
        <url url="http://www.jcraft.com/jsch/LICENSE.txt"/>
      </license>
    </cdx:component>
    <optional-sbom dep="jsch" nameSuffix="+ JSch"/>

    <cdx:component
        id="cdx-jdepend"
        name="jdepend"
        group="jdepend"
        version="${jdepend.version}"
        unknownDependencies="true"/>
    <optional-sbom dep="jdepend" nameSuffix="+ JDepend"/>

    <cdx:component
        id="cdx-apache-xalan2"
        name="xalan"
        group="xalan"
        version="${xalan.version}">
      <license refid="apache-2"/>
    </cdx:component>
    <optional-sbom dep="apache-xalan2" nameSuffix="+ Xalan 2"/>

    <cdx:component
        id="cdx-xz"
        name="xz"
        group="org.tukaani"
        version="${xz.version}"
        description="XZ data compression">
      <externalReference
          type="WEBSITE"
          url="https://tukaani.org/xz/java.html"/>
      <license name="Public Domain"/>
    </cdx:component>
    <optional-sbom dep="xz" nameSuffix="+ XZ for Java"/>

    <ant-componentbom
        suffix="-testutil"
        description="Apache Ant Test Utilities"
        if:set="junit4.present" xmlns:if="ant:if">
      <deps>
        <dependency componentRef="cdx-ant"/>
        <dependency componentRef="cdx-junit"/>
      </deps>
      <additionalBomContent>
        <additionalComponent refid="cdx-ant"/>
        <additionalComponent refid="cdx-ant-launcher"/>
        <additionalComponent refid="cdx-junit"/>
        <additionalComponent refid="cdx-hamcrest"/>
      </additionalBomContent>
    </ant-componentbom>
  </target>

  <target name="-prepare-distribution-bom"
          depends="-init-cyclonedx"
          xmlns:cdx="antlib:org.apache.ant.cyclonedx"
          if="cyclonedx.antlib.present">
    <macrodef name="ant-distributionbom">
      <attribute name="distdir"/>
      <attribute name="subdir"/>
      <attribute name="kind"/>
      <attribute name="descriptionsuffix"/>
      <attribute name="ext"/>
      <attribute name="componentType"/>
      <element name="archiveContent"/>
      <element name="moreComponentChildren" optional="true"/>
      <sequential>
        <cdx:componentbom
            bomName="${dist.name}-@{kind}.@{ext}.cdx"
            outputdirectory="@{distdir}"
            format="all"
            useComponentSupplier="true"
            useComponentManufacturer="true">
          <component
              name="https://archive.apache.org/dist/ant/@{subdir}/${dist.name}-@{kind}.@{ext}"
              purl="https://archive.apache.org/dist/ant/@{subdir}/${dist.name}-@{kind}.@{ext}"
              version="${pom.version}"
              type="@{componentType}"
              description="Apache Ant @{descriptionsuffix}"
              publisher="The Apache Software Foundation"
              supplierIsManufacturer="true">
            <file file="@{distdir}/${dist.name}-@{kind}.@{ext}"/>
            <supplier refid="ant-pmc"/>
            <license refid="apache-2"/>
            <externalReferenceSet refid="ant-common-refs"/>
            <moreComponentChildren/>
          </component>
          <license refid="apache-2"/>
          <pureFileComponents>
            <archiveContent/>
          </pureFileComponents>
        </cdx:componentbom>
      </sequential>
    </macrodef>
    <macrodef name="create-tarball-boms">
      <attribute name="distdir"/>
      <attribute name="subdir"/>
      <attribute name="kind"/>
      <attribute name="descriptionsuffix"/>
      <attribute name="componentType" default="file"/>
      <element name="componentChildren" optional="true"/>
      <element name="archiveContents"/>
      <sequential>
        <ant-distributionbom
            distdir="@{distdir}"
            subdir="@{subdir}"
            kind="@{kind}"
            descriptionsuffix="@{descriptionsuffix}"
            ext="zip"
            componentType="@{componentType}">
          <moreComponentChildren>
            <componentChildren/>
          </moreComponentChildren>
          <archiveContent>
            <archiveContents/>
          </archiveContent>
        </ant-distributionbom>
        <ant-distributionbom
            distdir="@{distdir}"
            subdir="@{subdir}"
            kind="@{kind}"
            descriptionsuffix="@{descriptionsuffix}"
            ext="tar.gz"
            componentType="@{componentType}">
          <moreComponentChildren>
            <componentChildren/>
          </moreComponentChildren>
          <archiveContent>
            <archiveContents/>
          </archiveContent>
        </ant-distributionbom>
        <ant-distributionbom
            distdir="@{distdir}"
            subdir="@{subdir}"
            kind="@{kind}"
            descriptionsuffix="@{descriptionsuffix}"
            ext="tar.bz2"
            componentType="@{componentType}">
          <moreComponentChildren>
            <componentChildren/>
          </moreComponentChildren>
          <archiveContent>
            <archiveContents/>
          </archiveContent>
        </ant-distributionbom>
        <ant-distributionbom
            distdir="@{distdir}"
            subdir="@{subdir}"
            kind="@{kind}"
            descriptionsuffix="@{descriptionsuffix}"
            ext="tar.xz"
            componentType="@{componentType}">
          <moreComponentChildren>
            <componentChildren/>
          </moreComponentChildren>
          <archiveContent>
            <archiveContents/>
          </archiveContent>
        </ant-distributionbom>
      </sequential>
    </macrodef>
  </target>

  <target name="-tar-distribution-sboms"
          depends="-prepare-distribution-bom,component-boms,zip-distribution,tar-distribution"
          xmlns:cdx="antlib:org.apache.ant.cyclonedx"
          if="cyclonedx.antlib.present">
    <create-tarball-boms
        distdir="${dist.base.binaries}"
        subdir="binaries"
        kind="bin"
        componentType="application"
        descriptionsuffix="Binary Distribution">
      <componentChildren>
        <component>
          <sbomLink>
            <file file="${build.lib}/ant-launcher.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-launcher.jar"/>
        </component>
        <dependency componentRef="cdx-ant-launcher"/>
        <component>
          <sbomLink>
            <file file="${build.lib}/ant.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant.jar"/>
        </component>
        <dependency componentRef="cdx-ant"/>
        <component scope="optional" if:set="antlr.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-antlr.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-antlr.jar"/>
        </component>
        <dependency componentRef="cdx-ant-antlr"
                    if:set="antlr.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="apache-bcel.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-apache-bcel.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-apache-bcel.jar"/>
        </component>
        <dependency componentRef="cdx-ant-apache-bcel"
                    if:set="apache-bcel.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="apache-bcel.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-apache-bsf.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-apache-bsf.jar"/>
        </component>
        <dependency componentRef="cdx-ant-apache-bsf"
                    if:set="apache-bcel.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="apache-log4j.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-apache-log4j.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-apache-log4j.jar"/>
        </component>
        <dependency componentRef="cdx-ant-apache-log4j"
                    if:set="apache-log4j.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="apache-oro.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-apache-oro.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-apache-oro.jar"/>
        </component>
        <dependency componentRef="cdx-ant-apache-oro"
                    if:set="apache-oro.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="apache-regexp.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-apache-regexp.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-apache-regexp.jar"/>
        </component>
        <dependency componentRef="cdx-ant-apache-regexp"
                    if:set="apache-regexp.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="apache-resolver.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-apache-resolver.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-apache-resolver.jar"/>
        </component>
        <dependency componentRef="cdx-ant-apache-resolver"
                    if:set="apache-resolver.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="apache-xalan2.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-apache-xalan2.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-apache-xalan2.jar"/>
        </component>
        <dependency componentRef="cdx-ant-apache-xalan2"
                    if:set="apache-xalan2.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="commons-logging.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-commons-logging.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-commons-logging.jar"/>
        </component>
        <dependency componentRef="cdx-ant-commons-logging"
                    if:set="commons-logging.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="commons-net.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-commons-net.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-commons-net.jar"/>
        </component>
        <dependency componentRef="cdx-ant-commons-net"
                    if:set="commons-net.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="imageio.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-imageio.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-imageio.jar"/>
        </component>
        <dependency componentRef="cdx-ant-imageio"
                    if:set="imageio.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="jai.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-jai.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-jai.jar"/>
        </component>
        <dependency componentRef="cdx-ant-jai"
                    if:set="jai.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="jakartamail.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-jakartamail.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-jakartamail.jar"/>
        </component>
        <dependency componentRef="cdx-ant-jakartamail"
                    if:set="jakartamail.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="javamail.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-javamail.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-javamail.jar"/>
        </component>
        <dependency componentRef="cdx-ant-javamail"
                    if:set="javamail.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="jdepend.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-jdepend.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-jdepend.jar"/>
        </component>
        <dependency componentRef="cdx-ant-jdepend"
                    if:set="jdepend.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="jmf.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-jmf.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-jmf.jar"/>
        </component>
        <dependency componentRef="cdx-ant-jmf"
                    if:set="jmf.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="jsch.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-jsch.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-jsch.jar"/>
        </component>
        <dependency componentRef="cdx-ant-jsch"
                    if:set="jsch.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="junit4.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-junit4.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-junit4.jar"/>
        </component>
        <dependency componentRef="cdx-ant-junit4"
                    if:set="junit4.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="junit.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-junit.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-junit.jar"/>
        </component>
        <dependency componentRef="cdx-ant-junit"
                    if:set="junit.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="junitlauncher.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-junitlauncher.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-junitlauncher.jar"/>
        </component>
        <dependency componentRef="cdx-ant-junitlauncher"
                    if:set="junitlauncher.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="netrexx.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-netrexx.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-netrexx.jar"/>
        </component>
        <dependency componentRef="cdx-ant-netrexx"
                    if:set="netrexx.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="swing.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-swing.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-swing.jar"/>
        </component>
        <dependency componentRef="cdx-ant-swing"
                    if:set="swing.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="xz.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-xz.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-xz.jar"/>
        </component>
        <dependency componentRef="cdx-ant-xz"
                    if:set="xz.present" xmlns:if="ant:if"/>
        <component scope="optional" if:set="junit4.present" xmlns:if="ant:if">
          <sbomLink>
            <file file="${build.lib}/ant-testutil.cdx.json"/>
          </sbomLink>
          <file file="${build.lib}/ant-testutil.jar"/>
        </component>
      </componentChildren>
      <archiveContents>
        <fileset dir="${dist.name}/.."
                 includes="${dist.name}/"
                 defaultexcludes="no"/>
      </archiveContents>
    </create-tarball-boms>
  </target>

  <target name="distribution-sboms"
          depends="-prepare-distribution-bom,main-distribution"
          if="cyclonedx.antlib.present">
    <property name="manual-zip-content" value="${build.dir}/manual-zip-content"/>
    <mkdir dir="${manual-zip-content}"/>
    <unzip dest="${manual-zip-content}" src="${dist.base.manual}/${dist.name}-manual.zip"/>
    <create-tarball-boms
        distdir="${dist.base.manual}"
        subdir="manual"
        kind="manual"
        descriptionsuffix="Manual">
      <archiveContents>
        <fileset dir="${manual-zip-content}" defaultexcludes="no"/>
      </archiveContents>
    </create-tarball-boms>
    <delete dir="${manual-zip-content}"/>

    <property name="src-zip-content" value="${build.dir}/src-zip-content"/>
    <mkdir dir="${src-zip-content}"/>
    <unzip dest="${src-zip-content}" src="${dist.base.source}/${dist.name}-src.zip"/>
    <create-tarball-boms
        distdir="${dist.base.source}"
        subdir="source"
        kind="src"
        descriptionsuffix="Source Distribution">
      <archiveContents>
        <fileset dir="${src-zip-content}" defaultexcludes="no"/>
      </archiveContents>
    </create-tarball-boms>
    <delete dir="${src-zip-content}"/>

    <checksums>
      <fileset dir="${dist.base.binaries}/">
        <exclude name="**/*.asc"/>
        <exclude name="**/*.sha512"/>
      </fileset>
      <fileset dir="${dist.base.source}/">
        <exclude name="**/*.asc"/>
        <exclude name="**/*.sha512"/>
      </fileset>
    </checksums>
  </target>
</project>
