summaryrefslogtreecommitdiff
path: root/features
diff options
context:
space:
mode:
authorLuis Lavena <luislavena@gmail.com>2009-04-25 12:02:17 -0300
committerLuis Lavena <luislavena@gmail.com>2009-04-25 12:02:17 -0300
commit166800107d24fa41474c1dc0a93df238f16563df (patch)
tree40cb32fa22e9b8ec74d8abb6a336b446d4dd00b8 /features
parent622336ffab97769a99627f468208b4e79d4f1d7f (diff)
downloadrake-compiler-166800107d24fa41474c1dc0a93df238f16563df.tar.gz
Allow generation of multiple gems for Windows
- This allows build gems for both VC6 and MinGW builts of Ruby. Rake::ExtensionTask.new('my_extension', GEM_SPEC) do |ext| ext.cross_compile = true ext.cross_platform = ['i386-mswin32', 'i386-mingw32'] end This is highly experimental and exposed the need to refactor ExtensionTask internals. Right now it fires the compilation process twice, which is suboptimal.
Diffstat (limited to 'features')
-rw-r--r--features/cross-package-multi.feature15
-rw-r--r--features/step_definitions/compilation.rb11
-rw-r--r--features/support/file_template_helpers.rb10
-rw-r--r--features/support/generator_helpers.rb15
4 files changed, 51 insertions, 0 deletions
diff --git a/features/cross-package-multi.feature b/features/cross-package-multi.feature
new file mode 100644
index 0000000..a40aa33
--- /dev/null
+++ b/features/cross-package-multi.feature
@@ -0,0 +1,15 @@
+Feature: Generate multiple Windows gems from Linux
+
+ In order to keep compatibility with versions of Ruby on Windows
+ As a Gem developer on Linux
+ I want to build binary gems for One-Click Installer (old and new versions)
+
+ Scenario: package multiple gems for Windows
+ Given that my gem source is all in place to target two platforms
+ And I'm running a POSIX operating system
+ And I've installed cross compile toolchain
+ And I've already successfully executed rake task 'cross compile'
+ When rake task 'cross native gem' is invoked
+ Then rake task 'cross native gem' succeeded
+ And gem for platform 'x86-mswin32' get generated
+ And gem for platform 'x86-mingw32' get generated
diff --git a/features/step_definitions/compilation.rb b/features/step_definitions/compilation.rb
index 2056ad9..35e72dd 100644
--- a/features/step_definitions/compilation.rb
+++ b/features/step_definitions/compilation.rb
@@ -8,6 +8,11 @@ Given /^a extension cross-compilable '(.*)'$/ do |extension_name|
generate_source_code_for extension_name
end
+Given /^a extension '(.*)' multi cross\-compilable$/ do |extension_name|
+ generate_multi_cross_compile_extension_task_for extension_name
+ generate_source_code_for extension_name
+end
+
Given /^a extension '(.*)' with forced platform '(.*)'$/ do |extension_name, forced_platform|
generate_extension_task_for extension_name, forced_platform
generate_source_code_for extension_name
@@ -24,6 +29,12 @@ Given /^that my gem source is all in place$/ do
Given "a extension cross-compilable 'extension_one'"
end
+Given /^that my gem source is all in place to target two platforms$/ do
+ Given "a safe project directory"
+ Given "a gem named 'gem_abc'"
+ Given "a extension 'extension_one' multi cross-compilable"
+end
+
Given /^not changed any file since$/ do
# don't do anything, that's the purpose of this step!
end
diff --git a/features/support/file_template_helpers.rb b/features/support/file_template_helpers.rb
index f4ea86c..76bed50 100644
--- a/features/support/file_template_helpers.rb
+++ b/features/support/file_template_helpers.rb
@@ -65,6 +65,16 @@ end
EOF
end
+ def template_rake_extension_multi_cross_compile(extension_name)
+ <<-EOF
+require 'rake/extensiontask'
+Rake::ExtensionTask.new("#{extension_name}", SPEC) do |ext|
+ ext.cross_compile = true
+ ext.cross_platform = ['i386-mswin32', 'i386-mingw32']
+end
+EOF
+ end
+
def template_extconf(extension_name)
<<-EOF
require 'mkmf'
diff --git a/features/support/generator_helpers.rb b/features/support/generator_helpers.rb
index 2910781..c0a8e01 100644
--- a/features/support/generator_helpers.rb
+++ b/features/support/generator_helpers.rb
@@ -60,6 +60,21 @@ module GeneratorHelpers
end
end
+ def generate_multi_cross_compile_extension_task_for(extension_name)
+ # create folder structure
+ FileUtils.mkdir_p "ext/#{extension_name}"
+
+ return if File.exist?("tasks/#{extension_name}.rake")
+
+ # create specific extension rakefile
+ # Building a gem?
+ if File.exist?("tasks/gem.rake") then
+ File.open("tasks/gem.rake", 'a+') do |ext_in_gem|
+ ext_in_gem.puts template_rake_extension_multi_cross_compile(extension_name)
+ end
+ end
+ end
+
def generate_source_code_for(extension_name)
# source C file
File.open("ext/#{extension_name}/source.c", 'w') do |c|