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

# 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
