Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. """gallium
  2.  
  3. Frontend-tool for Gallium3D architecture.
  4.  
  5. """
  6.  
  7. #
  8. # Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
  9. # All Rights Reserved.
  10. #
  11. # Permission is hereby granted, free of charge, to any person obtaining a
  12. # copy of this software and associated documentation files (the
  13. # "Software"), to deal in the Software without restriction, including
  14. # without limitation the rights to use, copy, modify, merge, publish,
  15. # distribute, sub license, and/or sell copies of the Software, and to
  16. # permit persons to whom the Software is furnished to do so, subject to
  17. # the following conditions:
  18. #
  19. # The above copyright notice and this permission notice (including the
  20. # next paragraph) shall be included in all copies or substantial portions
  21. # of the Software.
  22. #
  23. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  24. # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25. # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  26. # IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
  27. # ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  28. # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  29. # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  30. #
  31.  
  32.  
  33. import distutils.version
  34. import os
  35. import os.path
  36. import re
  37. import subprocess
  38. import platform as _platform
  39.  
  40. import SCons.Action
  41. import SCons.Builder
  42. import SCons.Scanner
  43.  
  44.  
  45. def symlink(target, source, env):
  46.     target = str(target[0])
  47.     source = str(source[0])
  48.     if os.path.islink(target) or os.path.exists(target):
  49.         os.remove(target)
  50.     os.symlink(os.path.basename(source), target)
  51.  
  52. def install(env, source, subdir):
  53.     target_dir = os.path.join(env.Dir('#.').srcnode().abspath, env['build_dir'], subdir)
  54.     return env.Install(target_dir, source)
  55.  
  56. def install_program(env, source):
  57.     return install(env, source, 'bin')
  58.  
  59. def install_shared_library(env, sources, version = ()):
  60.     targets = []
  61.     install_dir = os.path.join(env.Dir('#.').srcnode().abspath, env['build_dir'])
  62.     version = tuple(map(str, version))
  63.     if env['SHLIBSUFFIX'] == '.dll':
  64.         dlls = env.FindIxes(sources, 'SHLIBPREFIX', 'SHLIBSUFFIX')
  65.         targets += install(env, dlls, 'bin')
  66.         libs = env.FindIxes(sources, 'LIBPREFIX', 'LIBSUFFIX')
  67.         targets += install(env, libs, 'lib')
  68.     else:
  69.         for source in sources:
  70.             target_dir =  os.path.join(install_dir, 'lib')
  71.             target_name = '.'.join((str(source),) + version)
  72.             last = env.InstallAs(os.path.join(target_dir, target_name), source)
  73.             targets += last
  74.             while len(version):
  75.                 version = version[:-1]
  76.                 target_name = '.'.join((str(source),) + version)
  77.                 action = SCons.Action.Action(symlink, "  Symlinking $TARGET ...")
  78.                 last = env.Command(os.path.join(target_dir, target_name), last, action)
  79.                 targets += last
  80.     return targets
  81.  
  82.  
  83. def createInstallMethods(env):
  84.     env.AddMethod(install_program, 'InstallProgram')
  85.     env.AddMethod(install_shared_library, 'InstallSharedLibrary')
  86.  
  87.  
  88. def num_jobs():
  89.     try:
  90.         return int(os.environ['NUMBER_OF_PROCESSORS'])
  91.     except (ValueError, KeyError):
  92.         pass
  93.  
  94.     try:
  95.         return os.sysconf('SC_NPROCESSORS_ONLN')
  96.     except (ValueError, OSError, AttributeError):
  97.         pass
  98.  
  99.     try:
  100.         return int(os.popen2("sysctl -n hw.ncpu")[1].read())
  101.     except ValueError:
  102.         pass
  103.  
  104.     return 1
  105.  
  106.  
  107. def generate(env):
  108.     """Common environment generation code"""
  109.  
  110.     # Tell tools which machine to compile for
  111.     env['TARGET_ARCH'] = env['machine']
  112.     env['MSVS_ARCH'] = env['machine']
  113.  
  114.     # Toolchain
  115.     platform = env['platform']
  116.     env.Tool(env['toolchain'])
  117.  
  118.     # Allow override compiler and specify additional flags from environment
  119.     if os.environ.has_key('CC'):
  120.         env['CC'] = os.environ['CC']
  121.         # Update CCVERSION to match
  122.         pipe = SCons.Action._subproc(env, [env['CC'], '--version'],
  123.                                      stdin = 'devnull',
  124.                                      stderr = 'devnull',
  125.                                      stdout = subprocess.PIPE)
  126.         if pipe.wait() == 0:
  127.             line = pipe.stdout.readline()
  128.             match = re.search(r'[0-9]+(\.[0-9]+)+', line)
  129.             if match:
  130.                 env['CCVERSION'] = match.group(0)
  131.     if os.environ.has_key('CFLAGS'):
  132.         env['CCFLAGS'] += SCons.Util.CLVar(os.environ['CFLAGS'])
  133.     if os.environ.has_key('CXX'):
  134.         env['CXX'] = os.environ['CXX']
  135.     if os.environ.has_key('CXXFLAGS'):
  136.         env['CXXFLAGS'] += SCons.Util.CLVar(os.environ['CXXFLAGS'])
  137.     if os.environ.has_key('LDFLAGS'):
  138.         env['LINKFLAGS'] += SCons.Util.CLVar(os.environ['LDFLAGS'])
  139.  
  140.     env['gcc'] = 'gcc' in os.path.basename(env['CC']).split('-')
  141.     env['msvc'] = env['CC'] == 'cl'
  142.     env['suncc'] = env['platform'] == 'sunos' and os.path.basename(env['CC']) == 'cc'
  143.     env['clang'] = env['CC'] == 'clang'
  144.     env['icc'] = 'icc' == os.path.basename(env['CC'])
  145.  
  146.     if env['msvc'] and env['toolchain'] == 'default' and env['machine'] == 'x86_64':
  147.         # MSVC x64 support is broken in earlier versions of scons
  148.         env.EnsurePythonVersion(2, 0)
  149.  
  150.     # shortcuts
  151.     machine = env['machine']
  152.     platform = env['platform']
  153.     x86 = env['machine'] == 'x86'
  154.     ppc = env['machine'] == 'ppc'
  155.     gcc_compat = env['gcc'] or env['clang']
  156.     msvc = env['msvc']
  157.     suncc = env['suncc']
  158.     icc = env['icc']
  159.  
  160.     # Determine whether we are cross compiling; in particular, whether we need
  161.     # to compile code generators with a different compiler as the target code.
  162.     host_platform = _platform.system().lower()
  163.     if host_platform.startswith('cygwin'):
  164.         host_platform = 'cygwin'
  165.     host_machine = os.environ.get('PROCESSOR_ARCHITEW6432', os.environ.get('PROCESSOR_ARCHITECTURE', _platform.machine()))
  166.     host_machine = {
  167.         'x86': 'x86',
  168.         'i386': 'x86',
  169.         'i486': 'x86',
  170.         'i586': 'x86',
  171.         'i686': 'x86',
  172.         'ppc' : 'ppc',
  173.         'AMD64': 'x86_64',
  174.         'x86_64': 'x86_64',
  175.     }.get(host_machine, 'generic')
  176.     env['crosscompile'] = platform != host_platform
  177.     if machine == 'x86_64' and host_machine != 'x86_64':
  178.         env['crosscompile'] = True
  179.     env['hostonly'] = False
  180.  
  181.     # Backwards compatability with the debug= profile= options
  182.     if env['build'] == 'debug':
  183.         if not env['debug']:
  184.             print 'scons: warning: debug option is deprecated and will be removed eventually; use instead'
  185.             print
  186.             print ' scons build=release'
  187.             print
  188.             env['build'] = 'release'
  189.         if env['profile']:
  190.             print 'scons: warning: profile option is deprecated and will be removed eventually; use instead'
  191.             print
  192.             print ' scons build=profile'
  193.             print
  194.             env['build'] = 'profile'
  195.     if False:
  196.         # Enforce SConscripts to use the new build variable
  197.         env.popitem('debug')
  198.         env.popitem('profile')
  199.     else:
  200.         # Backwards portability with older sconscripts
  201.         if env['build'] in ('debug', 'checked'):
  202.             env['debug'] = True
  203.             env['profile'] = False
  204.         if env['build'] == 'profile':
  205.             env['debug'] = False
  206.             env['profile'] = True
  207.         if env['build'] == 'release':
  208.             env['debug'] = False
  209.             env['profile'] = False
  210.  
  211.     # Put build output in a separate dir, which depends on the current
  212.     # configuration. See also http://www.scons.org/wiki/AdvancedBuildExample
  213.     build_topdir = 'build'
  214.     build_subdir = env['platform']
  215.     if env['embedded']:
  216.         build_subdir =  'embedded-' + build_subdir
  217.     if env['machine'] != 'generic':
  218.         build_subdir += '-' + env['machine']
  219.     if env['build'] != 'release':
  220.         build_subdir += '-' +  env['build']
  221.     build_dir = os.path.join(build_topdir, build_subdir)
  222.     # Place the .sconsign file in the build dir too, to avoid issues with
  223.     # different scons versions building the same source file
  224.     env['build_dir'] = build_dir
  225.     env.SConsignFile(os.path.join(build_dir, '.sconsign'))
  226.     if 'SCONS_CACHE_DIR' in os.environ:
  227.         print 'scons: Using build cache in %s.' % (os.environ['SCONS_CACHE_DIR'],)
  228.         env.CacheDir(os.environ['SCONS_CACHE_DIR'])
  229.     env['CONFIGUREDIR'] = os.path.join(build_dir, 'conf')
  230.     env['CONFIGURELOG'] = os.path.join(os.path.abspath(build_dir), 'config.log')
  231.  
  232.     # Parallel build
  233.     if env.GetOption('num_jobs') <= 1:
  234.         env.SetOption('num_jobs', num_jobs())
  235.  
  236.     env.Decider('MD5-timestamp')
  237.     env.SetOption('max_drift', 60)
  238.  
  239.     # C preprocessor options
  240.     cppdefines = []
  241.     if env['build'] in ('debug', 'checked'):
  242.         cppdefines += ['DEBUG']
  243.     else:
  244.         cppdefines += ['NDEBUG']
  245.     if env['build'] == 'profile':
  246.         cppdefines += ['PROFILE']
  247.     if env['platform'] in ('posix', 'linux', 'freebsd', 'darwin'):
  248.         cppdefines += [
  249.             '_POSIX_SOURCE',
  250.             ('_POSIX_C_SOURCE', '199309L'),
  251.             '_SVID_SOURCE',
  252.             '_BSD_SOURCE',
  253.             '_GNU_SOURCE',
  254.             'HAVE_PTHREAD',
  255.             'HAVE_POSIX_MEMALIGN',
  256.         ]
  257.         if env['platform'] == 'darwin':
  258.             cppdefines += [
  259.                 '_DARWIN_C_SOURCE',
  260.                 'GLX_USE_APPLEGL',
  261.                 'GLX_DIRECT_RENDERING',
  262.             ]
  263.         else:
  264.             cppdefines += [
  265.                 'GLX_DIRECT_RENDERING',
  266.                 'GLX_INDIRECT_RENDERING',
  267.             ]
  268.         if env['platform'] in ('linux', 'freebsd'):
  269.             cppdefines += ['HAVE_ALIAS']
  270.         else:
  271.             cppdefines += ['GLX_ALIAS_UNSUPPORTED']
  272.     if platform == 'windows':
  273.         cppdefines += [
  274.             'WIN32',
  275.             '_WINDOWS',
  276.             #'_UNICODE',
  277.             #'UNICODE',
  278.             # http://msdn.microsoft.com/en-us/library/aa383745.aspx
  279.             ('_WIN32_WINNT', '0x0601'),
  280.             ('WINVER', '0x0601'),
  281.         ]
  282.         if gcc_compat:
  283.             cppdefines += [('__MSVCRT_VERSION__', '0x0700')]
  284.         if msvc:
  285.             cppdefines += [
  286.                 'VC_EXTRALEAN',
  287.                 '_USE_MATH_DEFINES',
  288.                 '_CRT_SECURE_NO_WARNINGS',
  289.                 '_CRT_SECURE_NO_DEPRECATE',
  290.                 '_SCL_SECURE_NO_WARNINGS',
  291.                 '_SCL_SECURE_NO_DEPRECATE',
  292.                 '_ALLOW_KEYWORD_MACROS',
  293.             ]
  294.         if env['build'] in ('debug', 'checked'):
  295.             cppdefines += ['_DEBUG']
  296.     if platform == 'windows':
  297.         cppdefines += ['PIPE_SUBSYSTEM_WINDOWS_USER']
  298.     if platform == 'haiku':
  299.         cppdefines += ['BEOS_THREADS']
  300.     if env['embedded']:
  301.         cppdefines += ['PIPE_SUBSYSTEM_EMBEDDED']
  302.     if env['texture_float']:
  303.         print 'warning: Floating-point textures enabled.'
  304.         print 'warning: Please consult docs/patents.txt with your lawyer before building Mesa.'
  305.         cppdefines += ['TEXTURE_FLOAT_ENABLED']
  306.     env.Append(CPPDEFINES = cppdefines)
  307.  
  308.     # C compiler options
  309.     cflags = [] # C
  310.     cxxflags = [] # C++
  311.     ccflags = [] # C & C++
  312.     if gcc_compat:
  313.         ccversion = env['CCVERSION']
  314.         if env['build'] == 'debug':
  315.             ccflags += ['-O0']
  316.         elif env['gcc'] and ccversion.startswith('4.2.'):
  317.             # gcc 4.2.x optimizer is broken
  318.             print "warning: gcc 4.2.x optimizer is broken -- disabling optimizations"
  319.             ccflags += ['-O0']
  320.         else:
  321.             ccflags += ['-O3']
  322.         if env['gcc']:
  323.             # gcc's builtin memcmp is slower than glibc's
  324.             # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43052
  325.             ccflags += ['-fno-builtin-memcmp']
  326.         # Work around aliasing bugs - developers should comment this out
  327.         ccflags += ['-fno-strict-aliasing']
  328.         ccflags += ['-g']
  329.         if env['build'] in ('checked', 'profile'):
  330.             # See http://code.google.com/p/jrfonseca/wiki/Gprof2Dot#Which_options_should_I_pass_to_gcc_when_compiling_for_profiling?
  331.             ccflags += [
  332.                 '-fno-omit-frame-pointer',
  333.             ]
  334.             if env['gcc']:
  335.                 ccflags += ['-fno-optimize-sibling-calls']
  336.         if env['machine'] == 'x86':
  337.             ccflags += [
  338.                 '-m32',
  339.                 #'-march=pentium4',
  340.             ]
  341.             if distutils.version.LooseVersion(ccversion) >= distutils.version.LooseVersion('4.2') \
  342.                and (platform != 'windows' or env['build'] == 'debug' or True) \
  343.                and platform != 'haiku':
  344.                 # NOTE: We need to ensure stack is realigned given that we
  345.                 # produce shared objects, and have no control over the stack
  346.                 # alignment policy of the application. Therefore we need
  347.                 # -mstackrealign ore -mincoming-stack-boundary=2.
  348.                 #
  349.                 # XXX: -O and -mstackrealign causes stack corruption on MinGW
  350.                 #
  351.                 # XXX: We could have SSE without -mstackrealign if we always used
  352.                 # __attribute__((force_align_arg_pointer)), but that's not
  353.                 # always the case.
  354.                 ccflags += [
  355.                     '-mstackrealign', # ensure stack is aligned
  356.                     '-mmmx', '-msse', '-msse2', # enable SIMD intrinsics
  357.                     #'-mfpmath=sse',
  358.                 ]
  359.             if platform in ['windows', 'darwin']:
  360.                 # Workaround http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37216
  361.                 ccflags += ['-fno-common']
  362.             if platform in ['haiku']:
  363.                 # Make optimizations compatible with Pentium or higher on Haiku
  364.                 ccflags += [
  365.                     '-mstackrealign', # ensure stack is aligned
  366.                     '-march=i586', # Haiku target is Pentium
  367.                     '-mtune=i686' # use i686 where we can
  368.                 ]
  369.         if env['machine'] == 'x86_64':
  370.             ccflags += ['-m64']
  371.             if platform == 'darwin':
  372.                 ccflags += ['-fno-common']
  373.         if env['platform'] not in ('cygwin', 'haiku', 'windows'):
  374.             ccflags += ['-fvisibility=hidden']
  375.         # See also:
  376.         # - http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
  377.         ccflags += [
  378.             '-Wall',
  379.             '-Wno-long-long',
  380.             '-fmessage-length=0', # be nice to Eclipse
  381.         ]
  382.         cflags += [
  383.             '-Wmissing-prototypes',
  384.             '-std=gnu99',
  385.         ]
  386.         if distutils.version.LooseVersion(ccversion) >= distutils.version.LooseVersion('4.2'):
  387.             ccflags += [
  388.                 '-Wpointer-arith',
  389.             ]
  390.             cflags += [
  391.                 '-Wdeclaration-after-statement',
  392.             ]
  393.     if icc:
  394.         cflags += [
  395.             '-std=gnu99',
  396.         ]
  397.     if msvc:
  398.         # See also:
  399.         # - http://msdn.microsoft.com/en-us/library/19z1t1wy.aspx
  400.         # - cl /?
  401.         if env['build'] == 'debug':
  402.             ccflags += [
  403.               '/Od', # disable optimizations
  404.               '/Oi', # enable intrinsic functions
  405.             ]
  406.         else:
  407.             if 'MSVC_VERSION' in env and distutils.version.LooseVersion(env['MSVC_VERSION']) < distutils.version.LooseVersion('11.0'):
  408.                 print 'scons: warning: Visual Studio versions prior to 2012 are known to produce incorrect code when optimizations are enabled ( https://bugs.freedesktop.org/show_bug.cgi?id=58718 )'
  409.             ccflags += [
  410.                 '/O2', # optimize for speed
  411.             ]
  412.         if env['build'] == 'release':
  413.             ccflags += [
  414.                 '/GL', # enable whole program optimization
  415.             ]
  416.         else:
  417.             ccflags += [
  418.                 '/Oy-', # disable frame pointer omission
  419.                 '/GL-', # disable whole program optimization
  420.             ]
  421.         ccflags += [
  422.             '/W3', # warning level
  423.             #'/Wp64', # enable 64 bit porting warnings
  424.             '/wd4996', # disable deprecated POSIX name warnings
  425.         ]
  426.         if env['machine'] == 'x86':
  427.             ccflags += [
  428.                 #'/arch:SSE2', # use the SSE2 instructions
  429.             ]
  430.         if platform == 'windows':
  431.             ccflags += [
  432.                 # TODO
  433.             ]
  434.         # Automatic pdb generation
  435.         # See http://scons.tigris.org/issues/show_bug.cgi?id=1656
  436.         env.EnsureSConsVersion(0, 98, 0)
  437.         env['PDB'] = '${TARGET.base}.pdb'
  438.     env.Append(CCFLAGS = ccflags)
  439.     env.Append(CFLAGS = cflags)
  440.     env.Append(CXXFLAGS = cxxflags)
  441.  
  442.     if env['platform'] == 'windows' and msvc:
  443.         # Choose the appropriate MSVC CRT
  444.         # http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx
  445.         if env['build'] in ('debug', 'checked'):
  446.             env.Append(CCFLAGS = ['/MTd'])
  447.             env.Append(SHCCFLAGS = ['/LDd'])
  448.         else:
  449.             env.Append(CCFLAGS = ['/MT'])
  450.             env.Append(SHCCFLAGS = ['/LD'])
  451.    
  452.     # Assembler options
  453.     if gcc_compat:
  454.         if env['machine'] == 'x86':
  455.             env.Append(ASFLAGS = ['-m32'])
  456.         if env['machine'] == 'x86_64':
  457.             env.Append(ASFLAGS = ['-m64'])
  458.  
  459.     # Linker options
  460.     linkflags = []
  461.     shlinkflags = []
  462.     if gcc_compat:
  463.         if env['machine'] == 'x86':
  464.             linkflags += ['-m32']
  465.         if env['machine'] == 'x86_64':
  466.             linkflags += ['-m64']
  467.         if env['platform'] not in ('darwin'):
  468.             shlinkflags += [
  469.                 '-Wl,-Bsymbolic',
  470.             ]
  471.         # Handle circular dependencies in the libraries
  472.         if env['platform'] in ('darwin'):
  473.             pass
  474.         else:
  475.             env['_LIBFLAGS'] = '-Wl,--start-group ' + env['_LIBFLAGS'] + ' -Wl,--end-group'
  476.         if env['platform'] == 'windows':
  477.             # Avoid depending on gcc runtime DLLs
  478.             linkflags += ['-static-libgcc']
  479.             if 'w64' in env['CC'].split('-'):
  480.                 linkflags += ['-static-libstdc++']
  481.             # Handle the @xx symbol munging of DLL exports
  482.             shlinkflags += ['-Wl,--enable-stdcall-fixup']
  483.             #shlinkflags += ['-Wl,--kill-at']
  484.     if msvc:
  485.         if env['build'] == 'release':
  486.             # enable Link-time Code Generation
  487.             linkflags += ['/LTCG']
  488.             env.Append(ARFLAGS = ['/LTCG'])
  489.     if platform == 'windows' and msvc:
  490.         # See also:
  491.         # - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx
  492.         linkflags += [
  493.             '/fixed:no',
  494.             '/incremental:no',
  495.         ]
  496.     env.Append(LINKFLAGS = linkflags)
  497.     env.Append(SHLINKFLAGS = shlinkflags)
  498.  
  499.     # We have C++ in several libraries, so always link with the C++ compiler
  500.     if gcc_compat:
  501.         env['LINK'] = env['CXX']
  502.  
  503.     # Default libs
  504.     libs = []
  505.     if env['platform'] in ('darwin', 'freebsd', 'linux', 'posix', 'sunos'):
  506.         libs += ['m', 'pthread', 'dl']
  507.     if env['platform'] in ('linux',):
  508.         libs += ['rt']
  509.     env.Append(LIBS = libs)
  510.  
  511.     # OpenMP
  512.     if env['openmp']:
  513.         if env['msvc']:
  514.             env.Append(CCFLAGS = ['/openmp'])
  515.             # When building openmp release VS2008 link.exe crashes with LNK1103 error.
  516.             # Workaround: overwrite PDB flags with empty value as it isn't required anyways
  517.             if env['build'] == 'release':
  518.                 env['PDB'] = ''
  519.         if env['gcc']:
  520.             env.Append(CCFLAGS = ['-fopenmp'])
  521.             env.Append(LIBS = ['gomp'])
  522.  
  523.     # Load tools
  524.     env.Tool('lex')
  525.     env.Tool('yacc')
  526.     if env['llvm']:
  527.         env.Tool('llvm')
  528.    
  529.     # Custom builders and methods
  530.     env.Tool('custom')
  531.     createInstallMethods(env)
  532.  
  533.     env.PkgCheckModules('X11', ['x11', 'xext', 'xdamage', 'xfixes'])
  534.     env.PkgCheckModules('XCB', ['x11-xcb', 'xcb-glx >= 1.8.1'])
  535.     env.PkgCheckModules('XF86VIDMODE', ['xxf86vm'])
  536.     env.PkgCheckModules('DRM', ['libdrm >= 2.4.24'])
  537.     env.PkgCheckModules('DRM_INTEL', ['libdrm_intel >= 2.4.30'])
  538.     env.PkgCheckModules('XORG', ['xorg-server >= 1.6.0'])
  539.     env.PkgCheckModules('KMS', ['libkms >= 2.4.24'])
  540.     env.PkgCheckModules('UDEV', ['libudev > 150'])
  541.  
  542.     env['dri'] = env['x11'] and env['drm']
  543.  
  544.     # for debugging
  545.     #print env.Dump()
  546.  
  547.  
  548. def exists(env):
  549.     return 1
  550.