<!--
 * 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-services" 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="smsgateway-corba" target="${target}"/>
        <ant dir="smsgateway-ejb" target="${target}"/>
        <ant dir="smsgateway-jaxws" target="${target}"/>
        <ant dir="smsgateway-jms" target="${target}"/>
        <ant dir="smsgateway-rmi" target="${target}"/>
    </target>

</project>
