blob: f320111606059150864e74cf2b9350154727847d [file] [log] [blame]
# 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.
#
module Buildr::Groovy
REQUIRES = ArtifactNamespace.for(self) do |ns|
ns.jansi! 'org.fusesource.jansi:jansi:jar:1.2.1'
ns.jline! 'jline:jline:jar:0.9.94'
end
class << self
def dependencies #:nodoc:
REQUIRES.artifacts + Groovyc.dependencies
end
end
# Groovyc compiler:
# compile.using(:groovyc)
#
# You need to require 'buildr/groovy/compiler' if you need to use this compiler.
#
# Used by default if .groovy files are found in the src/main/groovy directory (or src/test/groovy)
# and sets the target directory to target/classes (or target/test/classes).
#
# Groovyc is a joint compiler, this means that when selected for a project, this compiler is used
# to compile both groovy and java sources. It's recommended that Groovy sources are placed in the
# src/main/groovy directory, even though this compiler also looks in src/main/java
#
# Groovyc accepts the following options:
#
# * :encoding -- Encoding of source files
# * :verbose -- Asks the compiler for verbose output, true when running in verbose mode.
# * :fork -- Whether to execute groovyc using a spawned instance of the JVM; defaults to no
# * :memoryInitialSize -- The initial size of the memory for the underlying VM, if using fork mode; ignored otherwise.
# Defaults to the standard VM memory setting. (Examples: 83886080, 81920k, or 80m)
# * :memoryMaximumSize -- The maximum size of the memory for the underlying VM, if using fork mode; ignored otherwise.
# Defaults to the standard VM memory setting. (Examples: 83886080, 81920k, or 80m)
# * :listfiles -- Indicates whether the source files to be compiled will be listed; defaults to no
# * :stacktrace -- If true each compile error message will contain a stacktrace
# * :warnings -- Issue warnings when compiling. True when running in verbose mode.
# * :debug -- Generates bytecode with debugging information. Set from the debug
# environment variable/global option.
# * :deprecation -- If true, shows deprecation messages. False by default.
# * :optimise -- Generates faster bytecode by applying optimisations to the program.
# * :source -- Source code compatibility.
# * :target -- Bytecode compatibility.
# * :javac -- Hash of options passed to the ant javac task
#
class Groovyc < Compiler::Base
# The groovyc compiler jars are added to classpath at load time,
# if you want to customize artifact versions, you must set them on the
#
# artifact_ns(Buildr::Groovy::Groovyc).groovy = '1.7.1'
#
# namespace before this file is required.
REQUIRES = ArtifactNamespace.for(self) do |ns|
ns.groovy! 'org.codehaus.groovy:groovy:jar:>=1.7.5'
ns.commons_cli! 'commons-cli:commons-cli:jar:>=1.2'
ns.asm! 'asm:asm:jar:>=3.2'
ns.antlr! 'antlr:antlr:jar:>=2.7.7'
end
ANT_TASK = 'org.codehaus.groovy.ant.Groovyc'
GROOVYC_OPTIONS = [:encoding, :verbose, :fork, :memoryInitialSize, :memoryMaximumSize, :listfiles, :stacktrace]
JAVAC_OPTIONS = [:optimise, :warnings, :debug, :deprecation, :source, :target, :javac]
OPTIONS = GROOVYC_OPTIONS + JAVAC_OPTIONS
class << self
def dependencies #:nodoc:
REQUIRES.artifacts
end
def applies_to?(project, task) #:nodoc:
paths = task.sources + [sources].flatten.map { |src| Array(project.path_to(:source, task.usage, src.to_sym)) }
paths.flatten!
# Just select if we find .groovy files
paths.any? { |path| !Dir["#{path}/**/*.groovy"].empty? }
end
end
# Groovy dependencies don't need to go into JVM's system classpath.
# In fact, if they end up there it causes trouble because Groovy has issues
# loading other classes such as test frameworks (e.g. JUnit).
#
# Java.classpath << lambda { dependencies }
specify :language => :groovy, :sources => [:groovy, :java], :source_ext => [:groovy, :java],
:target => 'classes', :target_ext => 'class', :packaging => :jar
def initialize(project, options) #:nodoc:
super
options[:debug] = Buildr.options.debug if options[:debug].nil?
options[:deprecation] ||= false
options[:optimise] ||= false
options[:verbose] ||= trace?(:groovyc) if options[:verbose].nil?
options[:warnings] = verbose if options[:warnings].nil?
options[:javac] = OpenObject.new if options[:javac].nil?
end
# http://groovy.codehaus.org/The+groovyc+Ant+Task
def compile(sources, target, dependencies) #:nodoc:
return if Buildr.application.options.dryrun
Buildr.ant 'groovyc' do |ant|
classpath = dependencies
ant.taskdef :name => 'groovyc', :classname => ANT_TASK, :classpath => classpath.join(File::PATH_SEPARATOR)
ant.groovyc groovyc_options(sources, target) do
sources.each { |src| ant.src :path => src }
ant.classpath do
classpath.each { |dep| ant.pathelement :path => dep }
end
ant.javac(javac_options)
end
end
end
private
def groovyc_options(sources, target)
check_options options, OPTIONS
groovyc_options = options.to_hash.only(*GROOVYC_OPTIONS)
groovyc_options[:destdir] = File.expand_path(target)
groovyc_options
end
def javac_options
check_options options, OPTIONS
javac_options = options.to_hash.only(*JAVAC_OPTIONS)
javac_options[:optimize] = (javac_options.delete(:optimise) || false)
javac_options[:nowarn] = (javac_options.delete(:warnings) || verbose).to_s !~ /^(true|yes|on)$/i
other = javac_options.delete(:javac) || {}
javac_options.merge!(other)
javac_options
end
end
end
# Groovy compiler comes first, ahead of Javac, this allows it to pick
# projects that mix Groovy and Java code by spotting Groovy code first.
Buildr::Compiler.compilers.unshift Buildr::Groovy::Groovyc