# File lib/rake/javaextensiontask.rb, line 38
38: def define
39: super
40:
41: define_java_platform_tasks
42: end
# File lib/rake/javaextensiontask.rb, line 28
28: def init(name = nil, gem_spec = nil)
29: super
30: @source_pattern = '**/*.java'
31: @classpath = nil
32: @java_compiling = nil
33: @debug = false
34: @source_version = '1.5'
35: @target_version = '1.5'
36: end
# File lib/rake/javaextensiontask.rb, line 45
45: def define_compile_tasks(for_platform = nil, ruby_ver = RUBY_VERSION)
46: # platform usage
47: platf = for_platform || platform
48:
49: # lib_path
50: lib_path = lib_dir
51:
52: # tmp_path
53: tmp_path = "#{@tmp_dir}/#{platf}/#{@name}"
54:
55: # cleanup and clobbering
56: CLEAN.include(tmp_path)
57: CLOBBER.include("#{lib_path}/#{binary(platf)}")
58: CLOBBER.include("#{@tmp_dir}")
59:
60: # directories we need
61: directory tmp_path
62: directory lib_dir
63:
64: # copy binary from temporary location to final lib
65: # tmp/extension_name/extension_name.{so,bundle} => lib/
66: task "copy:#{@name}:#{platf}" => [lib_path, "#{tmp_path}/#{binary(platf)}"] do
67: cp "#{tmp_path}/#{binary(platf)}", "#{lib_path}/#{binary(platf)}"
68: end
69:
70: not_jruby_compile_msg = WARNING: You're cross-compiling a binary extension for JRuby, but are usinganother interpreter. If your Java classpath or extension dir settings are notcorrectly detected, then either check the appropriate environment variables orexecute the Rake compilation task using the JRuby interpreter.(e.g. `jruby -S rake compile:java`)
71: warn_once(not_jruby_compile_msg) unless defined?(JRUBY_VERSION)
72:
73: file "#{tmp_path}/#{binary(platf)}" => "#{tmp_path}/.build" do
74:
75: class_files = FileList["#{tmp_path}/**/*.class"].
76: gsub("#{tmp_path}/", '')
77:
78: # avoid environment variable expansion using backslash
79: class_files.gsub!('$', '\$') unless windows?
80:
81: args = class_files.map { |path|
82: ["-C #{tmp_path}", path]
83: }.flatten
84:
85: sh "jar cf #{tmp_path}/#{binary(platf)} #{args.join(' ')}"
86: end
87:
88: file "#{tmp_path}/.build" => [tmp_path] + source_files do
89: classpath_arg = java_classpath_arg(@classpath)
90: debug_arg = @debug ? '-g' : ''
91:
92: sh "javac #{java_extdirs_arg} -target #{@target_version} -source #{@source_version} -Xlint:unchecked #{debug_arg} #{classpath_arg} -d #{tmp_path} #{source_files.join(' ')}"
93:
94: # Checkpoint file
95: touch "#{tmp_path}/.build"
96: end
97:
98: # compile tasks
99: unless Rake::Task.task_defined?('compile') then
100: desc "Compile all the extensions"
101: task "compile"
102: end
103:
104: # compile:name
105: unless Rake::Task.task_defined?("compile:#{@name}") then
106: desc "Compile #{@name}"
107: task "compile:#{@name}"
108: end
109:
110: # Allow segmented compilation by platform (open door for 'cross compile')
111: task "compile:#{@name}:#{platf}" => ["copy:#{@name}:#{platf}"]
112: task "compile:#{platf}" => ["compile:#{@name}:#{platf}"]
113:
114: # Only add this extension to the compile chain if current
115: # platform matches the indicated one.
116: if platf == RUBY_PLATFORM then
117: # ensure file is always copied
118: file "#{lib_path}/#{binary(platf)}" => ["copy:#{name}:#{platf}"]
119:
120: task "compile:#{@name}" => ["compile:#{@name}:#{platf}"]
121: task "compile" => ["compile:#{platf}"]
122: end
123: end
# File lib/rake/javaextensiontask.rb, line 131
131: def define_java_platform_tasks
132: # lib_path
133: lib_path = lib_dir
134:
135: if @gem_spec && !Rake::Task.task_defined?("java:#{@gem_spec.name}")
136: task "java:#{@gem_spec.name}" do |t|
137:
138: # FIXME: truly duplicate the Gem::Specification
139: spec = gem_spec.dup
140:
141: # adjust to specified platform
142: spec.platform = Gem::Platform.new('java')
143:
144: # clear the extensions defined in the specs
145: spec.extensions.clear
146:
147: # add the binaries that this task depends on
148: ext_files = []
149:
150: # go through native prerequisites and grab the real extension files from there
151: t.prerequisites.each do |ext|
152: ext_files << ext
153: end
154:
155: # include the files in the gem specification
156: spec.files += ext_files
157:
158: # expose gem specification for customization
159: if @java_compiling
160: @java_compiling.call(spec)
161: end
162:
163: # Generate a package for this gem
164: gem_package = Rake::GemPackageTask.new(spec) do |pkg|
165: pkg.need_zip = false
166: pkg.need_tar = false
167: end
168: end
169:
170: # add binaries to the dependency chain
171: task "java:#{@gem_spec.name}" => ["#{lib_path}/#{binary(platform)}"]
172:
173: # ensure the extension get copied
174: unless Rake::Task.task_defined?("#{lib_path}/#{binary(platform)}") then
175: file "#{lib_path}/#{binary(platform)}" => ["copy:#{name}:#{platform}"]
176: end
177:
178: task 'java' => ["java:#{@gem_spec.name}"]
179: end
180:
181: task 'java' do
182: task 'compile' => 'compile:java'
183: end
184: end
Discover the Java/JRuby classpath and build a classpath argument
@params
*args:: Additional classpath arguments to append
Copied verbatim from the ActiveRecord-JDBC project. There are a small myriad of ways to discover the Java classpath correctly.
# File lib/rake/javaextensiontask.rb, line 204
204: def java_classpath_arg(*args)
205: jruby_cpath = nil
206: if RUBY_PLATFORM =~ /java/
207: begin
208: cpath = Java::java.lang.System.getProperty('java.class.path').split(File::PATH_SEPARATOR)
209: cpath += Java::java.lang.System.getProperty('sun.boot.class.path').split(File::PATH_SEPARATOR)
210: jruby_cpath = cpath.compact.join(File::PATH_SEPARATOR)
211: rescue => e
212: end
213: end
214: unless jruby_cpath
215: jruby_cpath = ENV['JRUBY_PARENT_CLASSPATH'] || ENV['JRUBY_HOME'] &&
216: Dir.glob("#{File.expand_path(ENV['JRUBY_HOME'])}/lib/*.jar").
217: join(File::PATH_SEPARATOR)
218: end
219: raise "JRUBY_HOME or JRUBY_PARENT_CLASSPATH are not set" unless jruby_cpath
220: jruby_cpath += File::PATH_SEPARATOR + args.join(File::PATH_SEPARATOR) unless args.empty?
221: jruby_cpath ? "-cp \"#{jruby_cpath}\"" : ""
222: end
Discover Java Extension Directories and build an extdirs argument
# File lib/rake/javaextensiontask.rb, line 189
189: def java_extdirs_arg
190: extdirs = Java::java.lang.System.getProperty('java.ext.dirs') rescue nil
191: extdirs = ENV['JAVA_EXT_DIR'] unless extdirs
192: java_extdir = extdirs.nil? ? "" : "-extdirs \"#{extdirs}\""
193: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.