#
#  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.
#   
# -------------------------------------------------------------------
# B U I L D  P R O P E R T I E S
# -------------------------------------------------------------------
# Specifies default property values
# Overridden by ../default.properties and all ant.properties
# Not user-editable; use ant.properties files instead
# See also: include.properties

name=apache-jsieve
Name=jSieve Mail Filter
version=0.2-SNAPSHOT
year=2008
extension.name=org.apache.jsieve
vendor=The Apache Software Foundation
vendor.id=org.apache
creator=James Project Of The Apache Software Foundation
title.spec=Apache James JSieve
title.impl=Apache James JSieve

#
# compiler options
# (There should be no need to override default compiler but need to change
# javac task to run without this}

build.compiler = modern
jdk.source = 1.4
jdk.target = 1.4

#
# compiler switches
# (these are here only for those who use jikes compiler)
#

build.compiler.emacs = on
build.compiler.pedantic = true
build.compiler.depend = true
build.compiler.fulldepend = true

#
# standard compiler switches
#

debug = on
optimize = on
deprecation = on

#
#  location of intermediate products
#

build.dir = ${jsieve.dir}/target
build.lib = ${build.dir}/lib
build.src = ${build.dir}/src
build.classes = ${build.dir}/classes
build.classes.test = ${build.dir}/test-classes
build.javadocs = ${build.docs}/javadocs
build.docs = ${build.dir}/docs
build.conf = ${build.dir}/conf
build.javacc = ${build.dir}/javacc

#
# source properties
#

src.dir=${jsieve.dir}/src
java.dir=${src.dir}/main/java
test.dir=${src.dir}/test/java
javacc.dir=${src.dir}/main/jjtree
conf.dir=${src.dir}/main/resources
testconf.dir=${src.dir}/test/resources

#
#  distribution directories
#

dist.base = ${jsieve.dir}/dist
dist.name = ${name}-${version}
dist.dir = ${dist.base}/${dist.name}
