Update to rake-compiler-dock-1.0

Version 1.0 switches to per-target docker images.
So there is a specific image for x64-mingw32 and one for x86-mingw32.
However our current logic mixes the build process of x86 and x64 behind several non-platform specific rake tasks.
This fails with rcd-1.0 since each image has only x64 OR x86 tools.

The solution in this commit is to separate each task by the platform value and to reference only the needed platform.

As an advantage we can now execute docker builds in parallel for x64 and x86 per multitask.
Since this conflicts with interactive password prompts, the gem signing key can be entered in advance.

rcd-1.0 does stripping of binaries per default, so our manual tasks are needless.
This commit is contained in:
Lars Kanis 2019-12-27 22:19:08 +01:00
parent de577148da
commit c62f5d87d9
6 changed files with 57 additions and 68 deletions

4
.gems
View File

@ -1,6 +1,6 @@
# .gems generated gem export file. Note that any env variable settings will be missing. Append these after using a ';' field separator
rake-compiler -v1.0.6
rake-compiler-dock -v0.7.0
rake-compiler -v1.1.0
rake-compiler-dock -v1.0.0
hoe-deveiate -v0.10.0
hoe-bundler -v1.3.0

View File

@ -5,12 +5,14 @@
source "https://rubygems.org/"
gem "rake-compiler", "~>1.0", :group => [:development, :test]
gem "rake-compiler-dock", "0.7.1", :group => [:development, :test]
gem "hoe-mercurial", "~>1.4", :group => [:development, :test]
gem "hoe-deveiate", "~>0.9", :group => [:development, :test]
gem "hoe-highline", "~>0.2", :group => [:development, :test]
gem "rake-compiler", "~>1.0", :group => [:development, :test]
gem "rake-compiler-dock", "~>1.0", :group => [:development, :test]
gem "hoe-bundler", "~>1.0", :group => [:development, :test]
gem "rspec", "~>3.5", :group => [:development, :test]
gem "rdoc", "~>5.1", :group => [:development, :test]
gem "hoe", "~>3.17", :group => [:development, :test]
gem "hoe", "~>3.20", :group => [:development, :test]
# vim: syntax=ruby

View File

@ -61,7 +61,7 @@ $hoespec = Hoe.spec 'pg' do
self.developer 'Lars Kanis', 'lars@greiz-reinsdorf.de'
self.dependency 'rake-compiler', '~> 1.0', :developer
self.dependency 'rake-compiler-dock', ['~> 0.7.0'], :developer
self.dependency 'rake-compiler-dock', ['~> 1.0'], :developer
self.dependency 'hoe-deveiate', '~> 0.9', :developer
self.dependency 'hoe-bundler', '~> 1.0', :developer
self.dependency 'rspec', '~> 3.5', :developer
@ -129,7 +129,7 @@ Rake::ExtensionTask.new do |ext|
# Add libpq.dll to windows binary gemspec
ext.cross_compiling do |spec|
spec.files << "lib/libpq.dll"
spec.files << "lib/#{spec.platform}/libpq.dll"
end
end

View File

