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

# Current versions
waveinabox.version=0.4-incubating

# Names
name=wave-in-a-box
release.binname=apache-wave-bin
release.srcname=apache-wave-src

#Release file paths
release.bin.path=${release.binname}-${waveinabox.version}
release.src.path=${release.srcname}-${waveinabox.version}

# Build file paths
build.classpath.path=${basedir}/build-classpath.xml
build.common.path=${basedir}/build-common.xml
build.macros.path=${basedir}/build-macros.xml
build.sysclasspath=ignore

# Source code dirs
src.dir=${basedir}/src
src.proto.dir=${basedir}/proto_src
test.dir=${basedir}/test

# Generated code (GXP and PST DTOs).
gen.dir=${basedir}/gen

# These libs are needed at runtime
lib.dir=${basedir}/third_party

# Libs meant for test and runtime respectively
lib.test=${lib.dir}/test
lib.runtime=${lib.dir}/runtime
lib.codegen=${lib.dir}/codegen

# Intermediary build directories (temporary)
build.dir=${basedir}/build
build.messages.dir=${build.dir}/messages
build.proto.dir=${build.dir}/proto
build.src.dir=${build.dir}/src
build.test.dir=${build.dir}/test
build.log.dir=${build.dir}/logs
coverage.dir=${build.dir}/coverage
staging.dir=${build.dir}/staging
# Incremental task markers
dep=${build.dir}/dep

# These are final output directories
dist.dir=${basedir}/dist
dist.libraries.dir=${basedir}/dist/libraries
test.out.dir=${basedir}/test_out
docs.dir=${basedir}/doc
api.jar.out=${dist.dir}/${name}-api-${waveinabox.version}.jar
server.jar.out=${dist.dir}/${name}-server-${waveinabox.version}.jar
consoleclient.jar.out=${dist.dir}/${name}-client-console-${waveinabox.version}.jar
robotclient.jar.out=${dist.dir}/${name}-wave-api-${waveinabox.version}.jar
export-import.jar.out=${dist.dir}/${name}-export-import-${waveinabox.version}.jar

missing.dependencies.test=You need to execute the get-third-party target to download dependencies required for tests compilation, i.e. ant get-third-party.
