// -*- mode: groovy; coding: utf-8; -*-

//  Gradle build script for Groovy.
//
//  Licensed 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.
//
//  This work is copyright by the author(s) and is part of a greater work collectively copyright by Codehaus on
//  behalf of the Groovy community. See the NOTICE.txt file distributed with this work for additional information.
//
//  Author : Russel Winder <russel.winder@concertant.com>

//  Assumes Gradle 0.6 is being used.

ant.property ( file : 'build.properties' )

type = 'jar'
group = 'org.codehaus.groovy'
version = ant.antProject.properties.groovyVersion

usePlugin ( 'groovy' )

sourceCompatibility = 5
targetCompatibility = 5
groovySrcDirName = 'src/main'
groovyTestSrcDirName = 'src/test'

repositories {
  mavenCentral ( )
}

dependencies {
  groovy ( 'org.codehaus.groovy:groovy-all:1.6.3' )
  compile ( [
             //  Core dependencies.
             'antlr:antlr:2.7.7' ,
             'asm:asm:3.2' ,
             'asm:asm-util:3.2' ,
             'asm:asm-analysis:3.2' ,
             'asm:asm-tree:3.2' ,
             'junit:junit:4.6' ,
             //  Used by optional features.
             'commons-cli:commons-cli:1.2' ,
             'org.apache.ant:ant:1.7.1' ,
             'bsf:bsf:2.4.0' ,
             'javax.servlet:servlet-api:2.4' ,
             'javax.servlet:jsp-api:2.0' ,
             'com.thoughtworks.xstream:xstream:1.3.1' ,
             'jline:jline:0.9.94' ,
             'org.apache.ivy:ivy:2.1.0-rc2' ,
             ] )
  testRuntime ( [
                 'asm:asm-attrs:3.2' ,
                 'jmock:jmock:1.2.0' ,
                 'jmock:jmock-clib:1.2.0' ,
                 'xmlunit:xmlunit:1.2' ,
                 'hsqldb:hsqldb:1.8.0.7' ,
                 'org.apache.ant:ant-testutil:1.8.2' ,
                 ] )
  runtime ( [
             'org.apache.ant:ant-junit:1.7.1' ,
             'org.apache.ant:ant-launcher:1.7.1' ,
             'commons-logging:commons-logging:1.1' ,
             ] )
}

test {
  include ( '**/*Test.class' )
}
