scons: Create a Configure checker for pkg-config.
authorGabe Black <gabe.black@gmail.com>
Sun, 7 Feb 2021 10:58:47 +0000 (02:58 -0800)
committerGabe Black <gabe.black@gmail.com>
Thu, 11 Feb 2021 19:33:24 +0000 (19:33 +0000)
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>
SConstruct
site_scons/gem5_scons/configure.py

index 9e3af3768f217095de95e087520d052e0400ac9c..27816bfb5852dcb0f94dac7b0c4d8f8cd8f0bcb2 100755 (executable)
@@ -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
index cebbb12ed1058f02aad5f10954a2a764c73e6ef0..7bf97b2a61772b9af24ae807192b3eaf6d223369 100644 (file)
@@ -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)