# 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.                                           *

##
## Core Dependencies .. these must be set
##

javacc.home=${env.TOOLS_DIR}/javacc/4.0
junit.lib=${env.TOOLS_DIR}/junit/4.3.1
velocity.lib=${env.TOOLS_DIR}/velocity/1.5

##
## Optional Dependencies
##

## NSIS
nsis.home=${env.NSIS_HOME}

## Clover
clover.home=${env.CLOVER_HOME}

## Csharp support
ant-dotnet.lib=${env.TOOLS_DIR}/apache-ant-dotnet/1.0
nunit.home=${env.NUNIT_HOME}

# Set to the .NET 2.0 framework install
dotnet.home=${env.windir}/Microsoft.NET/Framework/v2.0.50727

# MONO support still a bit flakey
mono.home=${env.MONO_HOME}

