scons: Expose pkg-config in a simpler manner.
authorJosé Fonseca <jfonseca@vmware.com>
Thu, 30 Jun 2011 16:36:37 +0000 (17:36 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Thu, 30 Jun 2011 16:36:37 +0000 (17:36 +0100)
17 files changed:
scons/custom.py
scons/gallium.py
src/gallium/drivers/r600/SConscript
src/gallium/state_trackers/dri/drm/SConscript
src/gallium/state_trackers/egl/SConscript
src/gallium/state_trackers/xorg/SConscript
src/gallium/targets/SConscript.dri
src/gallium/targets/dri-i915/SConscript
src/gallium/targets/dri-i965/SConscript
src/gallium/targets/dri-swrast/SConscript
src/gallium/targets/egl-static/SConscript
src/gallium/targets/xorg-vmwgfx/SConscript
src/gallium/winsys/i915/drm/SConscript
src/gallium/winsys/i965/drm/SConscript
src/gallium/winsys/r600/drm/SConscript
src/gallium/winsys/radeon/drm/SConscript
src/gallium/winsys/svga/drm/SConscript

index 029f99b99463985862978f64817081aa337ea440..df7ac93bb006492e401f8e66332b4a7b462e31c3 100644 (file)
@@ -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()
index 7b239635b9c0e98bed23d421cd76acad52ef17bd..8cd3bc7f6e0dd3385c82f5589fefb9b9b89b6f8b 100755 (executable)
@@ -104,41 +104,6 @@ def num_jobs():
     return 1
 
 
-def pkg_config_modules(env, name, modules):
-    '''Simple wrapper for pkg-config.'''
-
-    env[name] = False
-
-    if env['platform'] == 'windows':
-        return
-
-    if not env.Detect('pkg-config'):
-        return
-
-    if subprocess.call(["pkg-config", "--exists", ' '.join(modules)]) != 0:
-        return
-
-    # Put -I and -L flags directly into the environment, as these don't affect
-    # the compilation of targets that do not use them
-    try:
-        env.ParseConfig('pkg-config --cflags-only-I --libs-only-L ' + ' '.join(modules))
-    except OSError:
-        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-only-other --libs-only-l --libs-only-other ' + ' '.join(modules))
-    except OSError:
-        return
-    prefix = name.upper() + '_'
-    for flag_name, flag_value in flags.iteritems():
-        env[prefix + flag_name] = flag_value
-
-    env[name] = True
-
-
-
 def generate(env):
     """Common environment generation code"""
 
@@ -637,19 +602,21 @@ def generate(env):
     if env['llvm']:
         env.Tool('llvm')
     
-    pkg_config_modules(env, 'x11', ['x11', 'xext'])
-    pkg_config_modules(env, 'drm', ['libdrm'])
-    pkg_config_modules(env, 'drm_intel', ['libdrm_intel'])
-    pkg_config_modules(env, 'drm_radeon', ['libdrm_radeon'])
-    pkg_config_modules(env, 'xorg', ['xorg-server'])
-    pkg_config_modules(env, 'kms', ['libkms'])
-
-    env['dri'] = env['x11'] and env['drm']
-
     # Custom builders and methods
     env.Tool('custom')
     createInstallMethods(env)
 
+    env.PkgCheckModules('X11', ['x11', 'xext', 'xdamage', 'xfixes'])
+    env.PkgCheckModules('XF86VIDMODE', ['xxf86vm'])
+    env.PkgCheckModules('DRM', ['libdrm'])
+    env.PkgCheckModules('DRM_INTEL', ['libdrm_intel'])
+    env.PkgCheckModules('DRM_RADEON', ['libdrm_radeon'])
+    env.PkgCheckModules('XORG', ['xorg-server'])
+    env.PkgCheckModules('KMS', ['libkms'])
+    env.PkgCheckModules('UDEV', ['libudev'])
+
+    env['dri'] = env['x11'] and env['drm']
+
     # for debugging
     #print env.Dump()
 
index 0135808f10afa9f562aa235e1095b47333126e45..19f07b2bef8f306d90f368e70f5a5c8a117b6d25 100644 (file)
@@ -2,11 +2,7 @@ Import('*')
 
 env = env.Clone()
 
-try:
-    env.ParseConfig('pkg-config --cflags libdrm_radeon')
-except OSError:
-    print 'warning: not building r600'
-    Return()
+env.PkgUseModules('DRM_RADEON')
 
 env.Append(CPPPATH = [
     '#/include',
index b188f76f910a85df0ab85a2fea003a1500e27c98..c63918a0e187ed60a90f8d6b8c16a84366043dcf 100644 (file)
@@ -5,7 +5,7 @@ Import('*')
 
 env = env.Clone()
 
-env.ParseConfig('pkg-config --cflags --libs libdrm')
+env.PkgUseModules(['DRM'])
 
 env.Append(CPPPATH = [
     '#/src/mapi',
index f795fe00620275e0ecb6a66ac3f907756716e1c3..c04fec637c106fe08f55c1a3adc776021ca03459 100644 (file)
@@ -40,6 +40,7 @@ else:
             env.Append(CPPDEFINES = ['GLX_DIRECT_RENDERING'])
             sources.append(['#/src/glx/dri2.c'])
     if env['drm']:
+        env.PkgUseModules('DRM')
         env.Append(CPPDEFINES = ['HAVE_DRM_BACKEND'])
         env.Append(CPPPATH = [
             '#/src/gbm/main',
index 19315694b7cd34bcba77a9fe148be3c3efce7033..4ea4ec4ee8b9e3c7ef6a80560ef186b7be469fb0 100644 (file)
@@ -9,10 +9,11 @@ env.Append(CPPPATH = [
     '#/src/mesa',
 ])
 
-env.ParseConfig('pkg-config --cflags --libs libdrm xorg-server')
+env.PkgUseModules(['DRM', 'XORG'])
 
-if env['kms']:
+if env['HAVE_KMS']:
     env.Append(CPPDEFINES = ['HAVE_LIBKMS'])
+    env.PkgUseModules(['KMS'])
 
 conf = env.Configure()
 
index 101863a68489c3dd9775da2b04bd4b793e3d811c..5ad17f8b3ae213ae5593b0acc5066f36507855ba 100644 (file)
@@ -29,7 +29,7 @@ drienv.Replace(CPPPATH = [
     '#src/egl/drivers/dri',
 ])
 
-drienv.ParseConfig('pkg-config --cflags --libs libdrm')
+drienv.PkgUseModules('DRM')
 
 dri_common_utils = drienv.SharedObject(
     target = 'utils.o',
index ab60013830e2de5e3a16aac5fddaf7ce306390e3..b3bd3dd58268654238abbd2816774888c42c3a13 100644 (file)
@@ -2,7 +2,7 @@ Import('*')
 
 env = drienv.Clone()
 
-env.ParseConfig('pkg-config --cflags --libs libdrm_intel')
+env.PkgUseModules('DRM_INTEL')
 
 env.Append(CPPDEFINES = ['GALLIUM_RBUG', 'GALLIUM_TRACE', 'GALLIUM_GALAHAD'])
 
@@ -26,4 +26,4 @@ module = env.LoadableModule(
     SHLIBPREFIX = '',
 )
 
-env.Alias('dri-i915', module)
\ No newline at end of file
+env.Alias('dri-i915', module)
index 669f70d6b8dee219adcc3dab2fae93dcdcf1ef8d..01a458db228def930fb491256985b87317db3183 100644 (file)
@@ -2,7 +2,7 @@ Import('*')
 
 env = drienv.Clone()
 
-env.ParseConfig('pkg-config --cflags --libs libdrm_intel')
+env.PkgUseModules('DRM_INTEL')
 
 env.Append(CPPDEFINES = [
     'GALLIUM_SOFTPIPE',
@@ -29,4 +29,4 @@ module = env.LoadableModule(
     SHLIBPREFIX = '',
 )
 
-env.Alias('dri-i965', module)
\ No newline at end of file
+env.Alias('dri-i965', module)
index b67483800e4f082fe88fab69533a47ff7f183601..33acc614e76756f1b74595da28a06268e0178650 100644 (file)
@@ -39,4 +39,6 @@ module = env.LoadableModule(
     SHLIBPREFIX = '',
 )
 
+module = env.InstallSharedLibrary(module)
+
 env.Alias('dri-swrast', module)
index cbd98cc416ab37647e5807e25347416b92a979b5..dfd0543723131764fb1400973bb9095fbfde310d 100644 (file)
@@ -79,21 +79,17 @@ if True:
     openvg_name = 'OpenVG' if env['platform'] != 'windows' else 'libOpenVG'
     env.Prepend(LIBS = [openvg_name, st_vega])
 
-if env['x11']:
+if env['HAVE_X11']:
     env.Prepend(LIBS = [
         ws_xlib,
-        env['X11_LIBS'],
     ])
-
-if env['dri']:
-    env.ParseConfig('pkg-config --cflags --libs xfixes')
+    env.PkgUseModules('X11')
 
 # pipe drivers
-if env['drm']:
-    env.ParseConfig('pkg-config --cflags --libs libdrm')
+if env['HAVE_DRM']:
+    env.PkgUseModules('DRM')
 
-    if env['drm_intel']:
-        env.ParseConfig('pkg-config --cflags --libs libdrm_intel')
+    if env['HAVE_DRM_INTEL']:
         env.Append(CPPDEFINES = ['_EGL_PIPE_I915', '_EGL_PIPE_I965'])
         env.Prepend(LIBS = [
             i915drm,
@@ -103,7 +99,7 @@ if env['drm']:
             ws_wrapper,
         ])
 
-    if env['drm_radeon']:
+    if env['HAVE_DRM_RADEON']:
         env.Append(CPPDEFINES = ['_EGL_PIPE_R300', '_EGL_PIPE_R600'])
         env.Prepend(LIBS = [
             radeonwinsys,
index 099d49cf1b7672726986ba3313073cf16f749b67..41f4326ee8618312107a1ac28432f015f4391367 100644 (file)
@@ -4,10 +4,10 @@ Import('*')
 
 env = env.Clone()
 
-env.ParseConfig('pkg-config --cflags --libs libdrm xorg-server')
+env.PkgUseModules(['DRM', 'XORG'])
 
 if env['kms']:
-    env.ParseConfig('pkg-config --cflags --libs libkms')
+    env.PkgUseModules(['KMS'])
 
 env.Prepend(CPPPATH = [
     '#/include',
index d8f5885b62c8469d5a3fe8fc7a26c7cc0e90eea4..15c97998fd8f710dbf2768e166ecddd439229237 100644 (file)
@@ -2,7 +2,7 @@ Import('*')
 
 env = env.Clone()
 
-env.ParseConfig('pkg-config --cflags libdrm')
+env.PkgUseModules('DRM')
 
 i915drm_sources = [
     'i915_drm_batchbuffer.c',
index 785be449f70ea50d91b54540e4d7a013f888eba1..a0f32ded40248226e2926c93ea5e9c977c0489c1 100644 (file)
@@ -2,7 +2,7 @@ Import('*')
 
 env = env.Clone()
 
-env.ParseConfig('pkg-config --cflags libdrm')
+env.PkgUseModules('DRM')
 
 i965drm_sources = [
     'i965_drm_buffer.c',
index cc9a06a239341d4ffb889298aa6d7c369155e5ea..f55bb2652261ffe39f490d60f959c86163338ca7 100644 (file)
@@ -13,11 +13,7 @@ r600_sources = [
     'r600_bomgr.c',
 ]
 
-try:
-    env.ParseConfig('pkg-config --cflags libdrm_radeon')
-except OSError:
-    print 'warning: not building r600g'
-    Return()
+env.PkgUseModules('DRM_RADEON')
 
 env.Append(CPPPATH = '#/src/gallium/drivers/r600')
 
index 39a8c711b84bc11450b9995714839d336c714854..2edb1e94645ef5dc6d5b8cfed51d8ef98b0b7624 100644 (file)
@@ -8,11 +8,7 @@ radeon_sources = [
     'radeon_drm_winsys.c',
 ]
 
-try:
-    env.ParseConfig('pkg-config --cflags libdrm')
-except:
-    print 'warning: not building Gallium Radeon'
-    Return()
+env.PkgUseModules('DRM')
 
 radeonwinsys = env.ConvenienceLibrary(
     target ='radeonwinsys',
index b049ea60aa8d98cdf32c3d6965bd60f02a1d15d3..3e25c8aa7484ecac8e42cd93efee55838d996b4d 100644 (file)
@@ -2,7 +2,7 @@ Import('*')
 
 env = env.Clone()
 
-env.ParseConfig('pkg-config --cflags libdrm')
+env.PkgUseModules('DRM')
 
 if env['gcc']:
     env.Append(CCFLAGS = ['-fvisibility=hidden'])