mini_portile2 2.8.3 → 2.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 51973caa0015d6919e11d6e081cec2e26f146cf329e5f2ec9b34b97e1485d13a
4
- data.tar.gz: e5a8eeb01caa0e047ba7d0c75e19e726b18aa8af4fa6fc89e40367671d8bc919
3
+ metadata.gz: 999335cad76fefd8e0ec313bb0bd7260a0259ef37760a01ee34153754ea2661f
4
+ data.tar.gz: 472586aad90ab8c61df7fffd60f6507206d3900fb71d505edef100ceef6e7e2f
5
5
  SHA512:
6
- metadata.gz: 7711d008192576bddd38a396a372581cfff4e6e2ec48c95ac669c61db470bad9a9e508cf314ab6fa859069477262c1c8c7d30beb043d3ce6a571c80351ef0e79
7
- data.tar.gz: 553bc5519d22489492ee5eb16c80048731523a1cf45e8f7eb3c2f5a29de9b0a61bfa350894cbd0a82a769c6972ddd1083deb379b262f53ea9092a6e4abb910cd
6
+ metadata.gz: c978de2664efdee0bd9b89a842d33844c7ab6ee5d9dce45baaa53e061ab04777fcfb0ecc4900b772e4a2cf64c80c615b727d1227f9d09e223e30834f1dbf5ddc
7
+ data.tar.gz: 58a18c5ee2c34ab370dd0d30449aa2bf06e40d7e070ab1bd5e8fcf4226e8e390516718b2b6aed0e17ee3736aa04eea45917cee53a5a1b117b78ffcb12dc4bfd3
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  ## mini_portile changelog
2
2
 
