mini_portile2 2.8.5.rc1 → 2.8.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 235fc41ae2e4aab6133eb8edb741bb535194af46c1aca4e70f0785d2c1253322
4
- data.tar.gz: 4ffdc351e59c3cec669361e0fb7b50b536d113363a7ed1c91d8fb681453df4fa
3
+ metadata.gz: 8f53843a25ac2651fd9970c34a44edf44de0904f99d9e63eadb3802f8dcd59bc
4
+ data.tar.gz: 075527f5c56f12de2ba5e3dfd72965a0093f62558eabb02571be5aee61cbe9f5
5
5
  SHA512:
6
- metadata.gz: 03deed0dd932686706f7956fda4f167fb46c73f87f443c058163226019de21d16252c509b453fccfaa8b661bf3f9667b0c1f2fec66edcef042a968fcd847811f
7
- data.tar.gz: a5d574f3b181ed8303ae0c799e6092fde2166fd1dc5937961f7b8016eef441a287cf80c4abf1bb2ec0f036894a12ea80f12edb30cec631981f6d8f042ad87959
6
+ metadata.gz: 0e251640701cf8ea166e1ce6725b8e7bf3d3dbf20a659a6b90ffe127667a80f908fab5b7f816f8a766edd4166464d5375c53a3c31c862a4a7a04e0e87929127d
7
+ data.tar.gz: 1d540e216342ef799de2188935d6de440b865606a244dd7ca6a27146a259bf5a1211c53b49668eee668187770e5e030d06508b4605779c4366999dcf831cc2b3
data/CHANGELOG.md CHANGED
@@ -1,12 +1,21 @@
1
1
  ## mini_portile changelog
2
2
 
3
- ### 2.8.5.rc1 / 2023-09-13
3
+ ### 2.8.5 / 2023-10-22
4
4
 
5
5
  #### Added
6
6
 
