@@ -5,37 +5,19 @@ require 'rake/extensiontask'
5
5
require 'rake/clean'
6
6
require 'rdoc/task'
7
7
require 'benchmark'
8
+ require 'rake_compiler_dock'
8
9
10
+ CLEAN . add ( "{ext,lib}/**/*.{o,so}" , "pkg" )
9
11
10
- CLEAN . include (
11
- "tmp" ,
12
- "lib/2.0" ,
13
- "lib/2.1" ,
14
- "lib/2.2" ,
15
- "lib/2.3" ,
16
- "lib/2.4" ,
17
- "lib/2.5" ,
18
- "lib/2.6" ,
19
- "lib/2.7" ,
20
- "lib/3.0" ,
21
- "lib/bcrypt_pbkdf_ext.so"
22
- )
23
- CLOBBER . include (
24
- "doc" ,
25
- "pkg"
26
- )
27
-
28
- task 'gem:windows' do
29
- require 'rake_compiler_dock'
30
- sh "bundle package --all" # Avoid repeated downloads of gems by using gem files from the host.
31
- RakeCompilerDock . sh "bundle && rake cross native gem RUBY_CC_VERSION=3.0.0:2.7.0"
32
- end
33
-
34
- task 'gem:windows:release' do
35
- version = Gem ::Specification ::load ( "bcrypt_pbkdf.gemspec" ) . version
36
- sh "gem push pkg/bcrypt_pbkdf-#{ version } -x86-mingw32.gem"
37
- sh "gem push pkg/bcrypt_pbkdf-#{ version } -x64-mingw32.gem"
38
- end
12
+ cross_rubies = [ "3.3.0" , "3.2.0" , "3.1.0" , "3.0.0" , "2.7.0" ]
13
+ cross_platforms = [
14
+ "arm64-darwin" ,
15
+ "x64-mingw-ucrt" ,
16
+ "x64-mingw32" ,
17
+ "x86-mingw32" ,
18
+ "x86_64-darwin" ,
19
+ ]
20
+ ENV [ "RUBY_CC_VERSION" ] = cross_rubies . join ( ":" )
39
21
40
22
GEMSPEC = Gem ::Specification . load ( "bcrypt_pbkdf.gemspec" )
41
23
@@ -59,13 +41,53 @@ RDoc::Task.new do |rdoc|
59
41
rdoc . rdoc_files . include ( *GEMSPEC . extra_rdoc_files )
60
42
end
61
43
62
- Gem ::PackageTask . new ( GEMSPEC ) do |pkg |
63
- pkg . need_zip = true
64
- pkg . need_tar = true
65
- end
66
-
67
44
Rake ::ExtensionTask . new ( "bcrypt_pbkdf_ext" , GEMSPEC ) do |ext |
68
45
ext . ext_dir = 'ext/mri'
69
46
ext . cross_compile = true
70
- ext . cross_platform = [ 'x86-mingw32' , 'x64-mingw32' ]
47
+ ext . cross_platform = cross_platforms
48
+ ext . cross_config_options << "--enable-cross-build" # so extconf.rb knows we're cross-compiling
49
+ end
50
+
51
+ namespace "gem" do
52
+ cross_platforms . each do |platform |
53
+ desc "build native gem for #{ platform } "
54
+ task platform do
55
+ RakeCompilerDock . sh ( <<~EOF , platform : platform , verbose : true )
56
+ gem install bundler --no-document &&
57
+ BUNDLE_IGNORE_CONFIG=1 BUNDLE_PATH=.bundle/#{ platform } bundle &&
58
+ BUNDLE_IGNORE_CONFIG=1 BUNDLE_PATH=.bundle/#{ platform } bundle exec rake gem:#{ platform } :buildit
59
+ EOF
60
+ end
61
+
62
+ namespace platform do
63
+ # this runs in the rake-compiler-dock docker container
64
+ task "buildit" do
65
+ # use Task#invoke because the pkg/*gem task is defined at runtime
66
+ Rake ::Task [ "native:#{ platform } " ] . invoke
67
+ Rake ::Task [ "pkg/#{ GEMSPEC . full_name } -#{ Gem ::Platform . new ( platform ) } .gem" ] . invoke
68
+ end
69
+
70
+ task "release" do
71
+ sh "gem push pkg/#{ GEMSPEC . full_name } -#{ Gem ::Platform . new ( platform ) } .gem"
72
+ end
73
+ end
74
+ end
75
+
76
+ desc "build native gem for all platforms"
77
+ task "all" do
78
+ cross_platforms . each do |platform |
79
+ Rake ::Task [ "gem:#{ platform } " ] . invoke
80
+ end
81
+ end
82
+
83
+ desc "release native gem for all platforms"
84
+ task "release" do
85
+ cross_platforms . each do |platform |
86
+ Rake ::Task [ "gem:#{ platform } :release" ] . invoke
87
+ end
88
+ end
71
89
end
90
+
91
+ task "package" => cross_platforms . map { |p | "gem:#{ p } " } # "package" task for all the native platforms
92
+
93
+ Rake ::Task [ "package" ] . prerequisites . prepend ( "compile" )
0 commit comments