From d7df1ebabb4d109930b568a5bdffeb31e6db2a85 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Sun, 7 Feb 2021 02:58:47 -0800 Subject: [PATCH] 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 Maintainer: Gabe Black Reviewed-by: Andreas Sandberg --- SConstruct | 23 +++------------------ site_scons/gem5_scons/configure.py | 33 ++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/SConstruct b/SConstruct index 9e3af3768..27816bfb5 100755 --- a/SConstruct +++ b/SConstruct @@ -484,14 +484,7 @@ try: # check go a library config check and at that point the test # will fail if libprotobuf cannot be found. if have_pkg_config: - try: - # 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.') + conf.CheckPkgConfig('protobuf', '--cflags', '--libs-only-L') except Exception as e: warning('While checking protoc version:', str(e)) main['HAVE_PROTOC'] = False @@ -724,23 +717,13 @@ def is_isa_kvm_compatible(isa): main['HAVE_PERF_ATTR_EXCLUDE_HOST'] = conf.CheckMember( '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 # 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 # stage. if have_pkg_config: - if not check_hdf5_pkg('hdf5-serial'): - check_hdf5_pkg('hdf5') + conf.CheckPkgConfig(['hdf5-serial', 'hdf5'], + '--cflags-only-I', '--libs-only-L') # Check if the HDF5 libraries can be found. This check respects the # include path and library path provided by pkg-config. We perform diff --git a/site_scons/gem5_scons/configure.py b/site_scons/gem5_scons/configure.py index cebbb12ed..7bf97b2a6 100644 --- a/site_scons/gem5_scons/configure.py +++ b/site_scons/gem5_scons/configure.py @@ -41,6 +41,7 @@ import os import SCons.Script +import SCons.Util def CheckCxxFlag(context, flag, autoadd=True): context.Message("Checking for compiler %s support... " % flag) @@ -106,6 +107,33 @@ main(int argc, char **argv) { else: 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): kwargs.setdefault('conf_dir', os.path.join(env['BUILDROOT'], '.scons_config')) @@ -113,10 +141,11 @@ def Configure(env, *args, **kwargs): os.path.join(env['BUILDROOT'], 'scons_config.log')) kwargs.setdefault('custom_tests', {}) kwargs['custom_tests'].update({ - 'CheckMember' : CheckMember, - 'CheckPythonLib' : CheckPythonLib, 'CheckCxxFlag' : CheckCxxFlag, 'CheckLinkFlag' : CheckLinkFlag, + 'CheckMember' : CheckMember, + 'CheckPkgConfig' : CheckPkgConfig, + 'CheckPythonLib' : CheckPythonLib, }) conf = SCons.Script.Configure(env, *args, **kwargs) -- 2.30.2