7
- - New method `MiniPortile#mkmf_config` will set up MakeMakefile variables to properly link against the recipe. This should make it easier for C extensions to package third-party libraries.
8
- - With no arguments, will set up just `$INCFLAGS`, `$libs`, and `$LIBPATH`.
9
- - Optionally, if provided a pkg-config file, will use that config to more precisely set `$INCFLAGS`, `$libs`, `$LIBPATH`, and `$CFLAGS`/`$CXXFLAGS`.
7
+ - New methods `#lib_path` and `#include_path` which point at the installed directories under `ports`. (by @flavorjones)
8
+ - Add config param for CMAKE_BUILD_TYPE, which now defaults to `Release`. (#136 by @Watson1978)
9
+
10
+ #### Experimental
11
+
12
+ Introduce experimental support for `MiniPortile#mkmf_config` which sets up MakeMakefile variables to properly link against the recipe. This should make it easier for C extensions to package third-party libraries. (by @flavorjones)
13
+
14
+ - With no arguments, will set up just `$INCFLAGS`, `$libs`, and `$LIBPATH`.
15
+ - Optionally, if provided a pkg-config file, will use that config to more precisely set `$INCFLAGS`, `$libs`, `$LIBPATH`, and `$CFLAGS`/`$CXXFLAGS`.
16
+ - Optionally, if provided the name of a static archive, will rewrite linker flags to ensure correct linkage.
17
+
18
+ Note that the behavior may change slightly before official support is announced. Please comment on [#118](https://github.com/flavorjones/mini_portile/issues/118) if you have feedback.
10
19
 
11
20
 
12
21
  ### 2.8.4 / 2023-07-18
data/README.md CHANGED
@@ -138,8 +138,8 @@ This is configurable as above, except for Windows systems where it's hardcoded t
138
138
  The cmake command used is configurable, and in order of preference will use:
139
139
 
140
140
  - the `CMAKE` environment variable (if present)
141
- - the `cmake_command` value passed in to the constructor
142
- - `"cmake"`
141
+ - the `:cmake_command` keyword argument passed into the constructor
142
+ - `"cmake"` (the default)
143
143
 
144
144
  You can pass it in like so:
145
145
 
@@ -147,6 +147,19 @@ You can pass it in like so:
147
147
  MiniPortileCMake.new("libfoobar", "1.3.5", cmake_command: "cmake3")
148
148
  ```
149
149
 
150
+ #### `cmake_build_type`
151
+
152
+ The cmake build type is configurable as of v2.8.5, and in order of preference will use:
153
+
154
+ - the `CMAKE_BUILD_TYPE` environment variable (if present)
155
+ - the `:cmake_build_type` keyword argument passed into the constructor
156
+ - `"Release"` (the default)
157
+
158
+ You can pass it in like so:
159
+
160
+ ``` ruby
161
+ MiniPortileCMake.new("libfoobar", "1.3.5", cmake_build_type: "Debug")
162
+ ```
150
163
 
151
164
  ### Local source directories
152
165
 
@@ -27,12 +27,14 @@ class Net::HTTP
27
27
  end
28
28
  end
29
29
 
30
+ $MINI_PORTILE_STATIC_LIBS = {}
31
+
30
32
  class MiniPortile
31
33
  DEFAULT_TIMEOUT = 10
32
34
 
33
- attr_reader :name, :version, :original_host
35
+ attr_reader :name, :version, :original_host, :source_directory
34
36
  attr_writer :configure_options
35
- attr_accessor :host, :files, :patch_files, :target, :logger, :source_directory
37
+ attr_accessor :host, :files, :patch_files, :target, :logger
36
38
 
37
39
  def self.windows?
38
40
  target_os =~ /mswin|mingw/
@@ -237,11 +239,10 @@ class MiniPortile
237
239
  end
238
240
 
239
241
  def activate
240
- lib_path = File.join(port_path, "lib")
241
242
  vars = {
242
243
  'PATH' => File.join(port_path, 'bin'),
243
- 'CPATH' => File.join(port_path, 'include'),
244
- 'LIBRARY_PATH' => lib_path
244
+ 'CPATH' => include_path,
245
+ 'LIBRARY_PATH' => lib_path,
245
246
  }.reject { |env, path| !File.directory?(path) }
246
247
 
247
248
  output "Activating #{@name} #{@version} (from #{port_path})..."
@@ -268,11 +269,19 @@ class MiniPortile
268
269
  end
269
270
  end
270
271
 
271
- def mkmf_config(pkg: nil, dir: nil)
272
+ # pkg: the pkg-config file name (without the .pc extension)
273
+ # dir: inject the directory path for the pkg-config file (probably only useful for tests)
274
+ # static: the name of the static library archive (without the "lib" prefix or the file extension), or nil for dynamic linking
275
+ #
276
+ # we might be able to be terribly clever and infer the name of the static archive file, but
277
+ # unfortunately projects have so much freedom in what they can report (for name, for libs, etc.)
278
+ # that it feels unreliable to try to do so, so I'm preferring to just have the developer make it
279
+ # explicit.
280
+ def mkmf_config(pkg: nil, dir: nil, static: nil)
272
281
  require "mkmf"
273
282
 
274
283
  if pkg
275
- dir ||= File.join(path, "lib", "pkgconfig")
284
+ dir ||= File.join(lib_path, "pkgconfig")
276
285
  pcfile = File.join(dir, "#{pkg}.pc")
277
286
  unless File.exist?(pcfile)
278
287
  raise ArgumentError, "pkg-config file '#{pcfile}' does not exist"
@@ -288,42 +297,81 @@ class MiniPortile
288
297
 
289
298
  incflags = minimal_pkg_config(pcfile, "cflags-only-I")
290
299
  cflags = minimal_pkg_config(pcfile, "cflags-only-other")
291
- ldflags = minimal_pkg_config(pcfile, "libs-only-L", "static")
292
- libflags = minimal_pkg_config(pcfile, "libs-only-l", "static")
300
+ if static
301
+ ldflags = minimal_pkg_config(pcfile, "libs-only-L", "static")
302
+ libflags = minimal_pkg_config(pcfile, "libs-only-l", "static")
303
+ else
304
+ ldflags = minimal_pkg_config(pcfile, "libs-only-L")
305
+ libflags = minimal_pkg_config(pcfile, "libs-only-l")
306
+ end
293
307
  else
294
308
  output "Configuring MakeMakefile for #{@name} #{@version} (from #{path})\n"
295
309
 
296
- include_path = File.join(path, "include")
297
- lib_path = File.join(path, "lib")
298
-
299
310
  lib_name = name.sub(/\Alib/, "") # TODO: use delete_prefix when we no longer support ruby 2.4
300
311
 
301
- incflags = "-I#{include_path}" if Dir.exist?(include_path)
302
- ldflags = "-L#{lib_path}" if Dir.exist?(lib_path)
303
- libflags = "-l#{lib_name}" if Dir.exist?(lib_path)
312
+ incflags = Dir.exist?(include_path) ? "-I#{include_path}" : ""
313
+ cflags = ""
314
+ ldflags = Dir.exist?(lib_path) ? "-L#{lib_path}" : ""
315
+ libflags = Dir.exist?(lib_path) ? "-l#{lib_name}" : ""
304
316
  end
305
317
 
306
- if ldflags
307
- libpaths = ldflags.split.map { |f| f.sub(/\A-L/, "") }
318
+ if static
319
+ libdir = lib_path
320
+ if pcfile
321
+ variables = minimal_pkg_config(pcfile, "print-variables").split("\n").map(&:strip)
322
+ if variables.include?("libdir")
323
+ libdir = minimal_pkg_config(pcfile, "variable=libdir")
324
+ end
325
+ end
326
+
327
+ #
328
+ # keep track of the libraries we're statically linking against, and fix up ldflags and
329
+ # libflags to make sure we link statically against the recipe's libaries.
330
+ #
331
+ # this avoids the unintentionally dynamically linking against system libraries, and makes sure
332
+ # that if multiple pkg-config files reference each other that we are able to intercept flags
333
+ # from dependent packages that reference the static archive.
334
+ #
335
+ $MINI_PORTILE_STATIC_LIBS[static] = libdir
336
+ static_ldflags = $MINI_PORTILE_STATIC_LIBS.values.map { |v| "-L#{v}" }
337
+ static_libflags = $MINI_PORTILE_STATIC_LIBS.keys.map { |v| "-l#{v}" }
338
+
339
+ # remove `-L#{libdir}` and `-lfoo`. we don't need them since we link against the static
340
+ # archive using the full path.
341
+ ldflags = ldflags.shellsplit.reject { |f| static_ldflags.include?(f) }.shelljoin
342
+ libflags = libflags.shellsplit.reject { |f| static_libflags.include?(f) }.shelljoin
343
+
344
+ # prepend the full path to the static archive to the linker flags
345
+ static_archive = File.join(libdir, "lib#{static}.#{$LIBEXT}")
346
+ libflags = [static_archive, libflags].join(" ").strip
308
347
  end
309
348
 
310
- # prefer this package by prepending directories to the search path
349
+ # prefer this package by prepending to search paths and library flags
311
350
  #
312
- # use $LIBPATH instead of $LDFLAGS to ensure we get the `-Wl,-rpath` linker flag for re-finding
313
- # shared libraries
314
- $INCFLAGS = [incflags, $INCFLAGS].join(" ").strip if incflags
315
- $LIBPATH = libpaths | $LIBPATH if libpaths
351
+ # convert the ldflags into a list of directories and append to $LIBPATH (instead of just using
352
+ # $LDFLAGS) to ensure we get the `-Wl,-rpath` linker flag for re-finding shared libraries.
353
+ $INCFLAGS = [incflags, $INCFLAGS].join(" ").strip
354
+ libpaths = ldflags.shellsplit.map { |f| f.sub(/\A-L/, "") }
355
+ $LIBPATH = libpaths | $LIBPATH
356
+ $libs = [libflags, $libs].join(" ").strip
316
357
 
317
- # prefer this package's flags by appending them to the command line
318
- $CFLAGS = [$CFLAGS, cflags].join(" ").strip if cflags
319
- $CXXFLAGS = [$CXXFLAGS, cflags].join(" ").strip if cflags
320
- $libs = [$libs, libflags].join(" ").strip if libflags
358
+ # prefer this package's compiler flags by appending them to the command line
359
+ $CFLAGS = [$CFLAGS, cflags].join(" ").strip
360
+ $CXXFLAGS = [$CXXFLAGS, cflags].join(" ").strip
321
361
  end
322
362
 
323
363
  def path
324
364
  File.expand_path(port_path)
325
365
  end
326
366
 
367
+ def include_path
368
+ File.join(path, "include")
369
+ end
370
+
371
+ def lib_path
372
+ File.join(path, "lib")
373
+ end
374
+
327
375
  def gcc_cmd
328
376
  (ENV["CC"] || @gcc_command || RbConfig::CONFIG["CC"] || "gcc").dup
329
377
  end
@@ -11,6 +11,7 @@ class MiniPortileCMake < MiniPortile
11
11
  def initialize(name, version, **kwargs)
12
12
  super(name, version, **kwargs)
13
13
  @cmake_command = kwargs[:cmake_command]
14
+ @cmake_build_type = kwargs[:cmake_build_type]
14
15
  end
15
16
 
16
17
  def configure_defaults
@@ -49,6 +50,10 @@ class MiniPortileCMake < MiniPortile
49
50
  (ENV["CMAKE"] || @cmake_command || "cmake").dup
50
51
  end
51
52
 
53
+ def cmake_build_type
54
+ (ENV["CMAKE_BUILD_TYPE"] || @cmake_build_type || "Release").dup
55
+ end
56
+
52
57
  private
53
58
 
54
59
  def generator_defaults
@@ -69,7 +74,8 @@ class MiniPortileCMake < MiniPortile
69
74
  "-DCMAKE_SYSTEM_NAME=#{cmake_system_name}",
70
75
  "-DCMAKE_SYSTEM_PROCESSOR=#{cpu_type}",
71
76
  "-DCMAKE_C_COMPILER=#{c_compiler}",
72
- "-DCMAKE_CXX_COMPILER=#{cxx_compiler}"
77
+ "-DCMAKE_CXX_COMPILER=#{cxx_compiler}",
78
+ "-DCMAKE_BUILD_TYPE=#{cmake_build_type}",
73
79
  ]
74
80
  end
75
81
 
@@ -1,3 +1,3 @@
1
1
  class MiniPortile
2
- VERSION = "2.8.5.rc1"
2
+ VERSION = "2.8.5"
3
3
  end
@@ -1,7 +1,4 @@
1
- # coding: utf-8
2
- lib = File.expand_path("../lib", __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "mini_portile2/version"
1
+ require_relative "lib/mini_portile2/version"
5
2
 
6
3
  Gem::Specification.new do |spec|
7
4
  spec.name = "mini_portile2"
@@ -10,8 +7,12 @@ Gem::Specification.new do |spec|
10
7
  spec.authors = ["Luis Lavena", "Mike Dalessio", "Lars Kanis"]
11
8
  spec.email = "mike.dalessio@gmail.com"
12
9
 
13
- spec.summary = "Simplistic port-like solution for developers"
14
- spec.description = "Simplistic port-like solution for developers. It provides a standard and simplified way to compile against dependency libraries without messing up your system."
10
+ spec.summary = "Simple autoconf and cmake builder for developers"
11
+ spec.description = <<~TEXT
12
+ Simple autoconf and cmake builder for developers. It provides a standard way to compile against
13
+ dependency libraries without requiring system-wide installation. It also simplifies
14
+ vendoring and cross-compilation by providing a consistent build interface.
15
+ TEXT
15
16
 
16
17
  spec.homepage = "https://github.com/flavorjones/mini_portile"
17
18
  spec.licenses = ["MIT"]
data/test/test_cmake.rb CHANGED
@@ -96,7 +96,8 @@ class TestCMakeConfig < TestCMake
96
96
  "-DCMAKE_SYSTEM_NAME=Darwin",
97
97
  "-DCMAKE_SYSTEM_PROCESSOR=arm64",
98
98
  "-DCMAKE_C_COMPILER=some-host-clang",
99
- "-DCMAKE_CXX_COMPILER=some-host-clang++"
99
+ "-DCMAKE_CXX_COMPILER=some-host-clang++",
100
+ "-DCMAKE_BUILD_TYPE=Release"
100
101
  ],
101
102
  recipe.configure_defaults)
