#  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.


# Common properties. Could be overwritten by the concrete antlib project.

# Ivy installation. Which version to use, where to store.
ivy.install.version=2.4.0
ivy.jar.dir=${basedir}/ivy
ivy.jar.file=${ivy.jar.dir}/ivy.jar


# Where to store the dependencies
lib.dir=lib
lib.dir.compile=${lib.dir}/compile
lib.dir.test=${lib.dir}/test


# properties for build and test
build=build
build.classes=${build}/classes
build.testclasses=${build}/test-classes
build.lib=${build}/lib
build.deps=${build}/deps
build.javarepository=${build}/java-repository
build.javadoc=${build}/javadoc
src.junit=src/tests/junit
src.antunit=src/tests/antunit


# javac properties
javac.-source=1.2
javac.-target=1.2
javac.debug=on


# you really need a proper version in version.properties
artifact.version=0.1-SNAPSHOT
artifact.name=ant-${ant.project.name}
artifact.stub=${artifact.name}-${artifact.version}
jarname=${build.lib}/${artifact.stub}.jar
target.jar=${jarname}


# properties for distribution target
dist.name=apache-${artifact.name}-${artifact.version}
dist.base=distribution
dist.base.source=${dist.base}/source
dist.base.binaries=${dist.base}/binaries
bin.dist.dir=dist-bin
src.dist.dir=dist-src


# junit test properties
junit.fork=true
junit.forkmode=once
# Default to the location in the Ant installation
ant-testutil.jar=${ant.home}/lib/ant-testutil.jar
report.dir=${build}/reports
antunit.report.dir=${report.dir}/antunit
junit.report.dir=${report.dir}/junit

