<!--
 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 default="all" basedir=".">
    <target name="init">
        <condition property="mvn" value="mvn.bat">
            <os family="dos" />
        </condition>
        <condition property="mvn" value="mvn">
            <not>
                <isset property="mvn" />
            </not>
        </condition>
    </target>
    <target name="clean" depends="init">
        <exec executable="${mvn}" failonerror="true">
            <arg line="-Dpackaging=plugins clean" />
        </exec>
        <exec executable="${mvn}" failonerror="true">
            <arg line="-Dpackaging=bundle clean" />
        </exec>
        <exec executable="${mvn}" failonerror="true">
            <arg line="-Dpackaging=osgi-bundle clean" />
        </exec>
        <exec executable="${mvn}" failonerror="true">
            <arg line="-Dpackaging=osgi-bundle-mosgi clean" />
        </exec>
    </target>
    <target name="install" depends="init">
        <exec executable="${mvn}" failonerror="true">
            <arg line="-Dpackaging=plugins install" />
        </exec>
        <exec executable="${mvn}" failonerror="true">
            <arg line="-Dpackaging=bundle install" />
        </exec>
        <exec executable="${mvn}" failonerror="true">
            <arg line="-Dpackaging=osgi-bundle install" />
        </exec>
        <exec executable="${mvn}" failonerror="true">
            <arg line="-Dpackaging=ipojo-bundle install" />
        </exec>
        <exec executable="${mvn}" failonerror="true">
            <arg line="-Dpackaging=osgi-bundle-mosgi install" />
        </exec>
    </target>
    <target name="all" depends="init">
        <exec executable="${mvn}" failonerror="true">
            <arg line="-Dpackaging=plugins clean install" />
        </exec>
        <exec executable="${mvn}" failonerror="true">
            <arg line="-Dpackaging=bundle clean install" />
        </exec>
        <exec executable="${mvn}" failonerror="true">
            <arg line="-Dpackaging=osgi-bundle clean install" />
        </exec>
        <exec executable="${mvn}" failonerror="true">
            <arg line="-Dpackaging=ipojo-bundle clean install" />
        </exec>
        <exec executable="${mvn}" failonerror="true">
            <arg line="-Dpackaging=osgi-bundle-mosgi clean install" />
        </exec>
    </target>
</project>
