<!--
 * 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="scatours" default="compile">

    <target name="compile">
        <antcall target="allsubdirs">
            <param name="target" value="compile"/>
        </antcall>
    </target>

    <target name="test">
        <antcall target="allsubdirs">
            <param name="target" value="test"/>
        </antcall>
    </target>

    <target name="clean">
        <antcall target="allsubdirs">
            <param name="target" value="clean"/>
        </antcall>
    </target>

    <target name="allsubdirs">
        <ant dir="util" target="${target}"/> <!--needed by launchers-->
        <ant dir="contributions" target="${target}"/> <!--needed by launchers-->
        <ant dir="domainconfig" target="${target}"/> <!--needed by launchers-->
        <ant dir="services" target="${target}"/> <!--needed by launchers-->
        <ant dir="launchers" target="${target}"/> <!--needed by clients-->
        <ant dir="clients" target="${target}"/> <!--needed by binaries-->
        <ant dir="binaries" target="${target}"/>
    </target>

</project>
