<!--
 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="pom">
    <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=ipojo-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>
