<?xml version="1.0"?>
<!--
 ! 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="asterix" default="build" basedir=".">

  <target name="init">
    <condition property="isWindows">
      <os family="windows"/>
    </condition>
    <condition property="isUnix">
      <os family="unix"/>
    </condition>
  </target>

  <target name="win" depends="init" if="isWindows">
    <property name="os.family" value="windows"/>
    <property name="source.ext" value=".cmd"/>
    <property name="target.ext" value=".cmd"/>
  </target>

  <target name="unix" depends="init" if="isUnix">
    <property name="os.family" value="unix"/>
    <property name="source.ext" value=".sh"/>
    <property name="target.ext" value=""/>
  </target>

  <target name="build" depends="win,unix">
    <mkdir dir="${target.dir}"/>
    <pathconvert targetos="${os.family}" property="classpath">
      <path>
        <pathelement path="${script.classpath}"/>
      </path>
    </pathconvert>
    <copy file="${source}${source.ext}" tofile="${target.dir}/${target}${target.ext}">
      <filterset>
        <filter token="main.class" value="${main.class}"/>
        <filter token="classpath" value="${classpath}"/>
        <filter token="jvm.params" value="${jvm.params}"/>
        <filter token="program.params" value="${program.params}"/>
      </filterset>
    </copy>
    <chmod perm="ugo+x">
      <fileset dir="${target.dir}"/>
    </chmod>
  </target>

</project>
