<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
-->
<project name="CLI" >
    <property name="build.script" location="${basedir}/release/build.sh"/>

      <target name="all" >
        <exec executable="${build.script}" failonerror="true">
            <arg value="-A"/>
            <arg value="-t"/>
            <arg value="-d"/>
            <arg value="${project.build.directory}"/>
            <arg value="-s"/>
            <arg value="${basedir}"/>
        </exec>
    </target>

    <target name="cross" >
        <exec executable="${build.script}" failonerror="true">
            <arg value="-t"/>
            <arg value="-a"/>
            <arg value="${arch}"/>
            <arg value="-o"/>
            <arg value="${os}"/>
            <arg value="-d"/>
            <arg value="${project.build.directory}"/>
            <arg value="-s"/>
            <arg value="${basedir}"/>
        </exec>
    </target>

    <target name="native" >
        <exec executable="${build.script}" failonerror="true">
            <arg value="-d"/>
            <arg value="${project.build.directory}"/>
            <arg value="-s"/>
            <arg value="${basedir}"/>
        </exec>
    </target>

</project>
