| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 | From 01fd7364bdcb37ac8709ffa48388b5cbe6478211 Mon Sep 17 00:00:00 2001From: Lars Kanis <lars@greiz-reinsdorf.de>Date: Fri, 10 Jan 2020 23:57:18 +0100Subject: [PATCH] Allow building of cross rubies in parallelRubies can be build like so:  rake-compiler cross-ruby VERSION=2.7.0:2.6.0 HOST=x86_64-w64-mingw32:i686-w64-mingw32This builds the cross product of all ":" separated ruby and host versions.To force sequential builds add option "-j1".--- tasks/bin/cross-ruby.rake | 161 +++++++++++++++++++------------------- 1 file changed, 80 insertions(+), 81 deletions(-)diff --git a/tasks/bin/cross-ruby.rake b/tasks/bin/cross-ruby.rakeindex 278541c..8b88025 100644--- a/tasks/bin/cross-ruby.rake+++ b/tasks/bin/cross-ruby.rake@@ -41,106 +41,105 @@ end require 'rake/extensioncompiler'  MAKE = ENV['MAKE'] || %w[gmake make].find { |c| system("#{c} -v > /dev/null 2>&1") }-USER_HOME = File.expand_path("~/.rake-compiler")-RUBY_CC_VERSION = "ruby-" << ENV.fetch("VERSION", "1.8.7-p371")+USER_HOME = File.realpath(File.expand_path("~/.rake-compiler")) RUBY_SOURCE = ENV['SOURCE'] RUBY_BUILD = RbConfig::CONFIG["host"] -# grab the major "1.8" or "1.9" part of the version number-MAJOR = RUBY_CC_VERSION.match(/.*-(\d.\d).\d/)[1]--# Use Rake::ExtensionCompiler helpers to find the proper host-MINGW_HOST = ENV['HOST'] || Rake::ExtensionCompiler.mingw_host-MINGW_TARGET = MINGW_HOST.gsub('msvc', '')- # Unset any possible variable that might affect compilation ["CC", "CXX", "CPPFLAGS", "LDFLAGS", "RUBYOPT"].each do |var|   ENV.delete(var) end -source_dir = "#{USER_HOME}/sources/#{RUBY_CC_VERSION}"-build_dir = "#{USER_HOME}/builds/#{MINGW_HOST}/#{RUBY_CC_VERSION}"--# define a location where sources will be stored-directory source_dir-directory build_dir--# clean intermediate files and folders-CLEAN.include(source_dir)-CLEAN.include(build_dir)--# remove the final products and sources-CLOBBER.include("#{USER_HOME}/sources")-CLOBBER.include("#{USER_HOME}/builds")-CLOBBER.include("#{USER_HOME}/ruby/#{MINGW_HOST}/#{RUBY_CC_VERSION}")-CLOBBER.include("#{USER_HOME}/config.yml")+RUBY_CC_VERSIONS = ENV.fetch("VERSION", "1.8.7-p371")+RUBY_CC_VERSIONS.split(":").each do |ruby_cc_version|+  ruby_cc_version = "ruby-" + ruby_cc_version+  # grab the major "1.8" or "1.9" part of the version number+  major = ruby_cc_version.match(/.*-(\d.\d).\d/)[1]++  # define a location where sources will be stored+  source_dir = "#{USER_HOME}/sources/#{ruby_cc_version}"+  directory source_dir+  # clean intermediate files and folders+  CLEAN.include(source_dir)++  # remove the final products and sources+  CLOBBER.include("#{USER_HOME}/sources")+  CLOBBER.include("#{USER_HOME}/builds")+  CLOBBER.include("#{USER_HOME}/config.yml")++  # Extract the sources+  source_file = RUBY_SOURCE ? RUBY_SOURCE.split('/').last : "#{ruby_cc_version}.tar.bz2"+  file source_dir => ["#{USER_HOME}/sources/#{source_file}"] do |t|+    t.prerequisites.each { |f| sh "tar xf #{File.basename(f)}", chdir: File.dirname(t.name) }+  end -# ruby source file should be stored there-file "#{USER_HOME}/sources/#{RUBY_CC_VERSION}.tar.bz2" => ["#{USER_HOME}/sources"] do |t|-  # download the source file using wget or curl-  chdir File.dirname(t.name) do+  # ruby source file should be stored there+  file "#{USER_HOME}/sources/#{ruby_cc_version}.tar.bz2" => ["#{USER_HOME}/sources"] do |t|+    # download the source file using wget or curl     if RUBY_SOURCE       url = RUBY_SOURCE     else-      url = "http://cache.ruby-lang.org/pub/ruby/#{MAJOR}/#{File.basename(t.name)}"+      url = "http://cache.ruby-lang.org/pub/ruby/#{major}/#{File.basename(t.name)}"     end-    sh "wget #{url} || curl -O #{url}"+    sh "wget #{url} || curl -O #{url}", chdir: File.dirname(t.name)   end-end--# Extract the sources-source_file = RUBY_SOURCE ? RUBY_SOURCE.split('/').last : "#{RUBY_CC_VERSION}.tar.bz2"-file source_dir => ["#{USER_HOME}/sources/#{source_file}"] do |t|-  chdir File.dirname(t.name) do-    t.prerequisites.each { |f| sh "tar xf #{File.basename(f)}" }-  end-end -task :mingw32 do-  unless MINGW_HOST then-    warn "You need to install mingw32 cross compile functionality to be able to continue."-    warn "Please refer to your distribution/package manager documentation about installation."-    fail-  end-end+  # Create tasks for each host out of the ":" separated hosts list in the HOST variable.+  # These tasks are processed in parallel as dependencies to the "install" task.+  mingw_hosts = ENV['HOST'] || Rake::ExtensionCompiler.mingw_host+  mingw_hosts.split(":").each do |mingw_host|++    # Use Rake::ExtensionCompiler helpers to find the proper host+    mingw_target = mingw_host.gsub('msvc', '')++    # define a location where built files for each host will be stored+    build_dir = "#{USER_HOME}/builds/#{mingw_host}/#{ruby_cc_version}"+    directory build_dir+    install_dir = "#{USER_HOME}/ruby/#{mingw_host}/#{ruby_cc_version}"++    # clean intermediate files and folders+    CLEAN.include(build_dir)+    CLOBBER.include(install_dir)++    task :mingw32 do+      unless mingw_host then+        warn "You need to install mingw32 cross compile functionality to be able to continue."+        warn "Please refer to your distribution/package manager documentation about installation."+        fail+      end+    end -# generate the makefile in a clean build location-file "#{build_dir}/Makefile" => [build_dir, source_dir] do |t|--  options = [-    "--host=#{MINGW_HOST}",-    "--target=#{MINGW_TARGET}",-    "--build=#{RUBY_BUILD}",-    '--enable-shared',-    '--disable-install-doc',-    '--with-ext=',-    'LDFLAGS=-pipe -s',-  ]--  # Force Winsock2 for Ruby 1.8, 1.9 defaults to it-  options << "--with-winsock2" if MAJOR == "1.8"--  chdir File.dirname(t.name) do-    prefix = File.expand_path("../../../ruby/#{MINGW_HOST}/#{RUBY_CC_VERSION}")-    options << "--prefix=#{prefix}"-    sh File.expand_path("../../../sources/#{RUBY_CC_VERSION}/configure"), *options-  end-end+    # generate the makefile in a clean build location+    file "#{build_dir}/Makefile" => [build_dir, source_dir] do |t|++      options = [+        "--host=#{mingw_host}",+        "--target=#{mingw_target}",+        "--build=#{RUBY_BUILD}",+        '--enable-shared',+        '--disable-install-doc',+        '--with-ext=',+        'LDFLAGS=-pipe -s',+      ]++      # Force Winsock2 for Ruby 1.8, 1.9 defaults to it+      options << "--with-winsock2" if major == "1.8"+      options << "--prefix=#{install_dir}"+      sh File.expand_path("#{USER_HOME}/sources/#{ruby_cc_version}/configure"), *options, chdir: File.dirname(t.name)+    end -# make-file "#{build_dir}/ruby.exe" => ["#{build_dir}/Makefile"] do |t|-  chdir File.dirname(t.prerequisites.first) do-    sh MAKE-  end-end+    # make+    file "#{build_dir}/ruby.exe" => ["#{build_dir}/Makefile"] do |t|+      sh MAKE, chdir: File.dirname(t.prerequisites.first)+    end -# make install-file "#{USER_HOME}/ruby/#{MINGW_HOST}/#{RUBY_CC_VERSION}/bin/ruby.exe" => ["#{build_dir}/ruby.exe"] do |t|-  chdir File.dirname(t.prerequisites.first) do-    sh "#{MAKE} install"+    # make install+    file "#{USER_HOME}/ruby/#{mingw_host}/#{ruby_cc_version}/bin/ruby.exe" => ["#{build_dir}/ruby.exe"] do |t|+      sh "#{MAKE} install", chdir: File.dirname(t.prerequisites.first)+    end+    multitask :install => ["#{USER_HOME}/ruby/#{mingw_host}/#{ruby_cc_version}/bin/ruby.exe"]   end end-task :install => ["#{USER_HOME}/ruby/#{MINGW_HOST}/#{RUBY_CC_VERSION}/bin/ruby.exe"]  desc "Update rake-compiler list of installed Ruby versions" task 'update-config' do@@ -187,5 +186,5 @@ task :default do   Rake.application.display_tasks_and_comments end -desc "Build #{RUBY_CC_VERSION} suitable for cross-platform development."+desc "Build rubies suitable for cross-platform development." task 'cross-ruby' => [:mingw32, :install, 'update-config']-- 2.20.1
 |