102
103
  end
@@ -119,7 +120,8 @@ class TestCMakeConfig < TestCMake
119
120
  "-DCMAKE_SYSTEM_NAME=Custom",
120
121
  "-DCMAKE_SYSTEM_PROCESSOR=x86_64",
121
122
  "-DCMAKE_C_COMPILER=gcc",
122
- "-DCMAKE_CXX_COMPILER=g++"
123
+ "-DCMAKE_CXX_COMPILER=g++",
124
+ "-DCMAKE_BUILD_TYPE=Release"
123
125
  ],
124
126
  recipe.configure_defaults)
125
127
  end
@@ -194,6 +196,17 @@ class TestCMakeConfig < TestCMake
194
196
  end
195
197
  end
196
198
 
199
+ def test_cmake_build_type_configuration
200
+ without_env("CMAKE_BUILD_TYPE") do
201
+ assert_equal("Release", MiniPortileCMake.new("test", "1.0.0").cmake_build_type)
202
+ assert_equal("xyzzy", MiniPortileCMake.new("test", "1.0.0", cmake_build_type: "xyzzy").cmake_build_type)
203
+ end
204
+ with_env("CMAKE_BUILD_TYPE"=>"Debug") do
205
+ assert_equal("Debug", MiniPortileCMake.new("test", "1.0.0").cmake_build_type)
206
+ assert_equal("Debug", MiniPortileCMake.new("test", "1.0.0", cmake_build_type: "xyzzy").cmake_build_type)
207
+ end
208
+ end
209
+
197
210
  private
