rake-compiler 0.4.1 → 0.5.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 +12 -0
- data/features/cross-package-multi.feature +15 -0
- data/features/step_definitions/compilation.rb +11 -0
- data/features/step_definitions/cross_compilation.rb +10 -1
- data/features/support/{file_templates.rb → file_template_helpers.rb} +36 -22
- data/features/support/generator_helpers.rb +96 -0
- data/lib/rake/extensiontask.rb +30 -13
- data/spec/lib/rake/extensiontask_spec.rb +35 -23
- data/spec/spec_helper.rb +2 -0
- data/tasks/gem.rake +7 -9
- data/tasks/news.rake +2 -0
- metadata +12 -7
- data/features/support/generators.rb +0 -77
data/History.txt
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
=== 0.5.0 / 2009-04-25
|
2
|
+
|
3
|
+
* Enhancements
|
4
|
+
* Allow generation of multiple gems for Windows (EXPERIMENTAL)
|
5
|
+
This allows build gems for both VC6 and MinGW builts of Ruby
|
6
|
+
(Thanks to Jonathan Stott for the suggestion)
|
7
|
+
|
8
|
+
Rake::ExtensionTask.new('my_extension', GEM_SPEC) do |ext|
|
9
|
+
ext.cross_compile = true
|
10
|
+
ext.cross_platform = ['i386-mswin32', 'i386-mingw32']
|
11
|
+
end
|
12
|
+
|
1
13
|
=== 0.4.1 / 2009-04-09
|
2
14
|
|
3
15
|
* Enhancements
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Feature: Generate multiple Windows gems from Linux
|
2
|
+
|
3
|
+
In order to keep compatibility with versions of Ruby on Windows
|
4
|
+
As a Gem developer on Linux
|
5
|
+
I want to build binary gems for One-Click Installer (old and new versions)
|
6
|
+
|
7
|
+
Scenario: package multiple gems for Windows
|
8
|
+
Given that my gem source is all in place to target two platforms
|
9
|
+
And I'm running a POSIX operating system
|
10
|
+
And I've installed cross compile toolchain
|
11
|
+
And I've already successfully executed rake task 'cross compile'
|
12
|
+
When rake task 'cross native gem' is invoked
|
13
|
+
Then rake task 'cross native gem' succeeded
|
14
|
+
And gem for platform 'x86-mswin32' get generated
|
15
|
+
And gem for platform 'x86-mingw32' get generated
|
@@ -8,6 +8,11 @@ Given /^a extension cross-compilable '(.*)'$/ do |extension_name|
|
|
8
8
|
generate_source_code_for extension_name
|
9
9
|
end
|
10
10
|
|
11
|
+
Given /^a extension '(.*)' multi cross\-compilable$/ do |extension_name|
|
12
|
+
generate_multi_cross_compile_extension_task_for extension_name
|
13
|
+
generate_source_code_for extension_name
|
14
|
+
end
|
15
|
+
|
11
16
|
Given /^a extension '(.*)' with forced platform '(.*)'$/ do |extension_name, forced_platform|
|
12
17
|
generate_extension_task_for extension_name, forced_platform
|
13
18
|
generate_source_code_for extension_name
|
@@ -24,6 +29,12 @@ Given /^that my gem source is all in place$/ do
|
|
24
29
|
Given "a extension cross-compilable 'extension_one'"
|
25
30
|
end
|
26
31
|
|
32
|
+
Given /^that my gem source is all in place to target two platforms$/ do
|
33
|
+
Given "a safe project directory"
|
34
|
+
Given "a gem named 'gem_abc'"
|
35
|
+
Given "a extension 'extension_one' multi cross-compilable"
|
36
|
+
end
|
37
|
+
|
27
38
|
Given /^not changed any file since$/ do
|
28
39
|
# don't do anything, that's the purpose of this step!
|
29
40
|
end
|
@@ -17,6 +17,15 @@ Given %r{^I've installed cross compile toolchain$} do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
Then /^binaries for platform '(.*)' get generated$/ do |platform|
|
20
|
-
|
20
|
+
ext = case platform
|
21
|
+
when /darwin/
|
22
|
+
'bundle'
|
23
|
+
when /mingw|mswin|linux/
|
24
|
+
'so'
|
25
|
+
else
|
26
|
+
RbConfig::CONFIG['DLEXT']
|
27
|
+
end
|
28
|
+
|
29
|
+
ext_for_platform = Dir.glob("tmp/#{platform}/**/*.#{ext}")
|
21
30
|
ext_for_platform.should_not be_empty
|
22
31
|
end
|
@@ -1,5 +1,6 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
module FileTemplateHelpers
|
2
|
+
def template_rakefile
|
3
|
+
<<-EOF
|
3
4
|
# add rake-compiler lib dir to the LOAD_PATH
|
4
5
|
$LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), '../..', 'lib'))
|
5
6
|
|
@@ -9,10 +10,10 @@ require 'rake'
|
|
9
10
|
# load rakefile extensions (tasks)
|
10
11
|
Dir['tasks/*.rake'].each { |f| import f }
|
11
12
|
EOF
|
12
|
-
end
|
13
|
+
end
|
13
14
|
|
14
|
-
def template_rake_gemspec(gem_name)
|
15
|
-
<<-EOF
|
15
|
+
def template_rake_gemspec(gem_name)
|
16
|
+
<<-EOF
|
16
17
|
require 'rake/gempackagetask'
|
17
18
|
SPEC = Gem::Specification.new do |s|
|
18
19
|
s.name = "#{gem_name}"
|
@@ -37,52 +38,65 @@ gem_package = Rake::GemPackageTask.new(SPEC) do |pkg|
|
|
37
38
|
pkg.need_tar = false
|
38
39
|
end
|
39
40
|
EOF
|
40
|
-
end
|
41
|
+
end
|
41
42
|
|
42
|
-
def template_rake_extension(extension_name, gem_spec = nil)
|
43
|
-
<<-EOF
|
43
|
+
def template_rake_extension(extension_name, gem_spec = nil)
|
44
|
+
<<-EOF
|
44
45
|
require 'rake/extensiontask'
|
45
46
|
Rake::ExtensionTask.new("#{extension_name}"#{', SPEC' if gem_spec})
|
46
47
|
EOF
|
47
|
-
end
|
48
|
+
end
|
48
49
|
|
49
|
-
def template_rake_extension_with_platform(extension_name, platform)
|
50
|
-
<<-EOF
|
50
|
+
def template_rake_extension_with_platform(extension_name, platform)
|
51
|
+
<<-EOF
|
51
52
|
require 'rake/extensiontask'
|
52
53
|
Rake::ExtensionTask.new("#{extension_name}", SPEC) do |ext|
|
53
54
|
ext.platform = "#{platform}"
|
54
55
|
end
|
55
56
|
EOF
|
56
|
-
end
|
57
|
+
end
|
57
58
|
|
58
|
-
def template_rake_extension_cross_compile(extension_name, gem_spec = nil)
|
59
|
-
<<-EOF
|
59
|
+
def template_rake_extension_cross_compile(extension_name, gem_spec = nil)
|
60
|
+
<<-EOF
|
60
61
|
require 'rake/extensiontask'
|
61
62
|
Rake::ExtensionTask.new("#{extension_name}"#{', SPEC' if gem_spec}) do |ext|
|
62
63
|
ext.cross_compile = true
|
63
64
|
end
|
64
65
|
EOF
|
66
|
+
end
|
67
|
+
|
68
|
+
def template_rake_extension_multi_cross_compile(extension_name)
|
69
|
+
<<-EOF
|
70
|
+
require 'rake/extensiontask'
|
71
|
+
Rake::ExtensionTask.new("#{extension_name}", SPEC) do |ext|
|
72
|
+
ext.cross_compile = true
|
73
|
+
ext.cross_platform = ['i386-mswin32', 'i386-mingw32']
|
65
74
|
end
|
75
|
+
EOF
|
76
|
+
end
|
66
77
|
|
67
|
-
def template_extconf(extension_name)
|
68
|
-
<<-EOF
|
78
|
+
def template_extconf(extension_name)
|
79
|
+
<<-EOF
|
69
80
|
require 'mkmf'
|
70
81
|
create_makefile("#{extension_name}")
|
71
82
|
EOF
|
72
|
-
end
|
83
|
+
end
|
73
84
|
|
74
|
-
def template_source_c(extension_name)
|
75
|
-
<<-EOF
|
85
|
+
def template_source_c(extension_name)
|
86
|
+
<<-EOF
|
76
87
|
#include "source.h"
|
77
88
|
void Init_#{extension_name}()
|
78
89
|
{
|
79
90
|
printf("source.c of extension #{extension_name}\\n");
|
80
91
|
}
|
81
92
|
EOF
|
82
|
-
end
|
93
|
+
end
|
83
94
|
|
84
|
-
def template_source_h
|
85
|
-
<<-EOF
|
95
|
+
def template_source_h
|
96
|
+
<<-EOF
|
86
97
|
#include "ruby.h"
|
87
98
|
EOF
|
99
|
+
end
|
88
100
|
end
|
101
|
+
|
102
|
+
World(FileTemplateHelpers)
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module GeneratorHelpers
|
2
|
+
def generate_scaffold_structure
|
3
|
+
# create folder structure
|
4
|
+
FileUtils.mkdir_p "lib"
|
5
|
+
FileUtils.mkdir_p "tasks"
|
6
|
+
FileUtils.mkdir_p "tmp"
|
7
|
+
|
8
|
+
# create Rakefile loader
|
9
|
+
File.open("Rakefile", 'w') do |rakefile|
|
10
|
+
rakefile.puts template_rakefile.strip
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def generate_gem_task(gem_name)
|
15
|
+
# create generic gem task
|
16
|
+
File.open("tasks/gem.rake", 'w') do |gem_rake|
|
17
|
+
gem_rake.puts template_rake_gemspec(gem_name)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def generate_extension_task_for(extension_name, platform = nil)
|
22
|
+
# create folder structure
|
23
|
+
FileUtils.mkdir_p "ext/#{extension_name}"
|
24
|
+
|
25
|
+
return if File.exist?("tasks/#{extension_name}.rake")
|
26
|
+
|
27
|
+
# Building a gem?
|
28
|
+
if File.exist?("tasks/gem.rake") then
|
29
|
+
File.open("tasks/gem.rake", 'a+') do |ext_in_gem|
|
30
|
+
if platform
|
31
|
+
ext_in_gem.puts template_rake_extension_with_platform(extension_name, platform)
|
32
|
+
else
|
33
|
+
ext_in_gem.puts template_rake_extension(extension_name, true)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
else
|
37
|
+
# create specific extension rakefile
|
38
|
+
File.open("tasks/#{extension_name}.rake", 'w') do |ext_rake|
|
39
|
+
ext_rake.puts template_rake_extension(extension_name)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def generate_cross_compile_extension_task_for(extension_name)
|
45
|
+
# create folder structure
|
46
|
+
FileUtils.mkdir_p "ext/#{extension_name}"
|
47
|
+
|
48
|
+
return if File.exist?("tasks/#{extension_name}.rake")
|
49
|
+
|
50
|
+
# create specific extension rakefile
|
51
|
+
# Building a gem?
|
52
|
+
if File.exist?("tasks/gem.rake") then
|
53
|
+
File.open("tasks/gem.rake", 'a+') do |ext_in_gem|
|
54
|
+
ext_in_gem.puts template_rake_extension_cross_compile(extension_name, true)
|
55
|
+
end
|
56
|
+
else
|
57
|
+
File.open("tasks/#{extension_name}.rake", 'w') do |ext_rake|
|
58
|
+
ext_rake.puts template_rake_extension_cross_compile(extension_name)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def generate_multi_cross_compile_extension_task_for(extension_name)
|
64
|
+
# create folder structure
|
65
|
+
FileUtils.mkdir_p "ext/#{extension_name}"
|
66
|
+
|
67
|
+
return if File.exist?("tasks/#{extension_name}.rake")
|
68
|
+
|
69
|
+
# create specific extension rakefile
|
70
|
+
# Building a gem?
|
71
|
+
if File.exist?("tasks/gem.rake") then
|
72
|
+
File.open("tasks/gem.rake", 'a+') do |ext_in_gem|
|
73
|
+
ext_in_gem.puts template_rake_extension_multi_cross_compile(extension_name)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def generate_source_code_for(extension_name)
|
79
|
+
# source C file
|
80
|
+
File.open("ext/#{extension_name}/source.c", 'w') do |c|
|
81
|
+
c.puts template_source_c(extension_name)
|
82
|
+
end
|
83
|
+
|
84
|
+
# header H file
|
85
|
+
File.open("ext/#{extension_name}/source.h", 'w') do |h|
|
86
|
+
h.puts template_source_h
|
87
|
+
end
|
88
|
+
|
89
|
+
# extconf.rb file
|
90
|
+
File.open("ext/#{extension_name}/extconf.rb", 'w') do |ext|
|
91
|
+
ext.puts template_extconf(extension_name)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
World(GeneratorHelpers)
|
data/lib/rake/extensiontask.rb
CHANGED
@@ -62,8 +62,13 @@ module Rake
|
|
62
62
|
define_native_tasks if @gem_spec && @gem_spec.platform == 'ruby'
|
63
63
|
|
64
64
|
# only define cross platform functionality when enabled
|
65
|
-
|
66
|
-
|
65
|
+
return unless @cross_compile
|
66
|
+
|
67
|
+
if cross_platform.is_a?(Array) then
|
68
|
+
cross_platform.each { |platf| define_cross_platform_tasks(platf) }
|
69
|
+
else
|
70
|
+
define_cross_platform_tasks(cross_platform)
|
71
|
+
end
|
67
72
|
end
|
68
73
|
|
69
74
|
private
|
@@ -218,7 +223,7 @@ module Rake
|
|
218
223
|
end
|
219
224
|
end
|
220
225
|
|
221
|
-
def define_cross_platform_tasks
|
226
|
+
def define_cross_platform_tasks(for_platform)
|
222
227
|
config_path = File.expand_path("~/.rake-compiler/config.yml")
|
223
228
|
ruby_ver = ENV['RUBY_CC_VERSION'] || RUBY_VERSION
|
224
229
|
|
@@ -231,7 +236,7 @@ module Rake
|
|
231
236
|
config_file = YAML.load_file(config_path)
|
232
237
|
|
233
238
|
# tmp_path
|
234
|
-
tmp_path = "#{@tmp_dir}/#{
|
239
|
+
tmp_path = "#{@tmp_dir}/#{for_platform}/#{@name}"
|
235
240
|
|
236
241
|
unless rbconfig_file = config_file["rbconfig-#{ruby_ver}"] then
|
237
242
|
warn "no configuration section for specified version of Ruby (rbconfig-#{ruby_ver})"
|
@@ -239,7 +244,7 @@ module Rake
|
|
239
244
|
end
|
240
245
|
|
241
246
|
# define compilation tasks for cross platfrom!
|
242
|
-
define_compile_tasks(
|
247
|
+
define_compile_tasks(for_platform)
|
243
248
|
|
244
249
|
# chain fake.rb and rbconfig.rb to Makefile generation
|
245
250
|
file "#{tmp_path}/Makefile" => ["#{tmp_path}/fake.rb", "#{tmp_path}/rbconfig.rb"]
|
@@ -257,27 +262,31 @@ module Rake
|
|
257
262
|
end
|
258
263
|
|
259
264
|
# now define native tasks for cross compiled files
|
260
|
-
define_native_tasks(
|
265
|
+
define_native_tasks(for_platform) if @gem_spec && @gem_spec.platform == 'ruby'
|
261
266
|
|
262
267
|
# create cross task
|
263
268
|
task 'cross' do
|
264
269
|
# clear compile dependencies
|
265
|
-
Rake::Task['compile'].prerequisites.
|
270
|
+
Rake::Task['compile'].prerequisites.reject! { |t| !compiles_cross_platform.include?(t) }
|
266
271
|
|
267
272
|
# chain the cross platform ones
|
268
|
-
task 'compile' => ["compile:#{
|
273
|
+
task 'compile' => ["compile:#{for_platform}"]
|
269
274
|
|
270
275
|
# clear lib/binary dependencies and trigger cross platform ones
|
271
276
|
# check if lib/binary is defined (damn bundle versus so versus dll)
|
272
|
-
if Rake::Task.task_defined?("#{@lib_dir}/#{binary(
|
273
|
-
Rake::Task["#{@lib_dir}/#{binary(
|
277
|
+
if Rake::Task.task_defined?("#{@lib_dir}/#{binary(for_platform)}") then
|
278
|
+
Rake::Task["#{@lib_dir}/#{binary(for_platform)}"].prerequisites.clear
|
274
279
|
end
|
275
|
-
|
280
|
+
|
281
|
+
# FIXME: targeting multiple platforms copies the file twice
|
282
|
+
file "#{@lib_dir}/#{binary(for_platform)}" => ["copy:#{@name}:#{for_platform}"]
|
276
283
|
|
277
284
|
# if everything for native task is in place
|
278
285
|
if @gem_spec && @gem_spec.platform == 'ruby' then
|
279
|
-
|
280
|
-
|
286
|
+
# double check: only cross platform native tasks should be here
|
287
|
+
# FIXME: Sooo brittle
|
288
|
+
Rake::Task['native'].prerequisites.reject! { |t| !natives_cross_platform.include?(t) }
|
289
|
+
task 'native' => ["native:#{for_platform}"]
|
281
290
|
end
|
282
291
|
end
|
283
292
|
end
|
@@ -306,6 +315,14 @@ module Rake
|
|
306
315
|
@source_files ||= FileList["#{@ext_dir}/#{@source_pattern}"]
|
307
316
|
end
|
308
317
|
|
318
|
+
def compiles_cross_platform
|
319
|
+
[*@cross_platform].map { |p| "compile:#{p}" }
|
320
|
+
end
|
321
|
+
|
322
|
+
def natives_cross_platform
|
323
|
+
[*@cross_platform].map { |p| "native:#{p}" }
|
324
|
+
end
|
325
|
+
|
309
326
|
def fake_rb(version)
|
310
327
|
<<-FAKE_RB
|
311
328
|
class Object
|
@@ -4,8 +4,8 @@ require 'rake/extensiontask'
|
|
4
4
|
require 'rbconfig'
|
5
5
|
|
6
6
|
describe Rake::ExtensionTask do
|
7
|
-
|
8
|
-
|
7
|
+
context '#new' do
|
8
|
+
context '(basic)' do
|
9
9
|
it 'should raise an error if no name is provided' do
|
10
10
|
lambda {
|
11
11
|
Rake::ExtensionTask.new
|
@@ -55,7 +55,7 @@ describe Rake::ExtensionTask do
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
|
58
|
+
context '(defaults)' do
|
59
59
|
before :each do
|
60
60
|
@ext = Rake::ExtensionTask.new('extension_one')
|
61
61
|
end
|
@@ -97,14 +97,14 @@ describe Rake::ExtensionTask do
|
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
100
|
-
|
100
|
+
context '(tasks)' do
|
101
101
|
before :each do
|
102
102
|
Rake.application.clear
|
103
103
|
CLEAN.clear
|
104
104
|
CLOBBER.clear
|
105
105
|
end
|
106
106
|
|
107
|
-
|
107
|
+
context '(one extension)' do
|
108
108
|
before :each do
|
109
109
|
Rake::FileList.stub!(:[]).and_return(["ext/extension_one/source.c"])
|
110
110
|
@ext = Rake::ExtensionTask.new('extension_one')
|
@@ -112,7 +112,7 @@ describe Rake::ExtensionTask do
|
|
112
112
|
@platform = RUBY_PLATFORM
|
113
113
|
end
|
114
114
|
|
115
|
-
|
115
|
+
context 'compile' do
|
116
116
|
it 'should define as task' do
|
117
117
|
Rake::Task.task_defined?('compile').should be_true
|
118
118
|
end
|
@@ -122,7 +122,7 @@ describe Rake::ExtensionTask do
|
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
125
|
-
|
125
|
+
context 'compile:extension_one' do
|
126
126
|
it 'should define as task' do
|
127
127
|
Rake::Task.task_defined?('compile:extension_one').should be_true
|
128
128
|
end
|
@@ -132,7 +132,7 @@ describe Rake::ExtensionTask do
|
|
132
132
|
end
|
133
133
|
end
|
134
134
|
|
135
|
-
|
135
|
+
context 'lib/extension_one.{so,bundle}' do
|
136
136
|
it 'should define as task' do
|
137
137
|
Rake::Task.task_defined?("lib/#{@ext_bin}").should be_true
|
138
138
|
end
|
@@ -142,7 +142,7 @@ describe Rake::ExtensionTask do
|
|
142
142
|
end
|
143
143
|
end
|
144
144
|
|
145
|
-
|
145
|
+
context 'tmp/{platform}/extension_one/extension_one.{so,bundle}' do
|
146
146
|
it 'should define as task' do
|
147
147
|
Rake::Task.task_defined?("tmp/#{@platform}/extension_one/#{@ext_bin}").should be_true
|
148
148
|
end
|
@@ -160,7 +160,7 @@ describe Rake::ExtensionTask do
|
|
160
160
|
end
|
161
161
|
end
|
162
162
|
|
163
|
-
|
163
|
+
context 'tmp/{platform}/extension_one/Makefile' do
|
164
164
|
it 'should define as task' do
|
165
165
|
Rake::Task.task_defined?("tmp/#{@platform}/extension_one/Makefile").should be_true
|
166
166
|
end
|
@@ -174,13 +174,13 @@ describe Rake::ExtensionTask do
|
|
174
174
|
end
|
175
175
|
end
|
176
176
|
|
177
|
-
|
177
|
+
context 'clean' do
|
178
178
|
it "should include 'tmp/{platform}/extension_one' in the pattern" do
|
179
179
|
CLEAN.should include("tmp/#{@platform}/extension_one")
|
180
180
|
end
|
181
181
|
end
|
182
182
|
|
183
|
-
|
183
|
+
context 'clobber' do
|
184
184
|
it "should include 'lib/extension_one.{so,bundle}'" do
|
185
185
|
CLOBBER.should include("lib/#{@ext_bin}")
|
186
186
|
end
|
@@ -191,7 +191,7 @@ describe Rake::ExtensionTask do
|
|
191
191
|
end
|
192
192
|
end
|
193
193
|
|
194
|
-
|
194
|
+
context '(extension in custom location)' do
|
195
195
|
before :each do
|
196
196
|
Rake::FileList.stub!(:[]).and_return(["ext/extension_one/source.c"])
|
197
197
|
@ext = Rake::ExtensionTask.new('extension_one') do |ext|
|
@@ -201,14 +201,14 @@ describe Rake::ExtensionTask do
|
|
201
201
|
@platform = RUBY_PLATFORM
|
202
202
|
end
|
203
203
|
|
204
|
-
|
204
|
+
context 'tmp/{platform}/extension_one/Makefile' do
|
205
205
|
it "should depend on 'custom/ext/foo/extconf.rb'" do
|
206
206
|
Rake::Task["tmp/#{@platform}/extension_one/Makefile"].prerequisites.should include("custom/ext/foo/extconf.rb")
|
207
207
|
end
|
208
208
|
end
|
209
209
|
end
|
210
210
|
|
211
|
-
|
211
|
+
context '(native tasks)' do
|
212
212
|
before :each do
|
213
213
|
Rake::FileList.stub!(:[]).and_return(["ext/extension_one/source.c"])
|
214
214
|
@spec = mock_gem_spec
|
@@ -216,7 +216,7 @@ describe Rake::ExtensionTask do
|
|
216
216
|
@platform = RUBY_PLATFORM
|
217
217
|
end
|
218
218
|
|
219
|
-
|
219
|
+
context 'native' do
|
220
220
|
before :each do
|
221
221
|
@spec.stub!(:platform=).and_return('ruby')
|
222
222
|
end
|
@@ -243,7 +243,7 @@ describe Rake::ExtensionTask do
|
|
243
243
|
Rake::Task["native"].prerequisites.should include("native:#{@platform}")
|
244
244
|
end
|
245
245
|
|
246
|
-
|
246
|
+
context 'native:my_gem:{platform}' do
|
247
247
|
it 'should depend on binary extension' do
|
248
248
|
Rake::ExtensionTask.new('extension_one', @spec)
|
249
249
|
Rake::Task["native:my_gem:#{@platform}"].prerequisites.should include("tmp/#{@platform}/extension_one/#{@ext_bin}")
|
@@ -252,7 +252,7 @@ describe Rake::ExtensionTask do
|
|
252
252
|
end
|
253
253
|
end
|
254
254
|
|
255
|
-
|
255
|
+
context '(cross platform tasks)' do
|
256
256
|
before :each do
|
257
257
|
File.stub!(:exist?).and_return(true)
|
258
258
|
YAML.stub!(:load_file).and_return(mock_config_yml)
|
@@ -311,7 +311,7 @@ describe Rake::ExtensionTask do
|
|
311
311
|
ENV.delete('RUBY_CC_VERSION')
|
312
312
|
end
|
313
313
|
|
314
|
-
|
314
|
+
context "(cross for 'universal-unknown' platform)" do
|
315
315
|
before :each do
|
316
316
|
@ext = Rake::ExtensionTask.new('extension_one', @spec) do |ext|
|
317
317
|
ext.cross_compile = true
|
@@ -319,13 +319,13 @@ describe Rake::ExtensionTask do
|
|
319
319
|
end
|
320
320
|
end
|
321
321
|
|
322
|
-
|
322
|
+
context 'fake' do
|
323
323
|
it 'should chain fake task to Makefile generation' do
|
324
324
|
Rake::Task['tmp/universal-unknown/extension_one/Makefile'].prerequisites.should include('tmp/universal-unknown/extension_one/fake.rb')
|
325
325
|
end
|
326
326
|
end
|
327
327
|
|
328
|
-
|
328
|
+
context 'rbconfig' do
|
329
329
|
it 'should chain rbconfig tasks to Makefile generation' do
|
330
330
|
Rake::Task['tmp/universal-unknown/extension_one/Makefile'].prerequisites.should include('tmp/universal-unknown/extension_one/rbconfig.rb')
|
331
331
|
end
|
@@ -335,7 +335,7 @@ describe Rake::ExtensionTask do
|
|
335
335
|
end
|
336
336
|
end
|
337
337
|
|
338
|
-
|
338
|
+
context 'compile:universal-unknown' do
|
339
339
|
it "should be defined" do
|
340
340
|
Rake::Task.task_defined?('compile:universal-unknown').should be_true
|
341
341
|
end
|
@@ -345,7 +345,7 @@ describe Rake::ExtensionTask do
|
|
345
345
|
end
|
346
346
|
end
|
347
347
|
|
348
|
-
|
348
|
+
context 'native:universal-unknown' do
|
349
349
|
it "should be defined" do
|
350
350
|
Rake::Task.task_defined?('native:universal-unknown').should be_true
|
351
351
|
end
|
@@ -355,6 +355,18 @@ describe Rake::ExtensionTask do
|
|
355
355
|
end
|
356
356
|
end
|
357
357
|
end
|
358
|
+
|
359
|
+
context '(cross for multiple platforms)' do
|
360
|
+
it 'should define task for each supplied platform' do
|
361
|
+
@ext = Rake::ExtensionTask.new('extension_one', @spec) do |ext|
|
362
|
+
ext.cross_compile = true
|
363
|
+
ext.cross_platform = ['universal-known', 'universal-unknown']
|
364
|
+
end
|
365
|
+
|
366
|
+
Rake::Task.should have_defined('compile:universal-known')
|
367
|
+
Rake::Task.should have_defined('compile:universal-unknown')
|
368
|
+
end
|
369
|
+
end
|
358
370
|
end
|
359
371
|
end
|
360
372
|
|
data/spec/spec_helper.rb
CHANGED
data/tasks/gem.rake
CHANGED
@@ -1,17 +1,14 @@
|
|
1
|
-
require '
|
1
|
+
require 'rubygems/package_task'
|
2
2
|
|
3
3
|
GEM_SPEC = Gem::Specification.new do |s|
|
4
4
|
# basic information
|
5
5
|
s.name = "rake-compiler"
|
6
|
-
s.version = "0.
|
6
|
+
s.version = "0.5.0"
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
8
|
|
9
9
|
# description and details
|
10
10
|
s.summary = 'Rake-based Ruby C Extension task generator.'
|
11
|
-
s.description =
|
12
|
-
Provide a standard and simplified way to build and package
|
13
|
-
Ruby C extensions using Rake as glue.
|
14
|
-
EOF
|
11
|
+
s.description = "Provide a standard and simplified way to build and package\nRuby C extensions using Rake as glue."
|
15
12
|
|
16
13
|
# dependencies
|
17
14
|
s.add_dependency 'rake', '>= 0.8.3', '< 0.9'
|
@@ -39,21 +36,22 @@ GEM_SPEC = Gem::Specification.new do |s|
|
|
39
36
|
# project information
|
40
37
|
s.homepage = 'http://github.com/luislavena/rake-compiler'
|
41
38
|
s.rubyforge_project = 'rake-compiler'
|
39
|
+
s.licenses = ['MIT']
|
42
40
|
|
43
41
|
# author and contributors
|
44
42
|
s.author = 'Luis Lavena'
|
45
43
|
s.email = 'luislavena@gmail.com'
|
46
44
|
end
|
47
45
|
|
48
|
-
gem_package =
|
46
|
+
gem_package = Gem::PackageTask.new(GEM_SPEC) do |pkg|
|
49
47
|
pkg.need_tar = false
|
50
48
|
pkg.need_zip = false
|
51
49
|
end
|
52
50
|
|
53
|
-
file
|
51
|
+
file "#{GEM_SPEC.name}.gemspec" => ['Rakefile', 'tasks/gem.rake'] do |t|
|
54
52
|
puts "Generating #{t.name}"
|
55
53
|
File.open(t.name, 'w') { |f| f.puts GEM_SPEC.to_yaml }
|
56
54
|
end
|
57
55
|
|
58
56
|
desc "Generate or update the standalone gemspec file for the project"
|
59
|
-
task :gemspec => [
|
57
|
+
task :gemspec => ["#{GEM_SPEC.name}.gemspec"]
|
data/tasks/news.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.5.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-04-
|
12
|
+
date: 2009-04-25 00:00:00 -03:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -25,7 +25,9 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: "0.9"
|
27
27
|
version:
|
28
|
-
description:
|
28
|
+
description: |-
|
29
|
+
Provide a standard and simplified way to build and package
|
30
|
+
Ruby C extensions using Rake as glue.
|
29
31
|
email: luislavena@gmail.com
|
30
32
|
executables:
|
31
33
|
- rake-compiler
|
@@ -38,6 +40,7 @@ extra_rdoc_files:
|
|
38
40
|
files:
|
39
41
|
- features/compile.feature
|
40
42
|
- features/cross-compile.feature
|
43
|
+
- features/cross-package-multi.feature
|
41
44
|
- features/cross-package.feature
|
42
45
|
- features/package.feature
|
43
46
|
- features/step_definitions/compilation.rb
|
@@ -46,8 +49,8 @@ files:
|
|
46
49
|
- features/step_definitions/folders.rb
|
47
50
|
- features/step_definitions/gem.rb
|
48
51
|
- features/support/env.rb
|
49
|
-
- features/support/
|
50
|
-
- features/support/
|
52
|
+
- features/support/file_template_helpers.rb
|
53
|
+
- features/support/generator_helpers.rb
|
51
54
|
- bin/rake-compiler
|
52
55
|
- lib/rake/extensioncompiler.rb
|
53
56
|
- lib/rake/extensiontask.rb
|
@@ -70,6 +73,8 @@ files:
|
|
70
73
|
- cucumber.yml
|
71
74
|
has_rdoc: true
|
72
75
|
homepage: http://github.com/luislavena/rake-compiler
|
76
|
+
licenses:
|
77
|
+
- MIT
|
73
78
|
post_install_message:
|
74
79
|
rdoc_options:
|
75
80
|
- --main
|
@@ -93,9 +98,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
98
|
requirements: []
|
94
99
|
|
95
100
|
rubyforge_project: rake-compiler
|
96
|
-
rubygems_version: 1.3.
|
101
|
+
rubygems_version: 1.3.2
|
97
102
|
signing_key:
|
98
|
-
specification_version:
|
103
|
+
specification_version: 3
|
99
104
|
summary: Rake-based Ruby C Extension task generator.
|
100
105
|
test_files: []
|
101
106
|
|
@@ -1,77 +0,0 @@
|
|
1
|
-
def generate_scaffold_structure
|
2
|
-
# create folder structure
|
3
|
-
FileUtils.mkdir_p "lib"
|
4
|
-
FileUtils.mkdir_p "tasks"
|
5
|
-
FileUtils.mkdir_p "tmp"
|
6
|
-
|
7
|
-
# create Rakefile loader
|
8
|
-
File.open("Rakefile", 'w') do |rakefile|
|
9
|
-
rakefile.puts template_rakefile.strip
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def generate_gem_task(gem_name)
|
14
|
-
# create generic gem task
|
15
|
-
File.open("tasks/gem.rake", 'w') do |gem_rake|
|
16
|
-
gem_rake.puts template_rake_gemspec(gem_name)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def generate_extension_task_for(extension_name, platform = nil)
|
21
|
-
# create folder structure
|
22
|
-
FileUtils.mkdir_p "ext/#{extension_name}"
|
23
|
-
|
24
|
-
return if File.exist?("tasks/#{extension_name}.rake")
|
25
|
-
|
26
|
-
# Building a gem?
|
27
|
-
if File.exist?("tasks/gem.rake") then
|
28
|
-
File.open("tasks/gem.rake", 'a+') do |ext_in_gem|
|
29
|
-
if platform
|
30
|
-
ext_in_gem.puts template_rake_extension_with_platform(extension_name, platform)
|
31
|
-
else
|
32
|
-
ext_in_gem.puts template_rake_extension(extension_name, true)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
else
|
36
|
-
# create specific extension rakefile
|
37
|
-
File.open("tasks/#{extension_name}.rake", 'w') do |ext_rake|
|
38
|
-
ext_rake.puts template_rake_extension(extension_name)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def generate_cross_compile_extension_task_for(extension_name)
|
44
|
-
# create folder structure
|
45
|
-
FileUtils.mkdir_p "ext/#{extension_name}"
|
46
|
-
|
47
|
-
return if File.exist?("tasks/#{extension_name}.rake")
|
48
|
-
|
49
|
-
# create specific extension rakefile
|
50
|
-
# Building a gem?
|
51
|
-
if File.exist?("tasks/gem.rake") then
|
52
|
-
File.open("tasks/gem.rake", 'a+') do |ext_in_gem|
|
53
|
-
ext_in_gem.puts template_rake_extension_cross_compile(extension_name, true)
|
54
|
-
end
|
55
|
-
else
|
56
|
-
File.open("tasks/#{extension_name}.rake", 'w') do |ext_rake|
|
57
|
-
ext_rake.puts template_rake_extension_cross_compile(extension_name)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def generate_source_code_for(extension_name)
|
63
|
-
# source C file
|
64
|
-
File.open("ext/#{extension_name}/source.c", 'w') do |c|
|
65
|
-
c.puts template_source_c(extension_name)
|
66
|
-
end
|
67
|
-
|
68
|
-
# header H file
|
69
|
-
File.open("ext/#{extension_name}/source.h", 'w') do |h|
|
70
|
-
h.puts template_source_h
|
71
|
-
end
|
72
|
-
|
73
|
-
# extconf.rb file
|
74
|
-
File.open("ext/#{extension_name}/extconf.rb", 'w') do |ext|
|
75
|
-
ext.puts template_extconf(extension_name)
|
76
|
-
end
|
77
|
-
end
|