Skip to content

Commit

Permalink
mkmf: pkg_config accepts multiple options
Browse files Browse the repository at this point in the history
  • Loading branch information
flavorjones authored and nobu committed Jan 29, 2022
1 parent 24c7e75 commit b90e56e
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 23 deletions.
48 changes: 25 additions & 23 deletions lib/mkmf.rb
Expand Up @@ -1836,26 +1836,26 @@ def dir_config(target, idefault=nil, ldefault=nil)
$config_dirs[target] = [idir, ldir]
end

# Returns compile/link information about an installed library in a
# tuple of <code>[cflags, ldflags, libs]</code>, by using the
# command found first in the following commands:
# Returns compile/link information about an installed library in a tuple of <code>[cflags,
# ldflags, libs]</code>, by using the command found first in the following commands:
#
# 1. If <code>--with-{pkg}-config={command}</code> is given via
# command line option: <code>{command} {option}</code>
# command line option: <code>{command} {options}</code>
#
# 2. <code>{pkg}-config {option}</code>
# 2. <code>{pkg}-config {options}</code>
#
# 3. <code>pkg-config {option} {pkg}</code>
# 3. <code>pkg-config {options} {pkg}</code>
#
# Where {option} is, for instance, <code>--cflags</code>.
# Where +options+ is the option name without dashes, for instance <code>"cflags"</code> for the
# <code>--cflags</code> flag.
#
# The values obtained are appended to +$INCFLAGS+, +$CFLAGS+, +$LDFLAGS+ and
# +$libs+.
# The values obtained are appended to <code>$INCFLAGS</code>, <code>$CFLAGS</code>,
# <code>$LDFLAGS</code> and <code>$libs</code>.
#
# If an <code>option</code> argument is given, the config command is
# invoked with the option and a stripped output string is returned
# without modifying any of the global values mentioned above.
def pkg_config(pkg, option=nil)
# If one or more <code>options</code> argument is given, the config command is
# invoked with the options and a stripped output string is returned without
# modifying any of the global values mentioned above.
def pkg_config(pkg, *options)
_, ldir = dir_config(pkg)
if ldir
pkg_config_path = "#{ldir}/pkgconfig"
Expand All @@ -1872,26 +1872,28 @@ def pkg_config(pkg, option=nil)
xsystem([*envs, $PKGCONFIG, "--exists", pkg])
# default to pkg-config command
pkgconfig = $PKGCONFIG
get = proc {|opt|
opt = xpopen([*envs, $PKGCONFIG, "--#{opt}", pkg], err:[:child, :out], &:read)
Logging.open {puts opt.each_line.map{|s|"=> #{s.inspect}"}}
opt.strip if $?.success?
get = proc {|opts|
opts = Array(opts).map { |o| "--#{o}" }
opts = xpopen([*envs, $PKGCONFIG, *opts, pkg], err:[:child, :out], &:read)
Logging.open {puts opts.each_line.map{|s|"=> #{s.inspect}"}}
opts.strip if $?.success?
}
elsif find_executable0(pkgconfig = "#{pkg}-config")
# default to package specific config command, as a last resort.
else
pkgconfig = nil
end
if pkgconfig
get ||= proc {|opt|
opt = xpopen([*envs, pkgconfig, "--#{opt}"], err:[:child, :out], &:read)
Logging.open {puts opt.each_line.map{|s|"=> #{s.inspect}"}}
opt.strip if $?.success?
get ||= proc {|opts|
opts = Array(opts).map { |o| "--#{o}" }
opts = xpopen([*envs, pkgconfig, *opts], err:[:child, :out], &:read)
Logging.open {puts opts.each_line.map{|s|"=> #{s.inspect}"}}
opts.strip if $?.success?
}
end
orig_ldflags = $LDFLAGS
if get and option
get[option]
if get and !options.empty?
get[options]
elsif get and try_ldflags(ldflags = get['libs'])
if incflags = get['cflags-only-I']
$INCFLAGS << " " << incflags
Expand Down
7 changes: 7 additions & 0 deletions test/mkmf/test_pkg_config.rb
Expand Up @@ -57,5 +57,12 @@ def test_pkgconfig_with_cflags_option_returns_output
actual = pkg_config("test1", "cflags").shellsplit.sort
assert_equal(expected, actual, MKMFLOG)
end

def test_pkgconfig_with_multiple_options
pend("skipping because pkg-config is not installed") unless PKG_CONFIG
expected = ["-L#{@fixtures_lib_dir}", "-ltest1-public", "-ltest1-private"].sort
actual = pkg_config("test1", "libs", "static").shellsplit.sort
assert_equal(expected, actual, MKMFLOG)
end
end
end

0 comments on commit b90e56e

Please sign in to comment.