198
211
 
199
212
  def with_stubbed_target(os: 'linux', cpu: 'x86_64')
@@ -227,7 +240,8 @@ class TestCMakeConfig < TestCMake
227
240
  "-DCMAKE_SYSTEM_NAME=Linux",
228
241
  "-DCMAKE_SYSTEM_PROCESSOR=x86_64",
229
242
  "-DCMAKE_C_COMPILER=gcc",
230
- "-DCMAKE_CXX_COMPILER=g++"
243
+ "-DCMAKE_CXX_COMPILER=g++",
244
+ "-DCMAKE_BUILD_TYPE=Release"
231
245
  ]
232
246
  end
233
247
 
@@ -3,11 +3,17 @@ require File.expand_path('../helper', __FILE__)
3
3
  require "mkmf" # initialize $LDFLAGS et al here, instead of in the middle of a test
4
4
 
5
5
  class TestMkmfConfig < TestCase
6
- attr_reader :recipe, :include_path, :lib_path
6
+ attr_reader :recipe
7
7
 
8
8
  LIBXML_PCP = File.join(__dir__, "assets", "pkgconf", "libxml2")
9
9
  LIBXSLT_PCP = File.join(__dir__, "assets", "pkgconf", "libxslt")
10
10
 
11
+ def make_recipe(name, version)
12
+ MiniPortile.new(name, version).tap do |recipe|
13
+ recipe.logger = StringIO.new # hush output
14
+ end
15
+ end
16
+
11
17
  def setup
