buildr 1.2.5 → 1.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +20 -0
- data/Rakefile +32 -4
- data/lib/buildr.rb +1 -1
- data/lib/buildr/jetty.rb +9 -3
- data/lib/buildr/jetty/JettyWrapper$BuildrHandler.class +0 -0
- data/lib/buildr/jetty/JettyWrapper.class +0 -0
- data/lib/buildr/jetty/JettyWrapper.java +3 -0
- data/lib/buildr/scala.rb +368 -0
- data/lib/core/application.rb +7 -5
- data/lib/core/build.rb +10 -2
- data/lib/core/common.rb +41 -18
- data/lib/core/rake_ext.rb +17 -0
- data/lib/java/artifact.rb +23 -0
- data/lib/java/compile.rb +3 -3
- data/lib/java/java.rb +4 -7
- data/lib/java/packaging.rb +65 -9
- data/lib/java/pom.rb +0 -2
- data/lib/java/test.rb +10 -4
- data/lib/tasks/tar.rb +59 -84
- data/lib/tasks/zip.rb +49 -36
- metadata +5 -4
data/CHANGELOG
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
1.2.6 (9/26/2007)
|
2
|
+
* Added: Option for setting environment name (-e) and attribute accessor (Buildr.environment). Default taken from BUILDR_ENV environment variable.
|
3
|
+
* Added: AAR packaging for Axis2 service archives (Alex Boisvert)
|
4
|
+
* Added: Environment variable for JUnit tests (test.using :environment=>).
|
5
|
+
* Added: tar method similar to zip method.
|
6
|
+
* Added: Experimental transitive method. Looks like artifacts, quacks like artifacts, but returns artifacts by the boat load. (Credit, Daniel Roop)
|
7
|
+
* Changed: Now accepting JAVA_OPTS in addition to JAVA_OPTIONS.
|
8
|
+
* Changed: TarTask is now based on ArchiveTask, same API as ZipTask.
|
9
|
+
* Changed: Javadoc array arguments now passed as multiple command line options (e.g. :link=>['foo', 'bar'] becomes --link foo --link bar). (Daniel Roop)
|
10
|
+
* Changed: Jetty task now uses SLF4J instead of commons-logging + log4j for better hot-swap capability and plugability (Alex Boisvert)
|
11
|
+
* Removed: Turns out --verbose command line option is useless. Removed.
|
12
|
+
* Fixed: Jetty task now uses WebAppContextClassLoader to support hot-swapping webapps (Alex Boisvert)
|
13
|
+
* Fixed: "release" task now works with SVN URLs ending with /branches/*/ (Alex Boisvert)
|
14
|
+
* Fixed: Resources not included in JAR/WAR unless there's a src/main/java directory (Olexandr Zakordonskyy).
|
15
|
+
* Fixed: Files starting with dot (e.g. .config) not copied over as resource files, and not included in ZIP (Olexandr Zakordonskyy).
|
16
|
+
* Fixed: Empty directories not copied over as resources (Olexandr Zakordonskyy).
|
17
|
+
* Fixed: JAVA_OPTS and test.options[:java_args] not passed to JUnit task (Staube).
|
18
|
+
* Fixed: archive.exclude doesn't work when including a directory using :from/:as option.
|
19
|
+
* Fixed: JUnit/TestNG no longer run inner classes as test classes (Mark Feeney).
|
20
|
+
|
1
21
|
1.2.5 (8/13/2007)
|
2
22
|
* Fixed: Buildr not finding buildfile in parent directory, or switching to parent directory.
|
3
23
|
* Fixed: checks.rb:103: warning: multiple values for a block parameter (2 for 1)
|
data/Rakefile
CHANGED
@@ -6,7 +6,6 @@ require "spec/rake/spectask"
|
|
6
6
|
|
7
7
|
# Gem specification comes first, other tasks rely on it.
|
8
8
|
spec = Gem::Specification.new do |spec|
|
9
|
-
|
10
9
|
spec.name = "buildr"
|
11
10
|
spec.version = File.read(__FILE__.pathmap("%d/lib/buildr.rb")).scan(/VERSION\s*=\s*(['"])(.*)\1/)[0][1]
|
12
11
|
spec.author = "Assaf Arkin"
|
@@ -32,10 +31,10 @@ spec = Gem::Specification.new do |spec|
|
|
32
31
|
spec.add_dependency "net-ssh", "= 1.1.2"
|
33
32
|
spec.add_dependency "net-sftp", "= 1.1.0"
|
34
33
|
spec.add_dependency "rubyzip", "= 0.9.1"
|
35
|
-
spec.add_dependency "highline", "= 1.
|
34
|
+
spec.add_dependency "highline", "= 1.4.0"
|
36
35
|
spec.add_dependency "rjb", "= 1.0.6"
|
37
36
|
spec.add_dependency "Antwrap", "= 0.6.0"
|
38
|
-
spec.add_dependency "rspec", "= 1.0.
|
37
|
+
spec.add_dependency "rspec", "= 1.0.8"
|
39
38
|
spec.add_dependency "xml-simple", "= 1.0.11"
|
40
39
|
spec.add_dependency "archive-tar-minitar", "= 0.5.1"
|
41
40
|
end
|
@@ -171,8 +170,37 @@ namespace :upload do
|
|
171
170
|
end
|
172
171
|
end
|
173
172
|
|
173
|
+
namespace :release do
|
174
|
+
task :ready? do
|
175
|
+
require 'highline'
|
176
|
+
require 'highline/import'
|
177
|
+
|
178
|
+
puts "This version: #{spec.version}"
|
179
|
+
puts
|
180
|
+
puts "Top 4 lines form CHANGELOG:"
|
181
|
+
puts File.readlines("CHANGELOG")[0..3].map { |l| " #{l}" }
|
182
|
+
puts
|
183
|
+
ask("Top-entry in CHANGELOG file includes today's date?") =~ /yes/i or
|
184
|
+
fail "Please update CHANGELOG to include the right date"
|
185
|
+
end
|
186
|
+
|
187
|
+
task :post do
|
188
|
+
# Practical example of functional read but not comprehend code:
|
189
|
+
next_version = spec.version.to_ints.zip([0, 0, 1]).map { |a| a.inject(0) { |t,i| t + i } }.join(".")
|
190
|
+
puts "Updating lib/buildr.rb to next version number: #{next_version}"
|
191
|
+
buildr_rb = File.read(__FILE__.pathmap("%d/lib/buildr.rb")).
|
192
|
+
sub(/(VERSION\s*=\s*)(['"])(.*)\2/) { |line| "#{$1}#{$2}#{next_version}#{$2}" }
|
193
|
+
File.open(__FILE__.pathmap("%d/lib/buildr.rb"), "w") { |file| file.write buildr_rb }
|
194
|
+
puts "Adding entry to CHANGELOG"
|
195
|
+
changelog = File.read(__FILE__.pathmap("%d/CHANGELOG"))
|
196
|
+
File.open(__FILE__.pathmap("%d/CHANGELOG"), "w") { |file| file.write "#{next_version} (Pending)\n\n#{changelog}" }
|
197
|
+
end
|
198
|
+
|
199
|
+
task :meat=>["clobber", "svn:clean?", "test", "upload:packages", "upload:docs", "svn:tag"]
|
200
|
+
end
|
201
|
+
|
174
202
|
desc "Upload release to RubyForge including docs, tag SVN"
|
175
|
-
task :release=>[ "
|
203
|
+
task :release=>[ "release:ready?", "release:meat", "release:post" ]
|
176
204
|
|
177
205
|
|
178
206
|
|
data/lib/buildr.rb
CHANGED
data/lib/buildr/jetty.rb
CHANGED
@@ -29,12 +29,15 @@ module Buildr
|
|
29
29
|
|
30
30
|
# Which version of Jetty we're using by default (change with options.jetty.version).
|
31
31
|
VERSION = "6.1.3"
|
32
|
-
|
32
|
+
SLF4J_VERSION = "1.4.3"
|
33
|
+
|
33
34
|
# Libraries used by Jetty.
|
34
35
|
REQUIRES = [ "org.mortbay.jetty:jetty:jar:#{VERSION}", "org.mortbay.jetty:jetty-util:jar:#{VERSION}",
|
35
|
-
"org.mortbay.jetty:servlet-api-2.5:jar:#{VERSION}", "
|
36
|
+
"org.mortbay.jetty:servlet-api-2.5:jar:#{VERSION}", "org.slf4j:slf4j-api:jar:#{SLF4J_VERSION}",
|
37
|
+
"org.slf4j:slf4j-simple:jar:#{SLF4J_VERSION}", "org.slf4j:jcl104-over-slf4j:jar:#{SLF4J_VERSION}" ]
|
38
|
+
|
36
39
|
Java.rjb.onload { |rjb| rjb.classpath << REQUIRES << File.join(__DIR__, "jetty") }
|
37
|
-
|
40
|
+
|
38
41
|
# Default URL for Jetty (change with options.jetty.url).
|
39
42
|
URL = "http://localhost:8080"
|
40
43
|
|
@@ -72,6 +75,9 @@ module Buildr
|
|
72
75
|
def start(sync = nil)
|
73
76
|
begin
|
74
77
|
Java.rjb do
|
78
|
+
puts "RJB classpath #{Java.rjb.classpath.inspect}"
|
79
|
+
props = Rjb::import('java.lang.System').getProperties
|
80
|
+
props.setProperty("log4j.configuration", "file:./log4j.properties")
|
75
81
|
port = URI.parse(url).port
|
76
82
|
puts "Starting Jetty at http://localhost:#{port}" if verbose
|
77
83
|
jetty = Rjb::import("JettyWrapper").new(port)
|
Binary file
|
Binary file
|
@@ -5,6 +5,7 @@ import org.mortbay.jetty.handler.AbstractHandler;
|
|
5
5
|
import org.mortbay.jetty.handler.ContextHandler;
|
6
6
|
import org.mortbay.jetty.handler.ContextHandlerCollection;
|
7
7
|
import org.mortbay.jetty.webapp.WebAppContext;
|
8
|
+
import org.mortbay.jetty.webapp.WebAppClassLoader;
|
8
9
|
|
9
10
|
import javax.servlet.http.HttpServletRequest;
|
10
11
|
import javax.servlet.http.HttpServletResponse;
|
@@ -74,6 +75,8 @@ public class JettyWrapper {
|
|
74
75
|
context.setConfigurationClasses(new String[] {
|
75
76
|
"org.mortbay.jetty.webapp.WebInfConfiguration",
|
76
77
|
"org.mortbay.jetty.webapp.WebXmlConfiguration"});
|
78
|
+
context.setClassLoader(new WebAppClassLoader(context));
|
79
|
+
|
77
80
|
_handlerColl.addHandler(context);
|
78
81
|
context.start();
|
79
82
|
_apps.put(path, context);
|
data/lib/buildr/scala.rb
ADDED
@@ -0,0 +1,368 @@
|
|
1
|
+
require "java/java"
|
2
|
+
|
3
|
+
# TODO List
|
4
|
+
# -Eclipse support
|
5
|
+
# -SUnit
|
6
|
+
# -Cleanup compiler options
|
7
|
+
|
8
|
+
module Buildr
|
9
|
+
|
10
|
+
module Scala
|
11
|
+
class << self
|
12
|
+
def scala_base
|
13
|
+
ENV["SCALA_HOME"] + "/share/scala"
|
14
|
+
end
|
15
|
+
|
16
|
+
def scala_lib
|
17
|
+
scala_lib = scala_base + "/lib/scala-library.jar"
|
18
|
+
end
|
19
|
+
|
20
|
+
def scalac(*args)
|
21
|
+
options = Hash === args.last ? args.pop : {}
|
22
|
+
rake_check_options options, :classpath, :sourcepath, :output, :scalac_args, :name
|
23
|
+
|
24
|
+
files = args.flatten.each { |f| f.invoke if f.respond_to?(:invoke) }.map(&:to_s).
|
25
|
+
collect { |arg| File.directory?(arg) ? FileList["#{arg}/**/*.scala"] : arg }.flatten
|
26
|
+
name = options[:name] || Dir.pwd
|
27
|
+
return if files.empty?
|
28
|
+
|
29
|
+
fail "Missing SCALA_HOME environment variable" unless ENV["SCALA_HOME"]
|
30
|
+
fail "Invalid SCALA_HOME environment variable" unless File.directory? ENV["SCALA_HOME"]
|
31
|
+
|
32
|
+
cmd_args = []
|
33
|
+
use_fsc = !(ENV["USE_FSC"] =~ /^(no|off|false)$/i)
|
34
|
+
classpath = classpath_from(options)
|
35
|
+
scala_cp = [ classpath, FileList["#{scala_base}/lib/*"] ].flatten.join(File::PATH_SEPARATOR)
|
36
|
+
cmd_args << "-cp" << scala_cp unless scala_cp.empty?
|
37
|
+
cmd_args << "-sourcepath" << options[:sourcepath].join(File::PATH_SEPARATOR) if options[:sourcepath]
|
38
|
+
cmd_args << "-d" << options[:output].to_s if options[:output]
|
39
|
+
cmd_args += options[:scalac_args].flatten if options[:scalac_args]
|
40
|
+
cmd_args += files
|
41
|
+
unless Rake.application.options.dryrun
|
42
|
+
puts "Compiling #{files.size} source files in #{name}" if verbose
|
43
|
+
puts (["scalac"] + cmd_args).join(" ") if Rake.application.options.trace
|
44
|
+
if use_fsc
|
45
|
+
system ([ENV["SCALA_HOME"]+"/bin/fsc"] + cmd_args).join(" ")
|
46
|
+
else
|
47
|
+
Java.rjb do |rjb|
|
48
|
+
rjb.import("scala.tools.nsc.Main").main(cmd_args) == 0 or
|
49
|
+
fail "Failed to compile, see errors above"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
protected
|
56
|
+
|
57
|
+
# :call-seq:
|
58
|
+
# classpath_from(options) => files
|
59
|
+
#
|
60
|
+
# Extracts the classpath from the options, expands it by calling artifacts, invokes
|
61
|
+
# each of the artifacts and returns an array of paths.
|
62
|
+
def classpath_from(options)
|
63
|
+
classpath = (options[:classpath] || []).collect
|
64
|
+
Buildr.artifacts(classpath).each { |t| t.invoke if t.respond_to?(:invoke) }.map(&:to_s)
|
65
|
+
end
|
66
|
+
end # Scala << self
|
67
|
+
|
68
|
+
|
69
|
+
# !! This is mostly a copy-paste Buildr:Java:CompileTask !!
|
70
|
+
#
|
71
|
+
# Wraps Scalac in a task that does all the heavy lifting.
|
72
|
+
#
|
73
|
+
# Accepts multiple source directories that are invoked as prerequisites before compilation.
|
74
|
+
# You can pass a task as a source directory, e.g. compile.from(apt).
|
75
|
+
#
|
76
|
+
# Likewise, classpath dependencies are invoked before compiling. All classpath dependencies
|
77
|
+
# are evaluated as #artifacts, so you can pass artifact specifications and even projects.
|
78
|
+
#
|
79
|
+
# Creates a file task for the target directory, so executing that task as a dependency will
|
80
|
+
# execute the compile task first.
|
81
|
+
#
|
82
|
+
# Compiler options are inherited form a parent task, e.g. the foo:bar:compile task inherits
|
83
|
+
# its options from the foo:compile task. Even if foo is an empty project that does not compile
|
84
|
+
# any classes itself, you can use it to set compile options for all its sub-projects.
|
85
|
+
#
|
86
|
+
# Normally, the project will take care of setting the source and target directory, and you
|
87
|
+
# only need to set options and classpath dependencies. See Project#compile.
|
88
|
+
class ScalaCompilerTask < Rake::Task
|
89
|
+
|
90
|
+
# Compiler options, accessible from CompileTask#options.
|
91
|
+
#
|
92
|
+
# Supported options are:
|
93
|
+
# - warnings -- Generate warnings if true (opposite of -nowarn).
|
94
|
+
# - deprecation -- Output source locations where deprecated APIs are used.
|
95
|
+
# - source -- Source compatibility with specified release.
|
96
|
+
# - target -- Class file compatibility with specified release.
|
97
|
+
# - lint -- Value to pass to xlint argument. Use true to enable default lint
|
98
|
+
# options, or pass a specific setting as string or array of strings.
|
99
|
+
# - debug -- Generate debugging info.
|
100
|
+
# - other -- Array of options to pass to the Scalac compiler as is.
|
101
|
+
#
|
102
|
+
# For example:
|
103
|
+
# compile.options.warnings = true
|
104
|
+
# compile.options.source = options.target = "1.6"
|
105
|
+
class Options
|
106
|
+
|
107
|
+
include InheritedAttributes
|
108
|
+
|
109
|
+
OPTIONS = [:warnings, :deprecation, :source, :target, :lint, :debug, :other]
|
110
|
+
|
111
|
+
# Generate warnings (opposite of -nowarn).
|
112
|
+
attr_accessor :warnings
|
113
|
+
inherited_attr(:warnings) { verbose }
|
114
|
+
# Output source locations where deprecated APIs are used.
|
115
|
+
attr_accessor :deprecation
|
116
|
+
inherited_attr :deprecation, false
|
117
|
+
# Provide source compatibility with specified release.
|
118
|
+
attr_accessor :source
|
119
|
+
inherited_attr :source
|
120
|
+
# Generate class files for specific VM version.
|
121
|
+
attr_accessor :target
|
122
|
+
inherited_attr :target
|
123
|
+
# Values to pass to Xlint: string or array. Use true to enable
|
124
|
+
# Xlint with no values.
|
125
|
+
attr_accessor :lint
|
126
|
+
inherited_attr :lint, false
|
127
|
+
# Generate all debugging info.
|
128
|
+
attr_accessor :debug
|
129
|
+
inherited_attr(:debug) { Buildr.options.debug }
|
130
|
+
# Array of arguments passed to the Scalac compiler as is.
|
131
|
+
attr_accessor :other
|
132
|
+
inherited_attr :other
|
133
|
+
|
134
|
+
def initialize(parent = nil) #:nodoc:
|
135
|
+
@parent = parent
|
136
|
+
end
|
137
|
+
|
138
|
+
attr_reader :parent # :nodoc:
|
139
|
+
|
140
|
+
# Resets all the options.
|
141
|
+
def clear()
|
142
|
+
OPTIONS.each { |name| send "#{name}=", nil }
|
143
|
+
end
|
144
|
+
|
145
|
+
def to_s() #:nodoc:
|
146
|
+
OPTIONS.inject({}){ |hash, name| hash[name] = send(name) ; hash }.reject{ |name,value| value.nil? }.inspect
|
147
|
+
end
|
148
|
+
|
149
|
+
# Returns Scalac command line arguments from the set of options.
|
150
|
+
def scalac_args()
|
151
|
+
args = []
|
152
|
+
args << "-nowarn" unless warnings
|
153
|
+
args << "-verbose" if Rake.application.options.trace
|
154
|
+
args << "-g" if debug
|
155
|
+
args << "-deprecation" if deprecation
|
156
|
+
args << "-source" << source.to_s if source
|
157
|
+
args << "-target" << target.to_s if target
|
158
|
+
case lint
|
159
|
+
when Array
|
160
|
+
args << "-Xlint:#{lint.join(',')}"
|
161
|
+
when String
|
162
|
+
args << "-Xlint:#{lint}"
|
163
|
+
when true
|
164
|
+
args << "-Xlint"
|
165
|
+
end
|
166
|
+
args.concat(other.to_a) if other
|
167
|
+
args
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
171
|
+
|
172
|
+
|
173
|
+
def initialize(*args) #:nodoc:
|
174
|
+
super
|
175
|
+
parent = Rake::Task["^scalac"] if name[":"] # Only if in namespace
|
176
|
+
if parent && parent.respond_to?(:options)
|
177
|
+
@options = Options.new(parent.options)
|
178
|
+
else
|
179
|
+
@options = Options.new
|
180
|
+
end
|
181
|
+
@sources = []
|
182
|
+
@classpath = []
|
183
|
+
|
184
|
+
enhance do |task|
|
185
|
+
mkpath target.to_s, :verbose=>false
|
186
|
+
Scala.scalac source_files.keys, :sourcepath=>sources.map(&:to_s).select { |source| File.directory?(source) }.uniq,
|
187
|
+
:classpath=>classpath, :output=>target, :scalac_args=>options.scalac_args, :name=>task.name
|
188
|
+
# By touching the target we let other tasks know we did something,
|
189
|
+
# and also prevent recompiling again for classpath dependencies.
|
190
|
+
touch target.to_s, :verbose=>false
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
# Source directories and files to compile.
|
195
|
+
attr_accessor :sources
|
196
|
+
|
197
|
+
# :call-seq:
|
198
|
+
# from(*sources) => self
|
199
|
+
#
|
200
|
+
# Adds source directories and files to compile, and returns self.
|
201
|
+
#
|
202
|
+
# For example:
|
203
|
+
# compile.from("src/scala").into("classes").with("module1.jar")
|
204
|
+
def from(*sources)
|
205
|
+
@sources |= sources.flatten
|
206
|
+
self
|
207
|
+
end
|
208
|
+
|
209
|
+
# Classpath dependencies.
|
210
|
+
attr_accessor :classpath
|
211
|
+
|
212
|
+
# :call-seq:
|
213
|
+
# with(*artifacts) => self
|
214
|
+
#
|
215
|
+
# Adds files and artifacts as classpath dependencies, and returns self.
|
216
|
+
#
|
217
|
+
# Calls #artifacts on the arguments, so you can pass artifact specifications,
|
218
|
+
# tasks, projects, etc. Use this rather than setting the classpath directly.
|
219
|
+
#
|
220
|
+
# For example:
|
221
|
+
# compile.with("module1.jar", "log4j:log4j:jar:1.0", project("foo"))
|
222
|
+
def with(*specs)
|
223
|
+
@classpath |= Buildr.artifacts(specs.flatten).uniq
|
224
|
+
self
|
225
|
+
end
|
226
|
+
|
227
|
+
# The target directory for the generated class files.
|
228
|
+
attr_reader :target
|
229
|
+
|
230
|
+
# :call-seq:
|
231
|
+
# into(path) => self
|
232
|
+
#
|
233
|
+
# Sets the target directory and returns self. This will also set the compile task
|
234
|
+
# as a prerequisite to a file task on the target directory.
|
235
|
+
#
|
236
|
+
# For example:
|
237
|
+
# compile(src_dir).into(target_dir).with(artifacts)
|
238
|
+
# Both compile.invoke and file(target_dir).invoke will compile the source files.
|
239
|
+
def into(path)
|
240
|
+
path = File.expand_path(path.to_s)
|
241
|
+
@target = file(path).enhance([self]) unless @target && @target.to_s == path
|
242
|
+
self
|
243
|
+
end
|
244
|
+
|
245
|
+
# Returns the compiler options.
|
246
|
+
attr_reader :options
|
247
|
+
|
248
|
+
# :call-seq:
|
249
|
+
# using(options) => self
|
250
|
+
#
|
251
|
+
# Sets the compiler options from a hash and returns self.
|
252
|
+
#
|
253
|
+
# For example:
|
254
|
+
# compile.using(:warnings=>true, :source=>"1.5")
|
255
|
+
def using(*args)
|
256
|
+
args.pop.each { |key, value| options.send "#{key}=", value } if Hash === args.last
|
257
|
+
args.each { |key| options.send "#{key}=", value = true }
|
258
|
+
self
|
259
|
+
end
|
260
|
+
|
261
|
+
def timestamp() #:nodoc:
|
262
|
+
# If we compiled successfully, then the target directory reflects that.
|
263
|
+
# If we didn't, see needed?
|
264
|
+
target ? target.timestamp : Rake::EARLY
|
265
|
+
end
|
266
|
+
|
267
|
+
def needed?() #:nodoc:
|
268
|
+
return false if source_files.empty?
|
269
|
+
return true unless File.exist?(target.to_s)
|
270
|
+
return true if source_files.any? { |j, c| !File.exist?(c) || File.stat(j).mtime > File.stat(c).mtime }
|
271
|
+
oldest = source_files.map { |j, c| File.stat(c).mtime }.min
|
272
|
+
return classpath.any? { |path| application[path].timestamp > oldest }
|
273
|
+
end
|
274
|
+
|
275
|
+
def prerequisites() #:nodoc:
|
276
|
+
super + classpath + sources
|
277
|
+
end
|
278
|
+
|
279
|
+
def invoke_prerequisites() #:nodoc:
|
280
|
+
prerequisites.each { |n| application[n, @scope].invoke }
|
281
|
+
end
|
282
|
+
|
283
|
+
# Returns the files to compile. This list is derived from the list of sources,
|
284
|
+
# expanding directories into files, and includes only source files that are
|
285
|
+
# newer than the corresponding class file. Includes all files if one or more
|
286
|
+
# classpath dependency has been updated.
|
287
|
+
def source_files()
|
288
|
+
@source_files ||= @sources.map(&:to_s).inject({}) do |map, source|
|
289
|
+
raise "Compile task #{name} has source files, but no target directory" unless target
|
290
|
+
target_dir = target.to_s
|
291
|
+
if File.directory?(source)
|
292
|
+
base = Pathname.new(source)
|
293
|
+
FileList["#{source}/**/*.scala"].
|
294
|
+
each { |file| map[file] = File.join(target_dir, Pathname.new(file).relative_path_from(base).to_s.ext(".class")) }
|
295
|
+
else
|
296
|
+
map[source] = File.join(target_dir, File.basename(source).ext(".class"))
|
297
|
+
end
|
298
|
+
map
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
def scala_lib
|
303
|
+
Scala.scala_lib
|
304
|
+
end
|
305
|
+
end # ScalaCompilerTask
|
306
|
+
|
307
|
+
end # Scala
|
308
|
+
|
309
|
+
# Local task to execute the Scalac compile task of the current project.
|
310
|
+
# This task is not itself a compile task.
|
311
|
+
desc "Compile all scalac projects"
|
312
|
+
Project.local_task("scalac") { |name| "Compiling scala sources for #{name}" }
|
313
|
+
|
314
|
+
class Project
|
315
|
+
|
316
|
+
# :call-seq:
|
317
|
+
# compile(*sources) => CompileTask
|
318
|
+
# compile(*sources) { |task| .. } => CompileTask
|
319
|
+
#
|
320
|
+
# The compile task does what its name suggests. This method returns the project's
|
321
|
+
# CompileTask. It also accepts a list of source directories and files to compile
|
322
|
+
# (equivalent to calling CompileTask#from on the task), and a block for any
|
323
|
+
# post-compilation work.
|
324
|
+
#
|
325
|
+
# The compile task will pick all the source files in the src/main/scala directory,
|
326
|
+
# and unless specified, compile them into the target/classes directory. It will pick
|
327
|
+
# the default values for compiler options from the parent project's compile task.
|
328
|
+
#
|
329
|
+
# For example:
|
330
|
+
# # Force target compatibility.
|
331
|
+
# compile.options.source = "1.6"
|
332
|
+
# # Include Apt-generated source files.
|
333
|
+
# compile.from apt
|
334
|
+
# # Include Log4J and the api sub-project artifacts.
|
335
|
+
# compile.with "log4j:log4j:jar:1.2", project("api")
|
336
|
+
# # Run the OpenJPA bytecode enhancer after compilation.
|
337
|
+
# compile { open_jpa_enhance }
|
338
|
+
#
|
339
|
+
# For more information, see Scala::ScalaCompilerTask.
|
340
|
+
def scalac(*sources, &block)
|
341
|
+
task("scalac").from(sources).enhance &block
|
342
|
+
end
|
343
|
+
|
344
|
+
end # Project
|
345
|
+
|
346
|
+
Project.on_define do |project|
|
347
|
+
# Scalac runs after compile task (and therefore, after "prepare" and "resources")
|
348
|
+
scalac = Scala::ScalaCompilerTask.define_task("scalac"=>[task("compile")])
|
349
|
+
project.path_to("src/main/scala").tap { |dir| scalac.from dir if File.exist?(dir) }
|
350
|
+
scalac.into project.path_to(:target, "classes")
|
351
|
+
project.recursive_task("scalac")
|
352
|
+
|
353
|
+
project.enhance do |project|
|
354
|
+
# This comes last because the target path may change.
|
355
|
+
project.packages.each do |p|
|
356
|
+
p.with scalac.target if p.type == :jar
|
357
|
+
p.classes = scalac.target if p.type == :war
|
358
|
+
end
|
359
|
+
# Work-in-progress
|
360
|
+
#project.task("eclipse").classpathContainers 'ch.epfl.lamp.sdt.launching.SCALA_CONTAINER'
|
361
|
+
|
362
|
+
project.build project.scalac.target
|
363
|
+
project.clean { verbose(false) { rm_rf project.scalac.target.to_s } }
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
end # Buildr
|
368
|
+
|