rake-compiler 0.5.0 → 0.6.0
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/History.txt +30 -0
- data/README.rdoc +25 -10
- data/features/cross-compile.feature +9 -0
- data/features/step_definitions/cross_compilation.rb +10 -9
- data/features/step_definitions/folders.rb +1 -1
- data/features/support/platform_extension_helpers.rb +14 -0
- data/lib/rake/extensiontask.rb +73 -34
- data/spec/lib/rake/extensiontask_spec.rb +66 -21
- data/spec/spec_helper.rb +7 -2
- data/tasks/bin/cross-ruby.rake +8 -2
- data/tasks/gem.rake +1 -1
- metadata +4 -3
data/History.txt
CHANGED
@@ -1,3 +1,33 @@
|
|
1
|
+
=== 0.6.x (in Git)
|
2
|
+
|
3
|
+
* Enhancements
|
4
|
+
* Implemented 'fat-binaries' generation for cross compiling
|
5
|
+
(for now). Thanks to Aaron Patterson for the suggestion and
|
6
|
+
original idea.
|
7
|
+
|
8
|
+
rake cross native gem RUBY_CC_VERSION=1.8.6:1.9.1
|
9
|
+
|
10
|
+
Will package extensions for 1.8 and 1.9 versions of Ruby.
|
11
|
+
* Can now cross compile extensions for 1.9 using 1.8.x as base.
|
12
|
+
Be warned: works from 1.8 to 1.9, but not if your default ruby is 1.9
|
13
|
+
|
14
|
+
rake cross compile RUBY_CC_VERSION=1.9.1
|
15
|
+
|
16
|
+
* Allow simultaneous versions of Ruby to compile extensions.
|
17
|
+
This change allow 1.8.x compiles co-exist with 1.9.x ones
|
18
|
+
and don't override each other.
|
19
|
+
|
20
|
+
Please perform <tt>rake clobber</tt> prior compiling again.
|
21
|
+
* Allow optional source file URL for cross-compile tasks.
|
22
|
+
(Thanks to deepj for the patches)
|
23
|
+
|
24
|
+
rake-compiler cross-ruby VERSION=1.9.1-p0 SOURCE=http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p0.tar.bz2
|
25
|
+
|
26
|
+
* Bugfixes
|
27
|
+
* Removed strict versioning for gems since it clash with fat binaries.
|
28
|
+
From now on, if your gem only targets a specific version of Ruby, please
|
29
|
+
indicate it in the Gem::Specification (<tt>required_ruby_version</tt>)
|
30
|
+
|
1
31
|
=== 0.5.0 / 2009-04-25
|
2
32
|
|
3
33
|
* Enhancements
|
data/README.rdoc
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
= rake-compiler
|
2
2
|
|
3
3
|
rake-compiler aims to help Gem developers while dealing with Ruby C
|
4
|
-
extensions,
|
4
|
+
extensions, simplifying the code and reducing the duplication.
|
5
5
|
|
6
|
-
It follows *convention over configuration* and set an
|
6
|
+
It follows *convention over configuration* and set an standardized
|
7
7
|
structure to build and package C extensions in your gems.
|
8
8
|
|
9
|
-
This is the result of
|
9
|
+
This is the result of experiences dealing with several Gems that required
|
10
10
|
native extensions across platforms and different user configurations
|
11
11
|
where details like portability and clarity of code were lacking.
|
12
12
|
|
@@ -160,7 +160,7 @@ personalize several settings for <tt>Rake::ExtensionTask</tt>:
|
|
160
160
|
|
161
161
|
== Future is now: Cross compilation
|
162
162
|
|
163
|
-
rake-compiler provides now an
|
163
|
+
rake-compiler provides now an standardized way to generate, from Linux or OSX
|
164
164
|
both extensions and gem binaries for Windows!
|
165
165
|
|
166
166
|
It takes advantages from GCC host/target to build binaries (for target) on
|
@@ -171,12 +171,12 @@ different OS (hosts).
|
|
171
171
|
Besides having the development tool chain installed (GCC), you should install
|
172
172
|
also <tt>mingw32</tt> cross compilation package.
|
173
173
|
|
174
|
-
|
175
|
-
will be enough.
|
174
|
+
This depends on your operating system distribution, a simple
|
175
|
+
<tt>apt-get install mingw32</tt> will be enough.
|
176
176
|
|
177
177
|
Please check OSX documentation about installing mingw32 from macports.
|
178
178
|
|
179
|
-
=== I have my
|
179
|
+
=== I have my tool-chain, now what?
|
180
180
|
|
181
181
|
You need to build Ruby for Windows.
|
182
182
|
|
@@ -194,7 +194,7 @@ supply a <tt>VERSION</tt>:
|
|
194
194
|
|
195
195
|
=== Let's build some gems!
|
196
196
|
|
197
|
-
Now, you only need to use additional options in your extension
|
197
|
+
Now, you only need to use additional options in your extension definition:
|
198
198
|
|
199
199
|
Rake::ExtensionTask.new('my_extension', gem_spec) do |ext|
|
200
200
|
ext.cross_compile = true # enable cross compilation (requires cross compile toolchain)
|
@@ -225,11 +225,26 @@ And you're done, yeah.
|
|
225
225
|
|
226
226
|
You can specify against with version of Ruby you want to build the extension:
|
227
227
|
|
228
|
-
rake cross compile RUBY_CC_VERSION=1.8
|
228
|
+
rake cross compile RUBY_CC_VERSION=1.8.6
|
229
229
|
|
230
230
|
If you installed <tt>1.9.1</tt>, you can do:
|
231
231
|
|
232
|
-
rake cross compile RUBY_CC_VERSION=1.9
|
232
|
+
rake cross compile RUBY_CC_VERSION=1.9.1
|
233
|
+
|
234
|
+
Even more, you can target multiple versions (ie. 1.8.6 and 1.9.1):
|
235
|
+
|
236
|
+
rake cross compile RUBY_CC_VERSION=1.8.6:1.9.1
|
237
|
+
|
238
|
+
And more exiting, bundle both binaries in one "fat" Gem:
|
239
|
+
|
240
|
+
rake cross native gem RUBY_CC_VERSION=1.8.6:1.9.1
|
241
|
+
|
242
|
+
That will place binaries for 1.8 and 1.9 versions of ruby inside <tt>lib_dir</tt>
|
243
|
+
|
244
|
+
lib/1.8/my_extension.so
|
245
|
+
lib/1.9/my_extension.so
|
246
|
+
|
247
|
+
Now is up to you to make your gem load the proper one ;-)
|
233
248
|
|
234
249
|
== Future
|
235
250
|
|
@@ -11,3 +11,12 @@ Feature: Cross-compile C extensions
|
|
11
11
|
When rake task 'cross compile' is invoked
|
12
12
|
Then rake task 'cross compile' succeeded
|
13
13
|
And binaries for platform 'i386-mingw32' get generated
|
14
|
+
|
15
|
+
Scenario: compile single extension to multiple versions
|
16
|
+
Given that all my source files are in place
|
17
|
+
And I'm running a POSIX operating system
|
18
|
+
And I've installed cross compile toolchain
|
19
|
+
When rake task 'cross compile RUBY_CC_VERSION=1.8.6:1.9.1' is invoked
|
20
|
+
Then rake task 'cross compile RUBY_CC_VERSION=1.8.6:1.9.1' succeeded
|
21
|
+
And binaries for platform 'i386-mingw32' version '1.8' get copied
|
22
|
+
And binaries for platform 'i386-mingw32' version '1.9' get copied
|
@@ -13,19 +13,20 @@ Given %r{^I've installed cross compile toolchain$} do
|
|
13
13
|
File.exist? File.join(path, comp)
|
14
14
|
end
|
15
15
|
end
|
16
|
-
|
16
|
+
pending "Cannot locate suitable compiler in the PATH." unless compiler
|
17
17
|
end
|
18
18
|
|
19
19
|
Then /^binaries for platform '(.*)' get generated$/ do |platform|
|
20
|
-
ext =
|
21
|
-
when /darwin/
|
22
|
-
'bundle'
|
23
|
-
when /mingw|mswin|linux/
|
24
|
-
'so'
|
25
|
-
else
|
26
|
-
RbConfig::CONFIG['DLEXT']
|
27
|
-
end
|
20
|
+
ext = binary_extension(platform)
|
28
21
|
|
29
22
|
ext_for_platform = Dir.glob("tmp/#{platform}/**/*.#{ext}")
|
30
23
|
ext_for_platform.should_not be_empty
|
31
24
|
end
|
25
|
+
|
26
|
+
Then /^binaries for platform '(.*)' version '(.*)' get copied$/ do |platform, version|
|
27
|
+
lib_path = "lib/#{version}"
|
28
|
+
ext = binary_extension(platform)
|
29
|
+
|
30
|
+
ext_for_platform = Dir.glob("#{lib_path}/*.#{ext}")
|
31
|
+
ext_for_platform.should_not be_empty
|
32
|
+
end
|
data/lib/rake/extensiontask.rb
CHANGED
@@ -72,16 +72,19 @@ module Rake
|
|
72
72
|
end
|
73
73
|
|
74
74
|
private
|
75
|
-
def define_compile_tasks(for_platform = nil)
|
75
|
+
def define_compile_tasks(for_platform = nil, ruby_ver = RUBY_VERSION)
|
76
76
|
# platform usage
|
77
77
|
platf = for_platform || platform
|
78
78
|
|
79
|
+
# lib_path
|
80
|
+
lib_path = lib_dir
|
81
|
+
|
79
82
|
# tmp_path
|
80
|
-
tmp_path = "#{@tmp_dir}/#{platf}/#{@name}"
|
83
|
+
tmp_path = "#{@tmp_dir}/#{platf}/#{@name}/#{ruby_ver}"
|
81
84
|
|
82
85
|
# cleanup and clobbering
|
83
86
|
CLEAN.include(tmp_path)
|
84
|
-
CLOBBER.include("#{
|
87
|
+
CLOBBER.include("#{lib_path}/#{binary(platf)}")
|
85
88
|
CLOBBER.include("#{@tmp_dir}")
|
86
89
|
|
87
90
|
# directories we need
|
@@ -90,8 +93,8 @@ module Rake
|
|
90
93
|
|
91
94
|
# copy binary from temporary location to final lib
|
92
95
|
# tmp/extension_name/extension_name.{so,bundle} => lib/
|
93
|
-
task "copy:#{@name}:#{platf}" => [
|
94
|
-
cp "#{tmp_path}/#{binary(platf)}", "#{
|
96
|
+
task "copy:#{@name}:#{platf}:#{ruby_ver}" => [lib_path, "#{tmp_path}/#{binary(platf)}"] do
|
97
|
+
cp "#{tmp_path}/#{binary(platf)}", "#{lib_path}/#{binary(platf)}"
|
95
98
|
end
|
96
99
|
|
97
100
|
# binary in temporary folder depends on makefile and source files
|
@@ -147,25 +150,28 @@ module Rake
|
|
147
150
|
end
|
148
151
|
|
149
152
|
# Allow segmented compilation by platform (open door for 'cross compile')
|
150
|
-
task "compile:#{@name}:#{platf}" => ["copy:#{@name}:#{platf}"]
|
153
|
+
task "compile:#{@name}:#{platf}" => ["copy:#{@name}:#{platf}:#{ruby_ver}"]
|
151
154
|
task "compile:#{platf}" => ["compile:#{@name}:#{platf}"]
|
152
155
|
|
153
156
|
# Only add this extension to the compile chain if current
|
154
157
|
# platform matches the indicated one.
|
155
158
|
if platf == RUBY_PLATFORM then
|
156
159
|
# ensure file is always copied
|
157
|
-
file "#{
|
160
|
+
file "#{lib_path}/#{binary(platf)}" => ["copy:#{name}:#{platf}:#{ruby_ver}"]
|
158
161
|
|
159
162
|
task "compile:#{@name}" => ["compile:#{@name}:#{platf}"]
|
160
163
|
task "compile" => ["compile:#{platf}"]
|
161
164
|
end
|
162
165
|
end
|
163
166
|
|
164
|
-
def define_native_tasks(for_platform = nil)
|
167
|
+
def define_native_tasks(for_platform = nil, ruby_ver = RUBY_VERSION)
|
165
168
|
platf = for_platform || platform
|
166
169
|
|
167
170
|
# tmp_path
|
168
|
-
tmp_path = "#{@tmp_dir}/#{platf}/#{@name}"
|
171
|
+
tmp_path = "#{@tmp_dir}/#{platf}/#{@name}/#{ruby_ver}"
|
172
|
+
|
173
|
+
# lib_path
|
174
|
+
lib_path = lib_dir
|
169
175
|
|
170
176
|
# create 'native:gem_name' and chain it to 'native' task
|
171
177
|
unless Rake::Task.task_defined?("native:#{@gem_spec.name}:#{platf}")
|
@@ -181,36 +187,31 @@ module Rake
|
|
181
187
|
spec.extensions.clear
|
182
188
|
|
183
189
|
# add the binaries that this task depends on
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
file "#{@lib_dir}/#{File.basename(ext)}" => ["copy:#{File.basename(ext).ext('')}:#{platf}"]
|
190
|
-
end
|
190
|
+
ext_files = []
|
191
|
+
|
192
|
+
# go through native prerequisites and grab the real extension files from there
|
193
|
+
t.prerequisites.each do |ext|
|
194
|
+
ext_files << ext
|
191
195
|
end
|
192
196
|
|
193
197
|
# include the files in the gem specification
|
194
198
|
spec.files += ext_files
|
195
199
|
|
196
|
-
# Make sure that the required ruby version matches the ruby version
|
197
|
-
# we've used for cross compiling:
|
198
|
-
target_version = RUBY_VERSION =~ /^1.8/ ? '1.8.6' : '1.9.0'
|
199
|
-
spec.required_ruby_version = "~> #{target_version}"
|
200
|
-
|
201
200
|
# Generate a package for this gem
|
202
201
|
gem_package = Rake::GemPackageTask.new(spec) do |pkg|
|
203
202
|
pkg.need_zip = false
|
204
203
|
pkg.need_tar = false
|
205
204
|
end
|
206
|
-
|
207
|
-
# ensure the binaries are copied
|
208
|
-
task "#{gem_package.package_dir}/#{gem_package.gem_file}" => ["copy:#{@name}:#{platf}"]
|
209
205
|
end
|
210
206
|
end
|
211
207
|
|
212
208
|
# add binaries to the dependency chain
|
213
|
-
task "native:#{@gem_spec.name}:#{platf}" => ["#{
|
209
|
+
task "native:#{@gem_spec.name}:#{platf}" => ["#{lib_path}/#{binary(platf)}"]
|
210
|
+
|
211
|
+
# ensure the extension get copied
|
212
|
+
unless Rake::Task.task_defined?("#{lib_path}/#{binary(platf)}") then
|
213
|
+
file "#{lib_path}/#{binary(platf)}" => ["copy:#{@name}:#{platf}:#{ruby_ver}"]
|
214
|
+
end
|
214
215
|
|
215
216
|
# Allow segmented packaging by platfrom (open door for 'cross compile')
|
216
217
|
task "native:#{platf}" => ["native:#{@gem_spec.name}:#{platf}"]
|
@@ -224,8 +225,33 @@ module Rake
|
|
224
225
|
end
|
225
226
|
|
226
227
|
def define_cross_platform_tasks(for_platform)
|
228
|
+
if ruby_vers = ENV['RUBY_CC_VERSION']
|
229
|
+
ruby_vers = ENV['RUBY_CC_VERSION'].split(File::PATH_SEPARATOR)
|
230
|
+
else
|
231
|
+
ruby_vers = [RUBY_VERSION]
|
232
|
+
end
|
233
|
+
|
234
|
+
multi = (ruby_vers.size > 1) ? true : false
|
235
|
+
|
236
|
+
ruby_vers.each do |version|
|
237
|
+
# save original lib_dir
|
238
|
+
orig_lib_dir = @lib_dir
|
239
|
+
|
240
|
+
# tweak lib directory only when targeting multiple versions
|
241
|
+
if multi then
|
242
|
+
version =~ /(\d+.\d+)/
|
243
|
+
@lib_dir = "#{@lib_dir}/#{$1}"
|
244
|
+
end
|
245
|
+
|
246
|
+
define_cross_platform_tasks_with_version(for_platform, version)
|
247
|
+
|
248
|
+
# restore lib_dir
|
249
|
+
@lib_dir = orig_lib_dir
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
def define_cross_platform_tasks_with_version(for_platform, ruby_ver)
|
227
254
|
config_path = File.expand_path("~/.rake-compiler/config.yml")
|
228
|
-
ruby_ver = ENV['RUBY_CC_VERSION'] || RUBY_VERSION
|
229
255
|
|
230
256
|
# warn the user about the need of configuration to use cross compilation.
|
231
257
|
unless File.exist?(config_path)
|
@@ -236,24 +262,37 @@ module Rake
|
|
236
262
|
config_file = YAML.load_file(config_path)
|
237
263
|
|
238
264
|
# tmp_path
|
239
|
-
tmp_path = "#{@tmp_dir}/#{for_platform}/#{@name}"
|
265
|
+
tmp_path = "#{@tmp_dir}/#{for_platform}/#{@name}/#{ruby_ver}"
|
266
|
+
|
267
|
+
# lib_path
|
268
|
+
lib_path = lib_dir
|
240
269
|
|
241
270
|
unless rbconfig_file = config_file["rbconfig-#{ruby_ver}"] then
|
242
271
|
warn "no configuration section for specified version of Ruby (rbconfig-#{ruby_ver})"
|
243
272
|
return
|
244
273
|
end
|
245
274
|
|
275
|
+
# mkmf
|
276
|
+
mkmf_file = File.expand_path(File.join(File.dirname(rbconfig_file), '..', 'mkmf.rb'))
|
277
|
+
|
246
278
|
# define compilation tasks for cross platfrom!
|
247
|
-
define_compile_tasks(for_platform)
|
279
|
+
define_compile_tasks(for_platform, ruby_ver)
|
248
280
|
|
249
|
-
# chain fake.rb and
|
250
|
-
file "#{tmp_path}/Makefile" => ["#{tmp_path}/fake.rb",
|
281
|
+
# chain fake.rb, rbconfig.rb and mkmf.rb to Makefile generation
|
282
|
+
file "#{tmp_path}/Makefile" => ["#{tmp_path}/fake.rb",
|
283
|
+
"#{tmp_path}/rbconfig.rb",
|
284
|
+
"#{tmp_path}/mkmf.rb"]
|
251
285
|
|
252
286
|
# copy the file from the cross-ruby location
|
253
287
|
file "#{tmp_path}/rbconfig.rb" => [rbconfig_file] do |t|
|
254
288
|
cp t.prerequisites.first, t.name
|
255
289
|
end
|
256
290
|
|
291
|
+
# copy mkmf from cross-ruby location
|
292
|
+
file "#{tmp_path}/mkmf.rb" => [mkmf_file] do |t|
|
293
|
+
cp t.prerequisites.first, t.name
|
294
|
+
end
|
295
|
+
|
257
296
|
# genearte fake.rb for different ruby versions
|
258
297
|
file "#{tmp_path}/fake.rb" do |t|
|
259
298
|
File.open(t.name, 'w') do |f|
|
@@ -262,7 +301,7 @@ module Rake
|
|
262
301
|
end
|
263
302
|
|
264
303
|
# now define native tasks for cross compiled files
|
265
|
-
define_native_tasks(for_platform) if @gem_spec && @gem_spec.platform == 'ruby'
|
304
|
+
define_native_tasks(for_platform, ruby_ver) if @gem_spec && @gem_spec.platform == 'ruby'
|
266
305
|
|
267
306
|
# create cross task
|
268
307
|
task 'cross' do
|
@@ -274,12 +313,12 @@ module Rake
|
|
274
313
|
|
275
314
|
# clear lib/binary dependencies and trigger cross platform ones
|
276
315
|
# check if lib/binary is defined (damn bundle versus so versus dll)
|
277
|
-
if Rake::Task.task_defined?("#{
|
278
|
-
Rake::Task["#{
|
316
|
+
if Rake::Task.task_defined?("#{lib_path}/#{binary(for_platform)}") then
|
317
|
+
Rake::Task["#{lib_path}/#{binary(for_platform)}"].prerequisites.clear
|
279
318
|
end
|
280
319
|
|
281
320
|
# FIXME: targeting multiple platforms copies the file twice
|
282
|
-
file "#{
|
321
|
+
file "#{lib_path}/#{binary(for_platform)}" => ["copy:#{@name}:#{for_platform}:#{ruby_ver}"]
|
283
322
|
|
284
323
|
# if everything for native task is in place
|
285
324
|
if @gem_spec && @gem_spec.platform == 'ruby' then
|
@@ -110,6 +110,7 @@ describe Rake::ExtensionTask do
|
|
110
110
|
@ext = Rake::ExtensionTask.new('extension_one')
|
111
111
|
@ext_bin = ext_bin('extension_one')
|
112
112
|
@platform = RUBY_PLATFORM
|
113
|
+
@ruby_ver = RUBY_VERSION
|
113
114
|
end
|
114
115
|
|
115
116
|
context 'compile' do
|
@@ -137,46 +138,46 @@ describe Rake::ExtensionTask do
|
|
137
138
|
Rake::Task.task_defined?("lib/#{@ext_bin}").should be_true
|
138
139
|
end
|
139
140
|
|
140
|
-
it "should depend on 'copy:extension_one:{platform}'" do
|
141
|
-
Rake::Task["lib/#{@ext_bin}"].prerequisites.should include("copy:extension_one:#{@platform}")
|
141
|
+
it "should depend on 'copy:extension_one:{platform}:{ruby_ver}'" do
|
142
|
+
Rake::Task["lib/#{@ext_bin}"].prerequisites.should include("copy:extension_one:#{@platform}:#{@ruby_ver}")
|
142
143
|
end
|
143
144
|
end
|
144
145
|
|
145
|
-
context 'tmp/{platform}/extension_one/extension_one.{so,bundle}' do
|
146
|
+
context 'tmp/{platform}/extension_one/{ruby_ver}/extension_one.{so,bundle}' do
|
146
147
|
it 'should define as task' do
|
147
|
-
Rake::Task.task_defined?("tmp/#{@platform}/extension_one/#{@ext_bin}").should be_true
|
148
|
+
Rake::Task.task_defined?("tmp/#{@platform}/extension_one/#{@ruby_ver}/#{@ext_bin}").should be_true
|
148
149
|
end
|
149
150
|
|
150
|
-
it "should depend on 'tmp/{platform}/extension_one/Makefile'" do
|
151
|
-
Rake::Task["tmp/#{@platform}/extension_one/#{@ext_bin}"].prerequisites.should include("tmp/#{@platform}/extension_one/Makefile")
|
151
|
+
it "should depend on 'tmp/{platform}/extension_one/{ruby_ver}/Makefile'" do
|
152
|
+
Rake::Task["tmp/#{@platform}/extension_one/#{@ruby_ver}/#{@ext_bin}"].prerequisites.should include("tmp/#{@platform}/extension_one/#{@ruby_ver}/Makefile")
|
152
153
|
end
|
153
154
|
|
154
155
|
it "should depend on 'ext/extension_one/source.c'" do
|
155
|
-
Rake::Task["tmp/#{@platform}/extension_one/#{@ext_bin}"].prerequisites.should include("ext/extension_one/source.c")
|
156
|
+
Rake::Task["tmp/#{@platform}/extension_one/#{@ruby_ver}/#{@ext_bin}"].prerequisites.should include("ext/extension_one/source.c")
|
156
157
|
end
|
157
158
|
|
158
159
|
it "should not depend on 'ext/extension_one/source.h'" do
|
159
|
-
Rake::Task["tmp/#{@platform}/extension_one/#{@ext_bin}"].prerequisites.should_not include("ext/extension_one/source.h")
|
160
|
+
Rake::Task["tmp/#{@platform}/extension_one/#{@ruby_ver}/#{@ext_bin}"].prerequisites.should_not include("ext/extension_one/source.h")
|
160
161
|
end
|
161
162
|
end
|
162
163
|
|
163
|
-
context 'tmp/{platform}/extension_one/Makefile' do
|
164
|
+
context 'tmp/{platform}/extension_one/{ruby_ver}/Makefile' do
|
164
165
|
it 'should define as task' do
|
165
|
-
Rake::Task.task_defined?("tmp/#{@platform}/extension_one/Makefile").should be_true
|
166
|
+
Rake::Task.task_defined?("tmp/#{@platform}/extension_one/#{@ruby_ver}/Makefile").should be_true
|
166
167
|
end
|
167
168
|
|
168
|
-
it "should depend on 'tmp/{platform}/extension_one'" do
|
169
|
-
Rake::Task["tmp/#{@platform}/extension_one/Makefile"].prerequisites.should include("tmp/#{@platform}/extension_one")
|
169
|
+
it "should depend on 'tmp/{platform}/extension_one/{ruby_ver}'" do
|
170
|
+
Rake::Task["tmp/#{@platform}/extension_one/#{@ruby_ver}/Makefile"].prerequisites.should include("tmp/#{@platform}/extension_one/#{@ruby_ver}")
|
170
171
|
end
|
171
172
|
|
172
173
|
it "should depend on 'ext/extension_one/extconf.rb'" do
|
173
|
-
Rake::Task["tmp/#{@platform}/extension_one/Makefile"].prerequisites.should include("ext/extension_one/extconf.rb")
|
174
|
+
Rake::Task["tmp/#{@platform}/extension_one/#{@ruby_ver}/Makefile"].prerequisites.should include("ext/extension_one/extconf.rb")
|
174
175
|
end
|
175
176
|
end
|
176
177
|
|
177
178
|
context 'clean' do
|
178
|
-
it "should include 'tmp/{platform}/extension_one' in the pattern" do
|
179
|
-
CLEAN.should include("tmp/#{@platform}/extension_one")
|
179
|
+
it "should include 'tmp/{platform}/extension_one/{ruby_ver}' in the pattern" do
|
180
|
+
CLEAN.should include("tmp/#{@platform}/extension_one/#{@ruby_ver}")
|
180
181
|
end
|
181
182
|
end
|
182
183
|
|
@@ -199,11 +200,12 @@ describe Rake::ExtensionTask do
|
|
199
200
|
end
|
200
201
|
@ext_bin = ext_bin('extension_one')
|
201
202
|
@platform = RUBY_PLATFORM
|
203
|
+
@ruby_ver = RUBY_VERSION
|
202
204
|
end
|
203
205
|
|
204
|
-
context 'tmp/{platform}/extension_one/Makefile' do
|
206
|
+
context 'tmp/{platform}/extension_one/{ruby_ver}/Makefile' do
|
205
207
|
it "should depend on 'custom/ext/foo/extconf.rb'" do
|
206
|
-
Rake::Task["tmp/#{@platform}/extension_one/Makefile"].prerequisites.should include("custom/ext/foo/extconf.rb")
|
208
|
+
Rake::Task["tmp/#{@platform}/extension_one/#{@ruby_ver}/Makefile"].prerequisites.should include("custom/ext/foo/extconf.rb")
|
207
209
|
end
|
208
210
|
end
|
209
211
|
end
|
@@ -214,6 +216,7 @@ describe Rake::ExtensionTask do
|
|
214
216
|
@spec = mock_gem_spec
|
215
217
|
@ext_bin = ext_bin('extension_one')
|
216
218
|
@platform = RUBY_PLATFORM
|
219
|
+
@ruby_ver = RUBY_VERSION
|
217
220
|
end
|
218
221
|
|
219
222
|
context 'native' do
|
@@ -246,7 +249,7 @@ describe Rake::ExtensionTask do
|
|
246
249
|
context 'native:my_gem:{platform}' do
|
247
250
|
it 'should depend on binary extension' do
|
248
251
|
Rake::ExtensionTask.new('extension_one', @spec)
|
249
|
-
Rake::Task["native:my_gem:#{@platform}"].prerequisites.should include("
|
252
|
+
Rake::Task["native:my_gem:#{@platform}"].prerequisites.should include("lib/#{@ext_bin}")
|
250
253
|
end
|
251
254
|
end
|
252
255
|
end
|
@@ -307,10 +310,41 @@ describe Rake::ExtensionTask do
|
|
307
310
|
end
|
308
311
|
end
|
309
312
|
|
313
|
+
it 'should allow multiple versions be supplied to RUBY_CC_VERSION' do
|
314
|
+
config = mock(Hash)
|
315
|
+
config.should_receive(:[]).once.with("rbconfig-1.8.6").and_return('/path/to/ruby/1.8.6/rbconfig.rb')
|
316
|
+
config.should_receive(:[]).once.with("rbconfig-1.9.1").and_return('/path/to/ruby/1.9.1/rbconfig.rb')
|
317
|
+
YAML.stub!(:load_file).and_return(config)
|
318
|
+
|
319
|
+
ENV['RUBY_CC_VERSION'] = '1.8.6:1.9.1'
|
320
|
+
Rake::ExtensionTask.new('extension_one') do |ext|
|
321
|
+
ext.cross_compile = true
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
310
325
|
after :each do
|
311
326
|
ENV.delete('RUBY_CC_VERSION')
|
312
327
|
end
|
313
328
|
|
329
|
+
context "(cross compile for multiple versions)" do
|
330
|
+
before :each do
|
331
|
+
config = mock(Hash)
|
332
|
+
config.stub!(:[]).and_return('/path/to/ruby/1.8.6/rbconfig.rb', '/path/to/ruby/1.9.1/rbconfig.rb')
|
333
|
+
YAML.stub!(:load_file).and_return(config)
|
334
|
+
|
335
|
+
ENV['RUBY_CC_VERSION'] = '1.8.6:1.9.1'
|
336
|
+
@ext = Rake::ExtensionTask.new('extension_one') do |ext|
|
337
|
+
ext.cross_compile = true
|
338
|
+
ext.cross_platform = 'universal-unknown'
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
it 'should create specific copy of binaries for each version' do
|
343
|
+
Rake::Task.should have_defined("copy:extension_one:universal-unknown:1.8.6")
|
344
|
+
Rake::Task.should have_defined("copy:extension_one:universal-unknown:1.9.1")
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
314
348
|
context "(cross for 'universal-unknown' platform)" do
|
315
349
|
before :each do
|
316
350
|
@ext = Rake::ExtensionTask.new('extension_one', @spec) do |ext|
|
@@ -321,17 +355,28 @@ describe Rake::ExtensionTask do
|
|
321
355
|
|
322
356
|
context 'fake' do
|
323
357
|
it 'should chain fake task to Makefile generation' do
|
324
|
-
Rake::Task[
|
358
|
+
Rake::Task["tmp/universal-unknown/extension_one/#{@ruby_ver}/Makefile"].prerequisites.should include("tmp/universal-unknown/extension_one/#{@ruby_ver}/fake.rb")
|
325
359
|
end
|
326
360
|
end
|
327
361
|
|
328
362
|
context 'rbconfig' do
|
329
363
|
it 'should chain rbconfig tasks to Makefile generation' do
|
330
|
-
Rake::Task[
|
364
|
+
Rake::Task["tmp/universal-unknown/extension_one/#{@ruby_ver}/Makefile"].prerequisites.should include("tmp/universal-unknown/extension_one/#{@ruby_ver}/rbconfig.rb")
|
331
365
|
end
|
332
366
|
|
333
367
|
it 'should take rbconfig from rake-compiler configuration' do
|
334
|
-
Rake::Task[
|
368
|
+
Rake::Task["tmp/universal-unknown/extension_one/#{@ruby_ver}/rbconfig.rb"].prerequisites.should include(@config_path)
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
context 'mkmf' do
|
373
|
+
it 'should chain mkmf tasks to Makefile generation' do
|
374
|
+
Rake::Task["tmp/universal-unknown/extension_one/#{@ruby_ver}/Makefile"].prerequisites.should include("tmp/universal-unknown/extension_one/#{@ruby_ver}/mkmf.rb")
|
375
|
+
end
|
376
|
+
|
377
|
+
it 'should take mkmf from rake-compiler configuration' do
|
378
|
+
mkmf_path = File.expand_path(File.join(File.dirname(@config_path), '..', 'mkmf.rb'))
|
379
|
+
Rake::Task["tmp/universal-unknown/extension_one/#{@ruby_ver}/mkmf.rb"].prerequisites.should include(mkmf_path)
|
335
380
|
end
|
336
381
|
end
|
337
382
|
|
data/spec/spec_helper.rb
CHANGED
@@ -9,7 +9,12 @@ require 'spec'
|
|
9
9
|
require File.expand_path(File.join(File.dirname(__FILE__), 'support/capture_output_helper'))
|
10
10
|
|
11
11
|
Spec::Runner.configure do |config|
|
12
|
-
config.predicate_matchers[:have_defined] = :task_defined?
|
13
|
-
|
14
12
|
include CaptureOutputHelper
|
15
13
|
end
|
14
|
+
|
15
|
+
# Rake::Task matcher helper
|
16
|
+
Spec::Matchers.define :have_defined do |task|
|
17
|
+
match do |tasks|
|
18
|
+
tasks.task_defined?(task)
|
19
|
+
end
|
20
|
+
end
|
data/tasks/bin/cross-ruby.rake
CHANGED
@@ -30,6 +30,7 @@ require 'rake/extensioncompiler'
|
|
30
30
|
|
31
31
|
USER_HOME = File.expand_path("~/.rake-compiler")
|
32
32
|
RUBY_CC_VERSION = "ruby-#{ENV['VERSION'] || '1.8.6-p287'}"
|
33
|
+
RUBY_SOURCE = ENV['SOURCE']
|
33
34
|
|
34
35
|
# grab the major "1.8" or "1.9" part of the version number
|
35
36
|
MAJOR = RUBY_CC_VERSION.match(/.*-(\d.\d).\d/)[1]
|
@@ -55,13 +56,18 @@ CLOBBER.include("#{USER_HOME}/config.yml")
|
|
55
56
|
file "#{USER_HOME}/sources/#{RUBY_CC_VERSION}.tar.gz" => ["#{USER_HOME}/sources"] do |t|
|
56
57
|
# download the source file using wget or curl
|
57
58
|
chdir File.dirname(t.name) do
|
58
|
-
|
59
|
+
if RUBY_SOURCE
|
60
|
+
url = RUBY_SOURCE
|
61
|
+
else
|
62
|
+
url = "http://ftp.ruby-lang.org/pub/ruby/#{MAJOR}/#{File.basename(t.name)}"
|
63
|
+
end
|
59
64
|
sh "wget #{url} || curl -O #{url}"
|
60
65
|
end
|
61
66
|
end
|
62
67
|
|
63
68
|
# Extract the sources
|
64
|
-
|
69
|
+
source_file = RUBY_SOURCE ? RUBY_SOURCE.split('/').last : "#{RUBY_CC_VERSION}.tar.gz"
|
70
|
+
file "#{USER_HOME}/sources/#{RUBY_CC_VERSION}" => ["#{USER_HOME}/sources/#{source_file}"] do |t|
|
65
71
|
chdir File.dirname(t.name) do
|
66
72
|
t.prerequisites.each { |f| sh "tar xfz #{File.basename(f)}" }
|
67
73
|
end
|
data/tasks/gem.rake
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rake-compiler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luis Lavena
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-07-25 00:00:00 -03:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -51,6 +51,7 @@ files:
|
|
51
51
|
- features/support/env.rb
|
52
52
|
- features/support/file_template_helpers.rb
|
53
53
|
- features/support/generator_helpers.rb
|
54
|
+
- features/support/platform_extension_helpers.rb
|
54
55
|
- bin/rake-compiler
|
55
56
|
- lib/rake/extensioncompiler.rb
|
56
57
|
- lib/rake/extensiontask.rb
|
@@ -98,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
99
|
requirements: []
|
99
100
|
|
100
101
|
rubyforge_project: rake-compiler
|
101
|
-
rubygems_version: 1.3.
|
102
|
+
rubygems_version: 1.3.4
|
102
103
|
signing_key:
|
103
104
|
specification_version: 3
|
104
105
|
summary: Rake-based Ruby C Extension task generator.
|