12
18
  super
13
19
 
@@ -19,14 +25,11 @@ class TestMkmfConfig < TestCase
19
25
  $CFLAGS = "-xxx"
20
26
  $CXXFLAGS = "-xxx"
21
27
  $libs = "-lxxx"
28
+ $MINI_PORTILE_STATIC_LIBS = {}
22
29
 
23
30
  FileUtils.rm_rf(["tmp", "ports"]) # remove any previous test files
24
31
 
25
- @recipe = MiniPortile.new("libfoo", "1.0.0").tap do |recipe|
26
- recipe.logger = StringIO.new
27
- end
28
- @include_path = File.join(@recipe.path, "include")
29
- @lib_path = File.join(@recipe.path, "lib")
32
+ @recipe = make_recipe("libfoo", "1.0.0")
30
33
  end
31
34
 
32
35
  def teardown
@@ -37,6 +40,7 @@ class TestMkmfConfig < TestCase
37
40
  $CFLAGS = ""
38
41
  $CXXFLAGS = ""
39
42
  $libs = ""
43
+ $MINI_PORTILE_STATIC_LIBS = {}
40
44
  @save_env.each do |var, val|
41
45
  ENV[var] = val
42
46
  end
@@ -47,35 +51,48 @@ class TestMkmfConfig < TestCase
47
51
  def test_mkmf_config_recipe_LIBPATH_global_lib_dir_does_not_exist
48
52
  recipe.mkmf_config
49
53
 
50
- refute_includes($LIBPATH, lib_path)
51
- refute_includes($libs.split, "-lfoo")
54
+ refute_includes($LIBPATH, recipe.lib_path)
55
+ refute_includes($libs.shellsplit, "-lfoo")
52
56
  end
53
57
 
54
- def test_mkmf_config_recipe_LIBPATH_global
55
- FileUtils.mkdir_p(lib_path)
58
+ def test_mkmf_config_recipe_LIBPATH_global_not_static
59
+ FileUtils.mkdir_p(recipe.lib_path)
56
60
 
57
61
  recipe.mkmf_config
58
62
 
