scons: Create a Configure checker for pkg-config.

This will check if a pkg-config package exists at all, and then if it
does will attempt to use the supplied pkg-config arguments and
ParseConfig to set up the environment as needed.

Change-Id: I1495e5370b60dcebb1c9ce38517e84d727abc2fd
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/40866
Tested-by: kokoro <noreply+kokoro@google.com>
Maintainer: Gabe Black <gabe.black@gmail.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
This commit is contained in:
Gabe Black
2021-02-07 02:58:47 -08:00
parent 7ebcb83ac3
commit d7df1ebabb
2 changed files with 34 additions and 22 deletions

View File

@@ -484,14 +484,7 @@ try:
# check go a library config check and at that point the test # check go a library config check and at that point the test
# will fail if libprotobuf cannot be found. # will fail if libprotobuf cannot be found.
if have_pkg_config: if have_pkg_config:
try: conf.CheckPkgConfig('protobuf', '--cflags', '--libs-only-L')
# Attempt to establish what linking flags to add for
# protobuf
# using pkg-config
main.ParseConfig(
'pkg-config --cflags --libs-only-L protobuf')
except:
warning('pkg-config could not get protobuf flags.')
except Exception as e: except Exception as e:
warning('While checking protoc version:', str(e)) warning('While checking protoc version:', str(e))
main['HAVE_PROTOC'] = False main['HAVE_PROTOC'] = False
@@ -724,23 +717,13 @@ def is_isa_kvm_compatible(isa):
main['HAVE_PERF_ATTR_EXCLUDE_HOST'] = conf.CheckMember( main['HAVE_PERF_ATTR_EXCLUDE_HOST'] = conf.CheckMember(
'linux/perf_event.h', 'struct perf_event_attr', 'exclude_host') 'linux/perf_event.h', 'struct perf_event_attr', 'exclude_host')
def check_hdf5_pkg(name):
print("Checking for %s using pkg-config..." % name, end="")
try:
main.ParseConfig('pkg-config --cflags-only-I --libs-only-L %s' % name)
except:
print(" no")
return False
print(" yes")
return True
# Check if there is a pkg-config configuration for hdf5. If we find # Check if there is a pkg-config configuration for hdf5. If we find
# it, setup the environment to enable linking and header inclusion. We # it, setup the environment to enable linking and header inclusion. We
# don't actually try to include any headers or link with hdf5 at this # don't actually try to include any headers or link with hdf5 at this
# stage. # stage.
if have_pkg_config: if have_pkg_config:
if not check_hdf5_pkg('hdf5-serial'): conf.CheckPkgConfig(['hdf5-serial', 'hdf5'],
check_hdf5_pkg('hdf5') '--cflags-only-I', '--libs-only-L')
# Check if the HDF5 libraries can be found. This check respects the # Check if the HDF5 libraries can be found. This check respects the
# include path and library path provided by pkg-config. We perform # include path and library path provided by pkg-config. We perform

View File

@@ -41,6 +41,7 @@
import os import os
import SCons.Script import SCons.Script
import SCons.Util
def CheckCxxFlag(context, flag, autoadd=True): def CheckCxxFlag(context, flag, autoadd=True):
context.Message("Checking for compiler %s support... " % flag) context.Message("Checking for compiler %s support... " % flag)
@@ -106,6 +107,33 @@ main(int argc, char **argv) {
else: else:
return tuple(map(int, ret[1].split("."))) return tuple(map(int, ret[1].split(".")))
def CheckPkgConfig(context, pkgs, *args):
if not SCons.Util.is_List(pkgs):
pkgs = [pkgs]
assert(pkgs)
for pkg in pkgs:
context.Message('Checking for pkg-config package %s... ' % pkg)
ret = context.TryAction('pkg-config %s' % pkg)[0]
if not ret:
context.Result(ret)
continue
if len(args) == 0:
break
cmd = ' '.join(['pkg-config'] + list(args) + [pkg])
try:
context.env.ParseConfig(cmd)
ret = 1
context.Result(ret)
break
except Exception as e:
ret = 0
context.Result(ret)
return ret
def Configure(env, *args, **kwargs): def Configure(env, *args, **kwargs):
kwargs.setdefault('conf_dir', kwargs.setdefault('conf_dir',
os.path.join(env['BUILDROOT'], '.scons_config')) os.path.join(env['BUILDROOT'], '.scons_config'))
@@ -113,10 +141,11 @@ def Configure(env, *args, **kwargs):
os.path.join(env['BUILDROOT'], 'scons_config.log')) os.path.join(env['BUILDROOT'], 'scons_config.log'))
kwargs.setdefault('custom_tests', {}) kwargs.setdefault('custom_tests', {})
kwargs['custom_tests'].update({ kwargs['custom_tests'].update({
'CheckMember' : CheckMember,
'CheckPythonLib' : CheckPythonLib,
'CheckCxxFlag' : CheckCxxFlag, 'CheckCxxFlag' : CheckCxxFlag,
'CheckLinkFlag' : CheckLinkFlag, 'CheckLinkFlag' : CheckLinkFlag,
'CheckMember' : CheckMember,
'CheckPkgConfig' : CheckPkgConfig,
'CheckPythonLib' : CheckPythonLib,
}) })
conf = SCons.Script.Configure(env, *args, **kwargs) conf = SCons.Script.Configure(env, *args, **kwargs)