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

# ANother Tool for Language Recognition v2.7.5. generics parser dependency
antlr=${depends.jars}/antlr-2.7.5/antlr-2.7.5.jar
antlr.url=http://issues.apache.org/jira/secure/attachment/12358381/antlr-2.7.5.jar
antlr.md5=6d57df718efd2a03981c309ce3330a1f

# org.vmmagic unboxed package. Used to enable address arithmetic in Java
vmmagic=${depends.jars}/vmmagic/vmmagic-20070207.jar
vmmagic.url=http://cs.anu.edu.au/people/Robin.Garner/vmmagic-20070207.jar
vmmagic.md5=c20a2e1b4b54a4fa4cc03a1fbb21c83a

# Apache Portable Runtime, version 1.1 or above
# http://apr.apache.org/download.cgi
apr.src.tgz=${depends.oss}/apr/apr-1.2.12.tar.gz
apr.src.rootdir=apr-1.2.12
apr.src.tgz.url=http://archive.apache.org/dist/apr/apr-1.2.12.tar.gz
apr.src.tgz.md5=020ea947446dca2d1210c099c7a4c837

# ZLIB, version 1.2.1 or above
# http://www.zlib.net/
zlib.dir=${base.dep.dir}/libs/${hy.platform.variant}/zlib-123
zlib=${zlib.dir}/zlib.zip
zlib.url@x86@=http://www.zlib.net/zlib123-dll.zip
zlib.md5@x86@=cc7fa97f9c19386bb701acc79d0abbca
zlib.url@x86_64@=http://issues.apache.org/jira/secure/attachment/12351498/zlib-x86_64-dll.zip
zlib.md5@x86_64@=7397278304667d4e68e9af073da45d98


# Ant-contrib, version 0.6 or above
# http://sourceforge.net/project/showfiles.php?group_id=36177
ant-contrib=${depends.jars}/ant-contrib-1.0b2/ant-contrib.zip
ant-contrib.jar=${depends.jars}/ant-contrib-1.0b2/ant-contrib.jar
ant-contrib.unzip.path=ant-contrib/lib/ant-contrib.jar
ant-contrib.url=http://superb-west.dl.sourceforge.net/sourceforge/ant-contrib/ant-contrib-1.0b2-bin.zip
ant-contrib.md5=576eafb2aca3e87c26d6d274047de482

# JASMIN for regression test framework
jasmin=${depends.jars}/jasmin-1.1/jasmin-1.1.zip
jasmin.jar=${depends.jars}/jasmin-1.1/jasmin.jar
jasmin.unzip.path=jasmin-1.1/jasmin.jar
jasmin.url=http://internap.dl.sourceforge.net/sourceforge/jasmin/jasmin-1.1.zip
jasmin.md5=bb96616023ab4efdffa173601004fa17
