summaryrefslogtreecommitdiffstats
path: root/scons/custom.py
diff options
context:
space:
mode:
authorJosé Fonseca <[email protected]>2011-06-30 17:36:37 +0100
committerJosé Fonseca <[email protected]>2011-06-30 17:36:37 +0100
commit235225ec935002b4669d14a48c9c20864a5496f8 (patch)
tree5c86cb6b91f65605a6e5d1a4c727a35f96516664 /scons/custom.py
parent2699fce0d69db5158427c8b6c8194b2eefc5e58b (diff)
scons: Expose pkg-config in a simpler manner.
Diffstat (limited to 'scons/custom.py')
-rw-r--r--scons/custom.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/scons/custom.py b/scons/custom.py
index 029f99b9946..df7ac93bb00 100644
--- a/scons/custom.py
+++ b/scons/custom.py
@@ -33,6 +33,8 @@ Custom builders and methods.
import os
import os.path
import re
+import sys
+import subprocess
import SCons.Action
import SCons.Builder
@@ -154,6 +156,79 @@ def createCodeGenerateMethod(env):
env.AddMethod(code_generate, 'CodeGenerate')
+def _pkg_check_modules(env, name, modules):
+ '''Simple wrapper for pkg-config.'''
+
+ env['HAVE_' + name] = False
+
+ # For backwards compatability
+ env[name.lower()] = False
+
+ if env['platform'] == 'windows':
+ return
+
+ if not env.Detect('pkg-config'):
+ return
+
+ if subprocess.call(["pkg-config", "--exists", ' '.join(modules)]) != 0:
+ return
+
+ # Other flags may affect the compilation of unrelated targets, so store
+ # them with a prefix, (e.g., XXX_CFLAGS, XXX_LIBS, etc)
+ try:
+ flags = env.ParseFlags('!pkg-config --cflags --libs ' + ' '.join(modules))
+ except OSError:
+ return
+ prefix = name + '_'
+ for flag_name, flag_value in flags.iteritems():
+ assert '_' not in flag_name
+ env[prefix + flag_name] = flag_value
+
+ env['HAVE_' + name] = True
+
+def pkg_check_modules(env, name, modules):
+
+ sys.stdout.write('Checking for %s...' % name)
+ _pkg_check_modules(env, name, modules)
+ result = env['HAVE_' + name]
+ sys.stdout.write(' %s\n' % ['no', 'yes'][int(bool(result))])
+
+ # XXX: For backwards compatability
+ env[name.lower()] = result
+
+
+def pkg_use_modules(env, names):
+ '''Search for all environment flags that match NAME_FOO and append them to
+ the FOO environment variable.'''
+
+ names = env.Flatten(names)
+
+ for name in names:
+ prefix = name + '_'
+
+ if not 'HAVE_' + name in env:
+ print 'Attempt to use unknown module %s' % name
+ env.Exit(1)
+
+ if not env['HAVE_' + name]:
+ print 'Attempt to use unavailable module %s' % name
+ env.Exit(1)
+
+ flags = {}
+ for flag_name, flag_value in env.Dictionary().iteritems():
+ if flag_name.startswith(prefix):
+ flag_name = flag_name[len(prefix):]
+ if '_' not in flag_name:
+ flags[flag_name] = flag_value
+ if flags:
+ env.MergeFlags(flags)
+
+
+def createPkgConfigMethods(env):
+ env.AddMethod(pkg_check_modules, 'PkgCheckModules')
+ env.AddMethod(pkg_use_modules, 'PkgUseModules')
+
+
def generate(env):
"""Common environment generation code"""
@@ -164,6 +239,7 @@ def generate(env):
# Custom builders and methods
createConvenienceLibBuilder(env)
createCodeGenerateMethod(env)
+ createPkgConfigMethods(env)
# for debugging
#print env.Dump()