scons: Make LLVM a black-white dependency.
authorJosé Fonseca <jfonseca@vmware.com>
Sat, 10 Apr 2010 01:41:39 +0000 (02:41 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Sun, 11 Apr 2010 08:17:34 +0000 (17:17 +0900)
Now that draw depends on llvm it is very difficult to correctly handle
broken llvm installations. Either the user requests LLVM and it needs to
supply a working installation. Or it doesn't, and it gets no LLVM
accelerate pipe drivers.

19 files changed:
SConstruct
common.py
configs/linux-llvm
scons/gallium.py
scons/llvm.py
src/gallium/auxiliary/SConscript
src/gallium/auxiliary/draw/draw_context.h
src/gallium/auxiliary/draw/draw_llvm.h
src/gallium/auxiliary/draw/draw_private.h
src/gallium/auxiliary/draw/draw_pt.c
src/gallium/auxiliary/draw/draw_vs_llvm.c
src/gallium/auxiliary/gallivm/lp_bld.h
src/gallium/drivers/llvmpipe/SConscript
src/gallium/drivers/sw/SConscript
src/gallium/state_trackers/python/SConscript
src/gallium/targets/dri-swrast/SConscript
src/gallium/targets/graw-xlib/SConscript
src/gallium/targets/libgl-gdi/SConscript
src/gallium/targets/libgl-xlib/SConscript

index 8b7ae7d112bed9aa21fe8a20b1338868dbae7ee5..ebced16c0ce99ee47af747c73b3ff522333a03e1 100644 (file)
@@ -81,15 +81,6 @@ debug = env['debug']
 dri = env['dri']
 machine = env['machine']
 platform = env['platform']
-drawllvm = 'llvmpipe' in env['drivers']
-
-# LLVM support in the Draw module
-if drawllvm:
-        env.Tool('llvm')
-        if not env.has_key('LLVM_VERSION'):
-           drawllvm = False
-if drawllvm:
-        env.Append(CFLAGS = ['-DDRAW_LLVM=1'])
 
 # derived options
 x86 = machine == 'x86'
@@ -102,7 +93,6 @@ Export([
        'x86', 
        'ppc', 
        'dri', 
-       'drawllvm',
        'platform',
        'gcc',
        'msvc',
@@ -167,10 +157,6 @@ if platform in ('posix', 'linux', 'freebsd', 'darwin'):
                'dl',
        ])
 
-# LLVM support in the Draw module
-if drawllvm:
-    env.Append(CPPDEFINES = ['DRAW_LLVM'])
-
 # for debugging
 #print env.Dump()
 
index 97389ed5001b04e3f0c07c86c0ae8d6af0e1ebfb..4b6960c66c80f86e378626263fdd2d51f92ef5d4 100644 (file)
--- a/common.py
+++ b/common.py
@@ -3,6 +3,7 @@
 
 import os
 import os.path
+import subprocess
 import sys
 import platform as _platform
 
@@ -33,6 +34,11 @@ else:
        default_machine = _platform.machine()
 default_machine = _machine_map.get(default_machine, 'generic')
 
+if 'LLVM' in os.environ or subprocess.call(['llvm-config', '--version'], stdout=subprocess.PIPE) == 0:
+    default_llvm = 'yes'
+else:
+    default_llvm = 'no'
+
 if default_platform in ('linux', 'freebsd'):
        default_dri = 'yes'
 elif default_platform in ('winddk', 'windows', 'wince', 'darwin'):
@@ -61,5 +67,5 @@ def AddOptions(opts):
        opts.Add(EnumOption('platform', 'target platform', default_platform,
                                                                                         allowed_values=('linux', 'cell', 'windows', 'winddk', 'wince', 'darwin', 'embedded')))
        opts.Add('toolchain', 'compiler toolchain', 'default')
-       opts.Add(BoolOption('llvm', 'use LLVM', 'no'))
+       opts.Add(BoolOption('llvm', 'use LLVM', default_llvm))
        opts.Add(BoolOption('dri', 'build DRI drivers', default_dri))
index 3a15f1d6d8bab8c0cbe726bd2f8cb6249e783c67..1b15a308f377c5e51b8f9388f80c29db89d4f931 100644 (file)
@@ -12,7 +12,7 @@ GALLIUM_DRIVERS_DIRS += llvmpipe
 OPT_FLAGS = -O3 -ansi -pedantic
 ARCH_FLAGS = -mmmx -msse -msse2 -mstackrealign
 
-DEFINES += -DNDEBUG -DGALLIUM_LLVMPIPE -DDRAW_LLVM -DHAVE_UDIS86
+DEFINES += -DNDEBUG -DGALLIUM_LLVMPIPE -DHAVE_UDIS86
 
 # override -std=c99
 CFLAGS += -std=gnu99
index 925effc25d60c9b11ce9bdf60cb06047d1a438a6..dd7275460dae08b595f2db04256c95f3502976ec 100644 (file)
@@ -142,8 +142,6 @@ def generate(env):
     # configuration. See also http://www.scons.org/wiki/AdvancedBuildExample
     build_topdir = 'build'
     build_subdir = env['platform']
-    if env['llvm']:
-        build_subdir += "-llvm"
     if env['machine'] != 'generic':
         build_subdir += '-' + env['machine']
     if env['debug']:
@@ -471,6 +469,10 @@ def generate(env):
     # Default libs
     env.Append(LIBS = [])
 
+    # Load LLVM
+    if env['llvm']:
+        env.Tool('llvm')
+
     # Custom builders and methods
     env.Tool('custom')
     createInstallMethods(env)
index 01eae2403a7a79d89aa1b4bb036bcbe6e24004ab..d88d6e3a5ad68ed58bc220c544258a25289b8774 100644 (file)
@@ -63,13 +63,14 @@ def generate(env):
     if env['platform'] == 'windows':
         # XXX: There is no llvm-config on Windows, so assume a standard layout
         if llvm_dir is None:
-            return
+            print 'scons: LLVM environment variable must be specified when building for windows'
+            env.Exit(1)
 
         # Try to determine the LLVM version from llvm/Config/config.h
         llvm_config = os.path.join(llvm_dir, 'include/llvm/Config/config.h')
         if not os.path.exists(llvm_config):
             print 'scons: could not find %s' % llvm_config
-            return
+            env.Exit(1)
         llvm_version_re = re.compile(r'^#define PACKAGE_VERSION "([^"]*)"')
         llvm_version = None
         for line in open(llvm_config, 'rt'):
@@ -80,7 +81,7 @@ def generate(env):
                 break
         if llvm_version is None:
             print 'scons: could not determine the LLVM version from %s' % llvm_config
-            return
+            env.Exit(1)
 
         env.Prepend(CPPPATH = [os.path.join(llvm_dir, 'include')])
         env.AppendUnique(CPPDEFINES = [
@@ -129,7 +130,11 @@ def generate(env):
                 # debug build we'll be linking against LIBCMTD, so disable
                 # that.
                 env.Append(LINKFLAGS = ['/nodefaultlib:LIBCMT'])
-    elif env.Detect('llvm-config'):
+    else:
+        if not env.Detect('llvm-config'):
+            print 'scons: llvm-config script not found' % llvm_version
+            env.Exit(1)
+
         llvm_version = env.backtick('llvm-config --version').rstrip()
         llvm_version = distutils.version.LooseVersion(llvm_version)
 
@@ -138,11 +143,10 @@ def generate(env):
             env.ParseConfig('llvm-config --libs jit interpreter nativecodegen bitwriter')
             env.ParseConfig('llvm-config --ldflags')
         except OSError:
-            print 'llvm-config version %s failed' % llvm_version
+            print 'scons: llvm-config version %s failed' % llvm_version
+            env.Exit(1)
         else:
             env['LINK'] = env['CXX']
-    else:
-        return
 
     assert llvm_version is not None
 
index bd8139f1de80112cb76692e396e261c54e6176c5..3ad060032680bfa1967ac52fd3fad90af5d57e59 100644 (file)
@@ -191,7 +191,7 @@ source = [
     'target-helpers/wrap_screen.c',
 ]
 
-if drawllvm:
+if env['llvm']:
     source += [
     'gallivm/lp_bld_alpha.c',
     'gallivm/lp_bld_arit.c',
index a0e1c1c59b94d8b97f491529d721dbd5ab6df37e..1af4961716c55626ec1534c72197417e03349d2f 100644 (file)
@@ -196,7 +196,7 @@ boolean draw_need_pipeline(const struct draw_context *draw,
                            const struct pipe_rasterizer_state *rasterizer,
                            unsigned prim );
 
-#ifdef DRAW_LLVM
+#ifdef HAVE_LLVM
 /*******************************************************************************
  * LLVM integration
  */
index d1cbac4af97025d21d83f542fe57d35a01ca2103..28b9044a81eeb482a0c965e098aee3fbeb3b2b1b 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef DRAW_LLVM_H
-#define DRAW_LLVM_H
+#ifndef HAVE_LLVM_H
+#define HAVE_LLVM_H
 
 #include "draw/draw_private.h"
 
index 7e24e5fd6fcdec6c0253dc19ca6d109fd51857c1..da64102d9d1ce7f56bff5fea8b150af2da7b2aec 100644 (file)
@@ -46,7 +46,7 @@
 
 #include "tgsi/tgsi_scan.h"
 
-#ifdef DRAW_LLVM
+#ifdef HAVE_LLVM
 #include <llvm-c/ExecutionEngine.h>
 #endif
 
@@ -241,7 +241,7 @@ struct draw_context
 
    unsigned instance_id;
 
-#ifdef DRAW_LLVM
+#ifdef HAVE_LLVM
    LLVMExecutionEngineRef engine;
 #endif
    void *driver_private;
index a60a3b2a2b17a56246dc786899c2a55584f45735..43f6c5650a0f62969945f6fef0bba59ea16040df 100644 (file)
@@ -140,7 +140,7 @@ boolean draw_pt_init( struct draw_context *draw )
    if (!draw->pt.middle.fetch_shade_emit)
       return FALSE;
 
-#if DRAW_LLVM
+#if HAVE_LLVM
    draw->pt.middle.general = draw_pt_fetch_pipeline_or_emit_llvm( draw );
 #else
    draw->pt.middle.general = NULL;
index 0c483de40713d1158c57abd8fbb0bcf6e4c3f224..2a3b6b39b95301b45e7cdd08716bca8799fe32a9 100644 (file)
@@ -40,7 +40,7 @@
 
 #include "tgsi/tgsi_parse.h"
 
-#ifdef DRAW_LLVM
+#ifdef HAVE_LLVM
 
 struct draw_llvm_vertex_shader {
    struct draw_vertex_shader base;
index 70a4960f913e5c8a6eeae4a0d9d5d703253ad59c..2fa682f400950a38a055040bd5efaf712f605ee3 100644 (file)
@@ -38,9 +38,9 @@
 #include <llvm-c/Core.h>  
 
 
-/** Set version to 0 if missing to avoid #ifdef HAVE_LLVM everywhere */
+/** Ensure HAVE_LLVM is set to avoid #ifdef HAVE_LLVM everywhere */
 #ifndef HAVE_LLVM
-#define HAVE_LLVM 0x0207
+#error "HAVE_LLVM should be set with LLVM's version number, e.g. (0x0207 for 2.7)"
 #endif
 
 
index f5a38d05d4850587bee1f6c2856c30fd1b587741..8e3267c8438e601b2b09df85d0023974e4ca3eb0 100644 (file)
@@ -1,12 +1,11 @@
 Import('*')
 
-env = env.Clone()
-
-env.Tool('llvm')
-if not env.has_key('LLVM_VERSION'):
-    print 'warning: LLVM not found: not building llvmpipe'
+if not env['llvm']:
+    print 'warning: LLVM disabled: not building llvmpipe'
     Return()
 
+env = env.Clone()
+
 env.Tool('udis86')
 
 env.Append(CPPPATH = ['.'])
index 6fbbdf3cc46622edb46458c8f86bb1779829de2c..cea237aa17141a30a138d4d6fb88d6491624b8b5 100644 (file)
@@ -23,11 +23,9 @@ if 'softpipe' in env['drivers']:
     env.Prepend(LIBS = [softpipe])
 
 if 'llvmpipe' in env['drivers']:
-    env.Tool('llvm')
-    if 'LLVM_VERSION' in env:
-        env.Append(CPPDEFINES = 'GALLIUM_LLVMPIPE')
-        env.Tool('udis86')
-        env.Prepend(LIBS = [llvmpipe])
+    env.Append(CPPDEFINES = 'GALLIUM_LLVMPIPE')
+    env.Tool('udis86')
+    env.Prepend(LIBS = [llvmpipe])
     
 if 'cell' in env['drivers']:
     env.Append(CPPDEFINES = 'GALLIUM_CELL')
index 781f54bf2b9036f09ab95554ee28c8fe3f144c0b..bff97079f6b857febd3d9a3a5f07b42f0ecc0f20 100644 (file)
@@ -46,7 +46,6 @@ if 'python' in env['statetrackers']:
 
     if 'llvmpipe' in env['drivers']:
         env.Append(CPPDEFINES = ['HAVE_LLVMPIPE'])
-        env.Tool('llvm')
         env.Prepend(LIBS = [llvmpipe])
     if 'softpipe' in env['drivers']:
         env.Append(CPPDEFINES = ['HAVE_SOFTPIPE'])
index 94ff99a0a905a2120f09b593d4305392fd2c43e3..9a3838d64e20c34c7f237a10549919b6e809be03 100644 (file)
@@ -25,11 +25,9 @@ if 'softpipe' in env['drivers']:
     env.Prepend(LIBS = [softpipe])
 
 if 'llvmpipe' in env['drivers']:
-    env.Tool('llvm')
-    if 'LLVM_VERSION' in env:
-        env.Append(CPPDEFINES = 'GALLIUM_LLVMPIPE')
-        env.Tool('udis86')
-        env.Prepend(LIBS = [llvmpipe])
+    env.Append(CPPDEFINES = 'GALLIUM_LLVMPIPE')
+    env.Tool('udis86')
+    env.Prepend(LIBS = [llvmpipe])
 
 swrastg_sources = [
     'swrast_drm_api.c'
index 24cea92f9071098d13ba1dbd2b93aef4096783f5..1b5350a9a482b963e56031f81c4b33b56d7068e2 100644 (file)
@@ -33,11 +33,9 @@ if 'softpipe' in env['drivers']:
     env.Prepend(LIBS = [softpipe])
 
 if 'llvmpipe' in env['drivers']:
-    env.Tool('llvm')
-    if 'LLVM_VERSION' in env:
-        env.Append(CPPDEFINES = 'GALLIUM_LLVMPIPE')
-        env.Tool('udis86')
-        env.Prepend(LIBS = [llvmpipe])
+    env.Append(CPPDEFINES = 'GALLIUM_LLVMPIPE')
+    env.Tool('udis86')
+    env.Prepend(LIBS = [llvmpipe])
 
 # Need this for trace, identity drivers referenced by
 # gallium_wrap_screen().
index 21b4eb2abee034d33757a54d05eb22968285fdb8..a6ef1f2406a92c837f1aa72c2180037c6233444a 100644 (file)
@@ -27,10 +27,8 @@ if env['platform'] == 'windows':
         drivers = [softpipe]
 
     if 'llvmpipe' in env['drivers']:
-        env.Tool('llvm')
-        if 'LLVM_VERSION' in env:
-            sources = ['gdi_llvmpipe_winsys.c']
-            drivers = [llvmpipe]
+        sources = ['gdi_llvmpipe_winsys.c']
+        drivers = [llvmpipe]
 
     if not sources or not drivers:
         print 'warning: softpipe or llvmpipe not selected, gdi winsys disabled'
index c1614d4a9f72f10304508fab4827c4ad08f87f6d..0d2ffd20709db404dc83ba0419bff67e934af62e 100644 (file)
@@ -50,11 +50,9 @@ if 'softpipe' in env['drivers']:
     env.Prepend(LIBS = [softpipe])
 
 if 'llvmpipe' in env['drivers']:
-    env.Tool('llvm')
-    if 'LLVM_VERSION' in env:
-        env.Append(CPPDEFINES = 'GALLIUM_LLVMPIPE')
-        env.Tool('udis86')
-        env.Prepend(LIBS = [llvmpipe])
+    env.Append(CPPDEFINES = 'GALLIUM_LLVMPIPE')
+    env.Tool('udis86')
+    env.Prepend(LIBS = [llvmpipe])
     
 if 'cell' in env['drivers']:
     env.Append(CPPDEFINES = 'GALLIUM_CELL')