From 166800107d24fa41474c1dc0a93df238f16563df Mon Sep 17 00:00:00 2001 From: Luis Lavena Date: Sat, 25 Apr 2009 12:02:17 -0300 Subject: 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. --- features/cross-package-multi.feature | 15 +++++++++++++++ features/step_definitions/compilation.rb | 11 +++++++++++ features/support/file_template_helpers.rb | 10 ++++++++++ features/support/generator_helpers.rb | 15 +++++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 features/cross-package-multi.feature (limited to 'features') 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| -- cgit v1.2.1