3
+ ### 2.8.4 / 2023-07-18
4
+
5
+ - cmake: set CMAKE compile flags to configure cross-compilation similarly to `autotools` `--host` flag: `SYSTEM_NAME`, `SYSTEM_PROCESSOR`, `C_COMPILER`, and `CXX_COMPILER`. [#130] (Thanks, @stanhu!)
6
+
7
+
3
8
  ### 2.8.3 / 2023-07-18
4
9
 
5
10
  #### Fixed
@@ -35,17 +35,45 @@ class MiniPortile
35
35
  attr_accessor :host, :files, :patch_files, :target, :logger, :source_directory
36
36
 
37
37
  def self.windows?
38
- RbConfig::CONFIG['target_os'] =~ /mswin|mingw/
38
+ target_os =~ /mswin|mingw/
39
39
  end
40
40
 
41
41
  # GNU MinGW compiled Ruby?
42
42
  def self.mingw?
43
- RbConfig::CONFIG['target_os'] =~ /mingw/
43
+ target_os =~ /mingw/
44
44
  end
45
45
 
46
46
  # MS Visual-C compiled Ruby?
47
47
  def self.mswin?
48
- RbConfig::CONFIG['target_os'] =~ /mswin/
48
+ target_os =~ /mswin/
49
+ end
50
+
51
+ def self.darwin?
52
+ target_os =~ /darwin/
53
+ end
54
+
55
+ def self.freebsd?
56
+ target_os =~ /freebsd/
57
+ end
58
+
59
+ def self.openbsd?
60
+ target_os =~ /openbsd/
61
+ end
62
+
63
+ def self.linux?
64
+ target_os =~ /linux/
65
+ end
66
+
67
+ def self.solaris?
68
+ target_os =~ /solaris/
69
+ end
70
+
71
+ def self.target_os
72
+ RbConfig::CONFIG['target_os']
73
+ end
74
+
75
+ def self.target_cpu
76
+ RbConfig::CONFIG['target_cpu']
49
77
  end
50
78
 
51
79
  def initialize(name, version, **kwargs)
@@ -2,6 +2,8 @@ require 'mini_portile2/mini_portile'
2
2
  require 'open3'
3
3
 
4
4
  class MiniPortileCMake < MiniPortile
5
+ attr_accessor :system_name
6
+
5
7
  def configure_prefix
6
8
  "-DCMAKE_INSTALL_PREFIX=#{File.expand_path(port_path)}"
7
9
  end
@@ -12,13 +14,10 @@ class MiniPortileCMake < MiniPortile
12
14
  end
13
15
 
14
16
  def configure_defaults
15
- if MiniPortile.mswin? && generator_available?('NMake')
16
- ['-G', 'NMake Makefiles']
17
- elsif MiniPortile.mingw? && generator_available?('MSYS')
18
- ['-G', 'MSYS Makefiles']
19
- else
20
- []
21
- end
17
+ [
18
+ generator_defaults,
19
+ cmake_compile_flags,
20
+ ].flatten
22
21
  end
23
22
 
24
23
  def configure
@@ -52,6 +51,77 @@ class MiniPortileCMake < MiniPortile
52
51
 
53
52
  private
54
53
 
54
+ def generator_defaults
55
+ if MiniPortile.mswin? && generator_available?('NMake')
56
+ ['-G', 'NMake Makefiles']
57
+ elsif MiniPortile.mingw? && generator_available?('MSYS')
58
+ ['-G', 'MSYS Makefiles']
59
+ else
60
+ []
61
+ end
62
+ end
63
+
64
+ def cmake_compile_flags
65
+ c_compiler, cxx_compiler = find_c_and_cxx_compilers(host)
66
+
67
+ # needed to ensure cross-compilation with CMake targets the right CPU and compilers
68
+ [
69
+ "-DCMAKE_SYSTEM_NAME=#{cmake_system_name}",
70
+ "-DCMAKE_SYSTEM_PROCESSOR=#{cpu_type}",
71
+ "-DCMAKE_C_COMPILER=#{c_compiler}",
72
+ "-DCMAKE_CXX_COMPILER=#{cxx_compiler}"
73
+ ]
74
+ end
75
+
76
+ def find_compiler(compilers)
77
+ compilers.find { |binary| which(binary) }
78
+ end
79
+
80
+ # configure automatically searches for the right compiler based on the
81
+ # `--host` parameter. However, CMake doesn't have an equivalent feature.
82
+ # Search for the right compiler for the target architecture using
83
+ # some basic heruistics.
84
+ def find_c_and_cxx_compilers(host)
85
+ c_compiler = ENV["CC"]
86
+ cxx_compiler = ENV["CXX"]
87
+
88
+ if MiniPortile.darwin?
89
+ c_compiler ||= 'clang'
90
+ cxx_compiler ||='clang++'
91
+ else
92
+ c_compiler ||= 'gcc'
93
+ cxx_compiler ||= 'g++'
94
+ end
95
+
96
+ c_platform_compiler = "#{host}-#{c_compiler}"
97
+ cxx_platform_compiler = "#{host}-#{cxx_compiler}"
98
+ c_compiler = find_compiler([c_platform_compiler, c_compiler])
99
+ cxx_compiler = find_compiler([cxx_platform_compiler, cxx_compiler])
100
+
101
+ [c_compiler, cxx_compiler]
102
+ end
103
+
104
+ # Full list: https://gitlab.kitware.com/cmake/cmake/-/blob/v3.26.4/Modules/CMakeDetermineSystem.cmake?ref_type=tags#L12-31
105
+ def cmake_system_name
106
+ return system_name if system_name
107
+
108
+ if MiniPortile.linux?
109
+ 'Linux'
110
+ elsif MiniPortile.darwin?
111
+ 'Darwin'
112
+ elsif MiniPortile.windows?
113
+ 'Windows'
114
+ elsif MiniPortile.freebsd?
115
+ 'FreeBSD'
116
+ elsif MiniPortile.openbsd?
117
+ 'OpenBSD'
118
+ elsif MiniPortile.solaris?
119
+ 'SunOS'
120
+ else
121
+ raise "Unable to set CMAKE_SYSTEM_NAME for #{MiniPortile.target_os}"
122
+ end
123
+ end
124
+
55
125
  def generator_available?(generator_type)
56
126
  stdout_str, status = Open3.capture2("#{cmake_cmd} --help")
57
127
 
@@ -59,4 +129,10 @@ class MiniPortileCMake < MiniPortile
59
129
 
60
130
  stdout_str.include?("#{generator_type} Makefiles")
61
131
  end
132
+
133
+ def cpu_type
134
+ return 'x86_64' if MiniPortile.target_cpu == 'x64'
135
+
136
+ MiniPortile.target_cpu
137
+ end
62
138
  end
@@ -1,3 +1,3 @@
1
1
  class MiniPortile
2
- VERSION = "2.8.3"
2
+ VERSION = "2.8.4"
3
3
  end
data/test/test_cmake.rb CHANGED
@@ -14,13 +14,11 @@ class TestCMake < TestCase
14
14
  create_tar(@tar_path, @assets_path, "test-cmake-1.0")
15
15
  start_webrick(File.dirname(@tar_path))
16
16
 
17
- @recipe = MiniPortileCMake.new("test-cmake", "1.0").tap do |recipe|
18
- recipe.files << "http://localhost:#{HTTP_PORT}/#{ERB::Util.url_encode(File.basename(@tar_path))}"
19
- recipe.patch_files << File.join(@assets_path, "patch 1.diff")
20
- git_dir = File.join(@assets_path, "git")
21
- with_custom_git_dir(git_dir) do
22
- recipe.cook
23
- end
17
+ @recipe = init_recipe
18
+
19
+ git_dir = File.join(@assets_path, "git")
20
+ with_custom_git_dir(git_dir) do
21
+ recipe.cook
24
22
  end
25
23
  end
26
24
 
@@ -57,6 +55,13 @@ class TestCMake < TestCase
57
55
  binary = File.join(recipe.path, "bin", exe_name)
58
56
  assert File.exist?(binary), binary
59
57
  end
58
+
59
+ def init_recipe
60
+ MiniPortileCMake.new("test-cmake", "1.0").tap do |recipe|
61
+ recipe.files << "http://localhost:#{HTTP_PORT}/#{ERB::Util.url_encode(File.basename(@tar_path))}"
62
+ recipe.patch_files << File.join(@assets_path, "patch 1.diff")
63
+ end
64
+ end
60
65
  end
61
66
 
62
67
  class TestCMakeConfig < TestCMake
@@ -77,26 +82,103 @@ class TestCMakeConfig < TestCMake
77
82
  end
78
83
  end
79
84
 
85
+ def test_configure_defaults_with_macos
86
+ recipe = init_recipe
87
+ recipe.host = 'some-host'
88
+
89
+ with_env({ "CC" => nil, "CXX" => nil }) do
90
+ MiniPortile.stub(:darwin?, true) do
91
+ with_stubbed_target(os: 'darwin22', cpu: 'arm64') do
92
+ with_compilers(recipe, host_prefix: true, c_compiler: 'clang', cxx_compiler: 'clang++') do
93
+ Open3.stub(:capture2, cmake_help_mock('Unix')) do
94
+ assert_equal(
95
+ [
96
+ "-DCMAKE_SYSTEM_NAME=Darwin",
97
+ "-DCMAKE_SYSTEM_PROCESSOR=arm64",
98
+ "-DCMAKE_C_COMPILER=some-host-clang",
99
+ "-DCMAKE_CXX_COMPILER=some-host-clang++"
100
+ ],
101
+ recipe.configure_defaults)
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+ def test_configure_defaults_with_manual_system_name
110
+ recipe = init_recipe
111
+ recipe.system_name = 'Custom'
112
+
113
+ MiniPortile.stub(:darwin?, false) do
114
+ with_stubbed_target do
115
+ with_compilers(recipe) do
116
+ Open3.stub(:capture2, cmake_help_mock('Unix')) do
117
+ assert_equal(
118
+ [
119
+ "-DCMAKE_SYSTEM_NAME=Custom",
120
+ "-DCMAKE_SYSTEM_PROCESSOR=x86_64",
121
+ "-DCMAKE_C_COMPILER=gcc",
122
+ "-DCMAKE_CXX_COMPILER=g++"
123
+ ],
124
+ recipe.configure_defaults)
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+
80
131
  def test_configure_defaults_with_unix_makefiles
81
- Open3.stub(:capture2, cmake_help_mock('Unix')) do
82
- MiniPortile.stub(:mingw?, true) do
83
- assert_equal([], @recipe.configure_defaults)
132
+ recipe = init_recipe
133
+
134
+ MiniPortile.stub(:linux?, true) do
135
+ MiniPortile.stub(:darwin?, false) do
136
+ with_stubbed_target do
137
+ with_compilers(recipe) do
138
+ Open3.stub(:capture2, cmake_help_mock('Unix')) do
139
+ MiniPortile.stub(:mingw?, true) do
140
+ assert_equal(default_x86_compile_flags,
141
+ recipe.configure_defaults)
142
+ end
143
+ end
144
+ end
145
+ end
84
146
  end
85
147
  end
86
148
  end
87
149
 
88
150
  def test_configure_defaults_with_msys_makefiles
89
- Open3.stub(:capture2, cmake_help_mock('MSYS')) do
90
- MiniPortile.stub(:mingw?, true) do
91
- assert_equal(['-G', 'MSYS Makefiles'], @recipe.configure_defaults)
151
+ recipe = init_recipe
152
+
153
+ MiniPortile.stub(:linux?, true) do
154
+ MiniPortile.stub(:darwin?, false) do
155
+ with_stubbed_target do
156
+ with_compilers(recipe) do
157
+ Open3.stub(:capture2, cmake_help_mock('MSYS')) do
158
+ MiniPortile.stub(:mingw?, true) do
159
+ assert_equal(['-G', 'MSYS Makefiles'] + default_x86_compile_flags, recipe.configure_defaults)
160
+ end
161
+ end
162
+ end
163
+ end
92
164
  end
93
165
  end
94
166
  end
95
167
 
96
168
  def test_configure_defaults_with_nmake_makefiles
97
- Open3.stub(:capture2, cmake_help_mock('NMake')) do
98
- MiniPortile.stub(:mswin?, true) do
99
- assert_equal(['-G', 'NMake Makefiles'], @recipe.configure_defaults)
169
+ recipe = init_recipe
170
+
171
+ MiniPortile.stub(:linux?, true) do
172
+ MiniPortile.stub(:darwin?, false) do
173
+ with_stubbed_target do
174
+ with_compilers(recipe) do
175
+ Open3.stub(:capture2, cmake_help_mock('NMake')) do
176
+ MiniPortile.stub(:mswin?, true) do
177
+ assert_equal(['-G', 'NMake Makefiles'] + default_x86_compile_flags, recipe.configure_defaults)
178
+ end
179
+ end
180
+ end
181
+ end
100
182
  end
101
183
  end
102
184
  end
@@ -114,12 +196,47 @@ class TestCMakeConfig < TestCMake
114
196
 
115
197
  private
116
198
 
199
+ def with_stubbed_target(os: 'linux', cpu: 'x86_64')
200
+ MiniPortile.stub(:target_os, os) do
201
+ MiniPortile.stub(:target_cpu, cpu) do
202
+ yield
203
+ end
204
+ end
205
+ end
206
+
207
+ def with_compilers(recipe, host_prefix: false, c_compiler: 'gcc', cxx_compiler: 'g++')
208
+ mock = MiniTest::Mock.new
209
+
210
+ if host_prefix
211
+ mock.expect(:call, true, ["#{recipe.host}-#{c_compiler}"])
212
+ mock.expect(:call, true, ["#{recipe.host}-#{cxx_compiler}"])
213
+ else
214
+ mock.expect(:call, false, ["#{recipe.host}-#{c_compiler}"])
215
+ mock.expect(:call, true, [c_compiler])
216
+ mock.expect(:call, false, ["#{recipe.host}-#{cxx_compiler}"])
217
+ mock.expect(:call, true, [cxx_compiler])
218
+ end
219
+
220
+ recipe.stub(:which, mock) do
221
+ yield
222
+ end
223
+ end
224
+
225
+ def default_x86_compile_flags
226
+ [
227
+ "-DCMAKE_SYSTEM_NAME=Linux",
228
+ "-DCMAKE_SYSTEM_PROCESSOR=x86_64",
229
+ "-DCMAKE_C_COMPILER=gcc",
230
+ "-DCMAKE_CXX_COMPILER=g++"
231
+ ]
232
+ end
233
+
117
234
  def cmake_help_mock(generator_type)
118
235
  open3_mock = MiniTest::Mock.new
119
236
  cmake_script = <<~SCRIPT
120
- echo "The following generators are available on this platform (* marks default):"
121
- echo "* #{generator_type} Makefiles = Generates standard #{generator_type.upcase} makefiles."
122
- SCRIPT
237
+ echo "The following generators are available on this platform (* marks default):"
238
+ echo "* #{generator_type} Makefiles = Generates standard #{generator_type.upcase} makefiles."
239
+ SCRIPT
123
240
 
124
241
  exit_status = MiniTest::Mock.new
125
242
  exit_status.expect(:success?, true)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mini_portile2
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.3
4
+ version: 2.8.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luis Lavena