@ -141,9 +141,9 @@ class CrossLibrary < OpenStruct
end
desc "compile static openssl libraries"
task :openssl_libs => [ libssl, libcrypto ]
task "openssl_libs:#{for_platform}" => [ libssl, libcrypto ]
task :compile_static_openssl => openssl_makefile do |t|
task "compile_static_openssl:#{for_platform}" => openssl_makefile do |t|
chdir( static_openssl_builddir ) do
cmd = cmd_prelude.dup
cmd << 'make' << "-j#{NUM_CPUS}" << 'build_libs'
@ -153,12 +153,12 @@ class CrossLibrary < OpenStruct
end
desc "compile static #{libssl}"
file libssl => :compile_static_openssl do |t|
file libssl => "compile_static_openssl:#{for_platform}" do |t|
rm t.name.gsub(/\.a$/, ".dll.a")
end
desc "compile static #{libcrypto}"
file libcrypto => :compile_static_openssl do |t|
file libcrypto => "compile_static_openssl:#{for_platform}" do |t|
rm t.name.gsub(/\.a$/, ".dll.a")
end
@ -189,7 +189,7 @@ class CrossLibrary < OpenStruct
end
# generate the makefile in a clean build location
file postgresql_global_makefile => [ static_postgresql_builddir, :openssl_libs ] do |t|
file postgresql_global_makefile => [ static_postgresql_builddir, "openssl_libs:#{for_platform}" ] do |t|
options = [
"--target=#{host_platform}",
"--host=#{host_platform}",
@ -231,10 +231,10 @@ class CrossLibrary < OpenStruct
#desc 'compile libpg.a'
task :libpq => postgresql_lib
task "native:#{for_platform}" => postgresql_lib
# copy libpq.dll to lib dir
dest_libpq = "lib/#{postgresql_lib.basename}"
dest_libpq = "lib/#{for_platform}/#{postgresql_lib.basename}"
directory File.dirname(dest_libpq)
file dest_libpq => [postgresql_lib, File.dirname(dest_libpq)] do
cp postgresql_lib, dest_libpq
@ -250,7 +250,7 @@ end
if File.exist?(File.expand_path("~/.rake-compiler/config.yml"))
CrossLibraries = [
['i386-mingw32', 'mingw', 'i686-w64-mingw32'],
['x86-mingw32', 'mingw', 'i686-w64-mingw32'],
['x64-mingw32', 'mingw64', 'x86_64-w64-mingw32'],
].map do |platform, openssl_config, toolchain|
CrossLibrary.new platform, openssl_config, toolchain
@ -261,7 +261,7 @@ else
end
desc 'cross compile pg for win32'
task :cross => [ :mingw32, :libpq ]
task :cross => [ :mingw32 ]
task :mingw32 do
# Use Rake::ExtensionCompiler helpers to find the proper host
@ -272,30 +272,25 @@ task :mingw32 do
end
end
# To reduce the gem file size strip mingw32 dlls before packaging
ENV['RUBY_CC_VERSION'].to_s.split(':').each do |ruby_version|
task "tmp/i386-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/pg_ext.so" do |t|
sh "i686-w64-mingw32-strip -S tmp/i386-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/pg_ext.so"
end
task 'gem:windows:prepare' do
require 'io/console'
require 'rake_compiler_dock'
task "tmp/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/pg_ext.so" do |t|
sh "x86_64-w64-mingw32-strip -S tmp/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/pg_ext.so"
end
# Copy gem signing key and certs to be accessable from the docker container
mkdir_p 'build/gem'
sh "cp ~/.gem/gem-*.pem build/gem/ || true"
sh "bundle package"
ENV["GEM_PRIVATE_KEY_PASSPHRASE"] = STDIN.getpass("Enter passphrase of gem signature key: ")
end
desc "Build the windows binary gems"
task 'gem:windows' => ['ChangeLog'] do
require 'rake_compiler_dock'
# Copy gem signing key and certs to be accessable from the docker container
mkdir_p 'build/gem'
sh "cp ~/.gem/gem-*.pem build/gem/ || true"
sh "bundle package"
RakeCompilerDock.sh <<-EOT
mkdir ~/.gem &&
(cp build/gem/gem-*.pem ~/.gem/ || true) &&
bundle install --local &&
rake cross native gem MAKE="make -j`nproc`"
EOT
%w[ x86-mingw32 x64-mingw32 ].each do |platform|
task "gem:windows:#{platform}" => ['ChangeLog', 'gem:windows:prepare'] do
RakeCompilerDock.sh <<-EOT, platform: platform
(cp build/gem/gem-*.pem ~/.gem/ || true) &&
bundle install --local &&
rake native:#{platform} gem MAKE="make -j`nproc`"
EOT
end
desc "Build the windows binary gems"
multitask 'gem:windows' => "gem:windows:#{platform}"
end

View File

@ -22,7 +22,8 @@ rescue LoadError
end
# Temporary add this directory for DLL search, so that libpq.dll can be found.
add_dll_path.call(__dir__) do
# mingw32-platform strings differ (RUBY_PLATFORM=i386-mingw32 vs. x86-mingw32 for rubygems)
add_dll_path.call(File.join(__dir__, RUBY_PLATFORM.gsub(/^i386-/, "x86-"))) do
require "#{major_minor}/pg_ext"
end
else

View File

@ -1,16 +1,17 @@
# -*- encoding: utf-8 -*-
# stub: pg 1.2.0.pre20191218152754 ruby lib
# stub: pg 1.3.0.pre20191227185959 ruby lib
# stub: ext/extconf.rb
Gem::Specification.new do |s|
s.name = "pg".freeze
s.version = "1.2.0.pre20191218152754"
s.version = "1.3.0.pre20191227185959"
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1".freeze) if s.respond_to? :required_rubygems_version=
s.metadata = { "homepage_uri" => "https://github.com/ged/ruby-pg" } if s.respond_to? :metadata=
s.require_paths = ["lib".freeze]
s.authors = ["Michael Granger".freeze, "Lars Kanis".freeze]
s.cert_chain = ["certs/ged.pem".freeze]
s.date = "2019-12-18"
s.date = "2019-12-27"
s.description = "Pg is the Ruby interface to the {PostgreSQL RDBMS}[http://www.postgresql.org/].\n\nIt works with {PostgreSQL 9.2 and later}[http://www.postgresql.org/support/versioning/].\n\nA small example usage:\n\n #!/usr/bin/env ruby\n\n require 'pg'\n\n # Output a table of current connections to the DB\n conn = PG.connect( dbname: 'sales' )\n conn.exec( \"SELECT * FROM pg_stat_activity\" ) do |result|\n puts \" PID | User | Query\"\n result.each do |row|\n puts \" %7d | %-16s | %s \" %\n row.values_at('procpid', 'usename', 'current_query')\n end\n end".freeze
s.email = ["ged@FaerieMUD.org".freeze, "lars@greiz-reinsdorf.de".freeze]
s.extensions = ["ext/extconf.rb".freeze]
@ -20,42 +21,32 @@ Gem::Specification.new do |s|
s.licenses = ["BSD-2-Clause".freeze]
s.rdoc_options = ["--main".freeze, "README.rdoc".freeze]
s.required_ruby_version = Gem::Requirement.new(">= 2.2".freeze)
s.rubygems_version = "3.0.6".freeze
s.rubygems_version = "3.1.2".freeze
s.summary = "Pg is the Ruby interface to the {PostgreSQL RDBMS}[http://www.postgresql.org/]".freeze
if s.respond_to? :specification_version then
s.specification_version = 4
end
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_development_dependency(%q<hoe-mercurial>.freeze, ["~> 1.4"])
s.add_development_dependency(%q<hoe-deveiate>.freeze, ["~> 0.10"])
s.add_development_dependency(%q<hoe-highline>.freeze, ["~> 0.2"])
s.add_development_dependency(%q<rake-compiler>.freeze, ["~> 1.0"])
s.add_development_dependency(%q<rake-compiler-dock>.freeze, ["~> 0.7.0"])
s.add_development_dependency(%q<hoe-bundler>.freeze, ["~> 1.0"])
s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5"])
s.add_development_dependency(%q<rdoc>.freeze, ["~> 5.1"])
s.add_development_dependency(%q<hoe>.freeze, ["~> 3.18"])
else
s.add_dependency(%q<hoe-mercurial>.freeze, ["~> 1.4"])
s.add_dependency(%q<hoe-deveiate>.freeze, ["~> 0.10"])
s.add_dependency(%q<hoe-highline>.freeze, ["~> 0.2"])
s.add_dependency(%q<rake-compiler>.freeze, ["~> 1.0"])
s.add_dependency(%q<rake-compiler-dock>.freeze, ["~> 0.7.0"])
s.add_dependency(%q<hoe-bundler>.freeze, ["~> 1.0"])
s.add_dependency(%q<rspec>.freeze, ["~> 3.5"])
s.add_dependency(%q<rdoc>.freeze, ["~> 5.1"])
s.add_dependency(%q<hoe>.freeze, ["~> 3.18"])
end
if s.respond_to? :add_runtime_dependency then
s.add_development_dependency(%q<hoe-mercurial>.freeze, ["~> 1.4"])
s.add_development_dependency(%q<hoe-deveiate>.freeze, ["~> 0.9"])
s.add_development_dependency(%q<hoe-highline>.freeze, ["~> 0.2"])
s.add_development_dependency(%q<rake-compiler>.freeze, ["~> 1.0"])
s.add_development_dependency(%q<rake-compiler-dock>.freeze, ["~> 1.0"])
s.add_development_dependency(%q<hoe-bundler>.freeze, ["~> 1.0"])
s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5"])
s.add_development_dependency(%q<rdoc>.freeze, ["~> 5.1"])
s.add_development_dependency(%q<hoe>.freeze, ["~> 3.20"])
else
s.add_dependency(%q<hoe-mercurial>.freeze, ["~> 1.4"])
s.add_dependency(%q<hoe-deveiate>.freeze, ["~> 0.10"])
s.add_dependency(%q<hoe-deveiate>.freeze, ["~> 0.9"])
s.add_dependency(%q<hoe-highline>.freeze, ["~> 0.2"])
s.add_dependency(%q<rake-compiler>.freeze, ["~> 1.0"])
s.add_dependency(%q<rake-compiler-dock>.freeze, ["~> 0.7.0"])
s.add_dependency(%q<rake-compiler-dock>.freeze, ["~> 1.0"])
s.add_dependency(%q<hoe-bundler>.freeze, ["~> 1.0"])
s.add_dependency(%q<rspec>.freeze, ["~> 3.5"])
s.add_dependency(%q<rdoc>.freeze, ["~> 5.1"])
s.add_dependency(%q<hoe>.freeze, ["~> 3.18"])
s.add_dependency(%q<hoe>.freeze, ["~> 3.20"])
end
end