59
- assert_includes($LIBPATH, lib_path)
60
- assert_operator($LIBPATH.index(lib_path), :<, $LIBPATH.index("xxx")) # prepend
63
+ assert_includes($LIBPATH, recipe.lib_path)
64
+ assert_operator($LIBPATH.index(recipe.lib_path), :<, $LIBPATH.index("xxx")) # prepend
65
+
66
+ assert_includes($libs.shellsplit, "-lfoo") # note the recipe name is "libfoo"
67
+ assert_match(%r{-lfoo.*-lxxx}, $libs) # prepend
68
+ end
69
+
70
+ def test_mkmf_config_recipe_LIBPATH_global_static
71
+ FileUtils.mkdir_p(recipe.lib_path)
72
+ static_lib_path = File.join(recipe.lib_path, "libfoo.#{$LIBEXT}")
73
+
74
+ recipe.mkmf_config(static: "foo")
75
+
76
+ refute_includes($LIBPATH, recipe.lib_path)
61
77
 
62
- assert_includes($libs.split, "-lfoo") # note the recipe name is "libfoo"
63
- assert_match(%r{-lxxx.*-lfoo}, $libs) # append
78
+ refute_includes($libs.shellsplit, "-lfoo") # note the recipe name is "libfoo"
79
+ assert_includes($libs.shellsplit, static_lib_path)
80
+ assert_match(%r{#{static_lib_path}.*-lxxx}, $libs) # prepend
64
81
  end
65
82
 
66
83
  def test_mkmf_config_recipe_INCFLAGS_global_include_dir_does_not_exist
67
84
  recipe.mkmf_config
68
85
 
69
- refute_includes($INCFLAGS.split, "-I#{include_path}")
86
+ refute_includes($INCFLAGS.shellsplit, "-I#{recipe.include_path}")
70
87
  end
71
88
 
72
89
  def test_mkmf_config_recipe_INCFLAGS_global
73
- FileUtils.mkdir_p(include_path)
90
+ FileUtils.mkdir_p(recipe.include_path)
74
91
 
75
92
  recipe.mkmf_config
76
93
 
77
- assert_includes($INCFLAGS.split, "-I#{include_path}")
78
- assert_match(%r{-I#{include_path}.*-I/xxx}, $INCFLAGS) # prepend
94
+ assert_includes($INCFLAGS.shellsplit, "-I#{recipe.include_path}")
95
+ assert_match(%r{-I#{recipe.include_path}.*-I/xxx}, $INCFLAGS) # prepend
79
96
  end
80
97
 
81
98
  def test_mkmf_config_pkgconf_does_not_exist
@@ -84,7 +101,7 @@ class TestMkmfConfig < TestCase
84
101
  end
85
102
  end
86
103
 
87
- def test_mkmf_config_pkgconf_LIBPATH_global
104
+ def test_mkmf_config_pkgconf_LIBPATH_global_not_static
88
105
  # can't get the pkgconf utility to install on windows with ruby 2.3 in CI
89
106
  skip if MiniPortile.windows? && RUBY_VERSION < "2.4"
90
107
 
@@ -92,9 +109,28 @@ class TestMkmfConfig < TestCase
92
109
 
93
110
  assert_includes($LIBPATH, "/foo/libxml2/2.11.5/lib")
94
111
  assert_operator($LIBPATH.index("/foo/libxml2/2.11.5/lib"), :<, $LIBPATH.index("xxx")) # prepend
112
+ refute_includes($LIBPATH, "/foo/zlib/1.3/lib")
113
+
114
+ assert_includes($libs.shellsplit, "-lxml2")
115
+ assert_match(%r{-lxml2.*-lxxx}, $libs) # prepend
116
+ refute_includes($libs.shellsplit, "-lz")
117
+ end
118
+
119
+ def test_mkmf_config_pkgconf_LIBPATH_global_static
120
+ # can't get the pkgconf utility to install on windows with ruby 2.3 in CI
121
+ skip if MiniPortile.windows? && RUBY_VERSION < "2.4"
122
+
123
+ static_lib_path = "/foo/libxml2/2.11.5/lib/libxml2.#{$LIBEXT}"
95
124
 
96
- assert_includes($libs.split, "-lxml2")
97
- assert_match(%r{-lxxx.*-lxml2}, $libs) # append
125
+ recipe.mkmf_config(pkg: "libxml-2.0", dir: LIBXML_PCP, static: "xml2")
126
+
127
+ refute_includes($LIBPATH, "/foo/libxml2/2.11.5/lib")
128
+ refute_includes($libs.shellsplit, "-lxml2")
129
+ assert_includes($libs.shellsplit, static_lib_path)
130
+ assert_match(%r{#{static_lib_path}.*-lxxx}, $libs) # prepend
131
+
132
+ assert_includes($LIBPATH, "/foo/zlib/1.3/lib") # from --static
133
+ assert_includes($libs.shellsplit, "-lz") # from --static
98
134
  end
99
135
 
100
136
  def test_mkmf_config_pkgconf_CFLAGS_global
@@ -103,14 +139,14 @@ class TestMkmfConfig < TestCase
103
139
 
104
140
  recipe.mkmf_config(pkg: "libxml-2.0", dir: LIBXML_PCP)
105
141
 
106
- assert_includes($INCFLAGS.split, "-I/foo/libxml2/2.11.5/include/libxml2")
142
+ assert_includes($INCFLAGS.shellsplit, "-I/foo/libxml2/2.11.5/include/libxml2")
107
143
  assert_match(%r{-I/foo/libxml2/2.11.5/include/libxml2.*-I/xxx}, $INCFLAGS) # prepend
108
144
 
109
- assert_includes($CFLAGS.split, "-ggdb3")
110
- assert_match(%r{-xxx.*-ggdb3}, $CFLAGS) # prepend
145
+ assert_includes($CFLAGS.shellsplit, "-ggdb3")
146
+ assert_match(%r{-xxx.*-ggdb3}, $CFLAGS) # append
111
147
 
112
- assert_includes($CXXFLAGS.split, "-ggdb3")
113
- assert_match(%r{-xxx.*-ggdb3}, $CXXFLAGS) # prepend
148
+ assert_includes($CXXFLAGS.shellsplit, "-ggdb3")
149
+ assert_match(%r{-xxx.*-ggdb3}, $CXXFLAGS) # append
114
150
  end
115
151
 
116
152
  def test_mkmf_config_pkgconf_path_accumulation
@@ -122,37 +158,44 @@ class TestMkmfConfig < TestCase
122
158
  refute_includes(pcpaths, LIBXSLT_PCP)
123
159
  end
124
160
 
125
- recipe.mkmf_config(pkg: "libxml-2.0", dir: LIBXML_PCP)
161
+ make_recipe("libxml2", "2.11.5").tap do |recipe|
162
+ recipe.mkmf_config(pkg: "libxml-2.0", dir: LIBXML_PCP, static: "xml2")
126
163
 
127
- ENV["PKG_CONFIG_PATH"].split(File::PATH_SEPARATOR).tap do |pcpaths|
128
- assert_includes(pcpaths, LIBXML_PCP)
129
- refute_includes(pcpaths, LIBXSLT_PCP)
164
+ ENV["PKG_CONFIG_PATH"].split(File::PATH_SEPARATOR).tap do |pcpaths|
165
+ assert_includes(pcpaths, LIBXML_PCP)
166
+ refute_includes(pcpaths, LIBXSLT_PCP)
167
+ end
130
168
  end
131
169
 
132
- recipe.mkmf_config(pkg: "libxslt", dir: LIBXSLT_PCP)
170
+ make_recipe("libxslt", "1.13.8").tap do |recipe|
171
+ recipe.mkmf_config(pkg: "libxslt", dir: LIBXSLT_PCP, static: "xslt")
133
172
 
134
- ENV["PKG_CONFIG_PATH"].split(File::PATH_SEPARATOR).tap do |pcpaths|
135
- assert_includes(pcpaths, LIBXML_PCP)
136
- assert_includes(pcpaths, LIBXSLT_PCP)
137
- end
173
+ ENV["PKG_CONFIG_PATH"].split(File::PATH_SEPARATOR).tap do |pcpaths|
174
+ assert_includes(pcpaths, LIBXML_PCP)
175
+ assert_includes(pcpaths, LIBXSLT_PCP)
176
+ end
138
177
 
139
- recipe.mkmf_config(pkg: "libexslt", dir: LIBXSLT_PCP)
178
+ recipe.mkmf_config(pkg: "libexslt", dir: LIBXSLT_PCP, static: "exslt")
179
+ end
140
180
 
141
- $INCFLAGS.split.tap do |incflags|
181
+ $INCFLAGS.shellsplit.tap do |incflags|
142
182
  assert_includes(incflags, "-I/foo/libxml2/2.11.5/include/libxml2")
143
183
  assert_includes(incflags, "-I/foo/libxslt/1.1.38/include")
144
184
  end
145
- assert_includes($LIBPATH, "/foo/libxml2/2.11.5/lib")
146
- assert_includes($LIBPATH, "/foo/libxslt/1.1.38/lib")
147
- assert_includes($LIBPATH, "/foo/zlib/1.3/lib") # from `--static`
148
- $CFLAGS.split.tap do |cflags|
185
+ $CFLAGS.shellsplit.tap do |cflags|
149
186
  assert_includes(cflags, "-ggdb3")
150
187
  assert_includes(cflags, "-Wno-deprecated-enum-enum-conversion")
151
188
  end
152
- $libs.split.tap do |libflags|
153
- assert_includes(libflags, "-lxml2")
154
- assert_includes(libflags, "-lxslt")
155
- assert_includes(libflags, "-lexslt")
189
+ refute_includes($LIBPATH, "/foo/libxml2/2.11.5/lib")
190
+ refute_includes($LIBPATH, "/foo/libxslt/1.1.38/lib")
191
+ assert_includes($LIBPATH, "/foo/zlib/1.3/lib") # from `--static`
192
+ $libs.shellsplit.tap do |libflags|
193
+ refute_includes(libflags, "-lxml2")
194
+ assert_includes(libflags, "/foo/libxml2/2.11.5/lib/libxml2.#{$LIBEXT}")
195
+ refute_includes(libflags, "-lxslt")
196
+ assert_includes(libflags, "/foo/libxslt/1.1.38/lib/libxslt.#{$LIBEXT}")
197
+ refute_includes(libflags, "-lexslt")
198
+ assert_includes(libflags, "/foo/libxslt/1.1.38/lib/libexslt.#{$LIBEXT}")
156
199
  assert_includes(libflags, "-lz") # from `--static`
157
200
  end
158
201
  end
@@ -0,0 +1,18 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ class TestRecipe < TestCase
4
+ def test_path
5
+ recipe = MiniPortile.new("libfoo", "1.0.0")
6
+ assert_equal(File.expand_path(File.join(recipe.target, recipe.host, recipe.name, recipe.version)), recipe.path)
7
+ end
8
+
9
+ def test_lib_path
10
+ recipe = MiniPortile.new("libfoo", "1.0.0")
11
+ assert_equal(File.join(recipe.path, "lib"), recipe.lib_path)
12
+ end
13
+
14
+ def test_include_path
15
+ recipe = MiniPortile.new("libfoo", "1.0.0")
16
+ assert_equal(File.join(recipe.path, "include"), recipe.include_path)
17
+ end
18
+ end
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.5.rc1
4
+ version: 2.8.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luis Lavena
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2023-09-13 00:00:00.000000000 Z
13
+ date: 2023-10-22 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -96,9 +96,10 @@ dependencies:
96
96
  - - "~>"
97
97
  - !ruby/object:Gem::Version
98
98
  version: '1.7'
99
- description: Simplistic port-like solution for developers. It provides a standard
100
- and simplified way to compile against dependency libraries without messing up your
101
- system.
99
+ description: |
100
+ Simple autoconf and cmake builder for developers. It provides a standard way to compile against
101
+ dependency libraries without requiring system-wide installation. It also simplifies
102
+ vendoring and cross-compilation by providing a consistent build interface.
102
103
  email: mike.dalessio@gmail.com
103
104
  executables: []
104
105
  extensions: []
@@ -139,6 +140,7 @@ files:
139
140
  - test/test_execute.rb
140
141
  - test/test_mkmf_config.rb
141
142
  - test/test_proxy.rb
143
+ - test/test_recipe.rb
142
144
  homepage: https://github.com/flavorjones/mini_portile
143
145
  licenses:
144
146
  - MIT
@@ -154,14 +156,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
154
156
  version: 2.3.0
155
157
  required_rubygems_version: !ruby/object:Gem::Requirement
156
158
  requirements:
157
- - - ">"
159
+ - - ">="
158
160
  - !ruby/object:Gem::Version
159
- version: 1.3.1
161
+ version: '0'
160
162
  requirements: []
161
163
  rubygems_version: 3.4.19
162
164
  signing_key:
163
165
  specification_version: 4
164
- summary: Simplistic port-like solution for developers
166
+ summary: Simple autoconf and cmake builder for developers
165
167
  test_files:
166
168
  - test/assets/git/config
167
169
  - test/assets/gpg-fixtures/data
@@ -184,3 +186,4 @@ test_files:
184
186
  - test/test_execute.rb
185
187
  - test/test_mkmf_config.rb
186
188
  - test/test_proxy.rb
189
+ - test/test_recipe.rb