<?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="launch-build" default="launch">

    <description>
        Build file be able to launch the boostrap build of Ant on every supported platform
    </description>
    
    <property name="default-args" value="allclean test -Dignore.tests.failed=true -Doptional.jars.whenmanifestonly=skip" />
    <condition property="args" value="${default-args} -Djenkins=t">
      <isset property="jenkins"/>
    </condition>
    <property name="args" value="${default-args}" />

    <condition property="launch.cmd" value="${basedir}/build.sh">
        <os family="unix" />
    </condition>
    <condition property="launch.cmd" value="${basedir}/build.bat">
        <os family="windows" />
    </condition>

    <target name="launch">
        <fail unless="launch.cmd" message="Unsupported build platform" />
        <echo message="Launching ${launch.cmd} ${args}" />
        <exec executable="${launch.cmd}" failonerror="true">
            <arg line="${args}" />
        </exec>
    </target>
</project>
