#  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
#
#      https://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

