# * 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}

