123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667 |
- """gallium
-
- Frontend-tool for Gallium3D architecture.
-
- """
-
- #
- # Copyright 2008 VMware, Inc.
- # All Rights Reserved.
- #
- # Permission is hereby granted, free of charge, to any person obtaining a
- # copy of this software and associated documentation files (the
- # "Software"), to deal in the Software without restriction, including
- # without limitation the rights to use, copy, modify, merge, publish,
- # distribute, sub license, and/or sell copies of the Software, and to
- # permit persons to whom the Software is furnished to do so, subject to
- # the following conditions:
- #
- # The above copyright notice and this permission notice (including the
- # next paragraph) shall be included in all copies or substantial portions
- # of the Software.
- #
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- # IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- # ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- #
-
-
- import distutils.version
- import os
- import os.path
- import re
- import subprocess
- import platform as host_platform
- import sys
- import tempfile
-
- import SCons.Action
- import SCons.Builder
- import SCons.Scanner
-
-
- def symlink(target, source, env):
- target = str(target[0])
- source = str(source[0])
- if os.path.islink(target) or os.path.exists(target):
- os.remove(target)
- os.symlink(os.path.basename(source), target)
-
- def install(env, source, subdir):
- target_dir = os.path.join(env.Dir('#.').srcnode().abspath, env['build_dir'], subdir)
- return env.Install(target_dir, source)
-
- def install_program(env, source):
- return install(env, source, 'bin')
-
- def install_shared_library(env, sources, version = ()):
- targets = []
- install_dir = os.path.join(env.Dir('#.').srcnode().abspath, env['build_dir'])
- version = tuple(map(str, version))
- if env['SHLIBSUFFIX'] == '.dll':
- dlls = env.FindIxes(sources, 'SHLIBPREFIX', 'SHLIBSUFFIX')
- targets += install(env, dlls, 'bin')
- libs = env.FindIxes(sources, 'LIBPREFIX', 'LIBSUFFIX')
- targets += install(env, libs, 'lib')
- else:
- for source in sources:
- target_dir = os.path.join(install_dir, 'lib')
- target_name = '.'.join((str(source),) + version)
- last = env.InstallAs(os.path.join(target_dir, target_name), source)
- targets += last
- while len(version):
- version = version[:-1]
- target_name = '.'.join((str(source),) + version)
- action = SCons.Action.Action(symlink, " Symlinking $TARGET ...")
- last = env.Command(os.path.join(target_dir, target_name), last, action)
- targets += last
- return targets
-
-
- def msvc2013_compat(env):
- if env['gcc']:
- env.Append(CCFLAGS = [
- '-Werror=vla',
- '-Werror=pointer-arith',
- ])
-
-
- def unit_test(env, test_name, program_target, args=None):
- env.InstallProgram(program_target)
-
- cmd = [program_target[0].abspath]
- if args is not None:
- cmd += args
- cmd = ' '.join(cmd)
-
- # http://www.scons.org/wiki/UnitTests
- action = SCons.Action.Action(cmd, " Running $SOURCE ...")
- alias = env.Alias(test_name, program_target, action)
- env.AlwaysBuild(alias)
- env.Depends('check', alias)
-
-
- def num_jobs():
- try:
- return int(os.environ['NUMBER_OF_PROCESSORS'])
- except (ValueError, KeyError):
- pass
-
- try:
- return os.sysconf('SC_NPROCESSORS_ONLN')
- except (ValueError, OSError, AttributeError):
- pass
-
- try:
- return int(os.popen2("sysctl -n hw.ncpu")[1].read())
- except ValueError:
- pass
-
- return 1
-
-
- def check_cc(env, cc, expr, cpp_opt = '-E'):
- # Invoke C-preprocessor to determine whether the specified expression is
- # true or not.
-
- sys.stdout.write('Checking for %s ... ' % cc)
-
- source = tempfile.NamedTemporaryFile(suffix='.c', delete=False)
- source.write('#if !(%s)\n#error\n#endif\n' % expr)
- source.close()
-
- pipe = SCons.Action._subproc(env, [env['CC'], cpp_opt, source.name],
- stdin = 'devnull',
- stderr = 'devnull',
- stdout = 'devnull')
- result = pipe.wait() == 0
-
- os.unlink(source.name)
-
- sys.stdout.write(' %s\n' % ['no', 'yes'][int(bool(result))])
- return result
-
-
- def check_prog(env, prog):
- """Check whether this program exists."""
-
- sys.stdout.write('Checking for %s ... ' % prog)
-
- result = env.Detect(prog)
-
- sys.stdout.write(' %s\n' % ['no', 'yes'][int(bool(result))])
- return result
-
-
- def generate(env):
- """Common environment generation code"""
-
- # Tell tools which machine to compile for
- env['TARGET_ARCH'] = env['machine']
- env['MSVS_ARCH'] = env['machine']
-
- # Toolchain
- platform = env['platform']
- env.Tool(env['toolchain'])
-
- # Allow override compiler and specify additional flags from environment
- if os.environ.has_key('CC'):
- env['CC'] = os.environ['CC']
- if os.environ.has_key('CFLAGS'):
- env['CCFLAGS'] += SCons.Util.CLVar(os.environ['CFLAGS'])
- if os.environ.has_key('CXX'):
- env['CXX'] = os.environ['CXX']
- if os.environ.has_key('CXXFLAGS'):
- env['CXXFLAGS'] += SCons.Util.CLVar(os.environ['CXXFLAGS'])
- if os.environ.has_key('LDFLAGS'):
- env['LINKFLAGS'] += SCons.Util.CLVar(os.environ['LDFLAGS'])
-
- # Detect gcc/clang not by executable name, but through pre-defined macros
- # as autoconf does, to avoid drawing wrong conclusions when using tools
- # that overrice CC/CXX like scan-build.
- env['gcc_compat'] = 0
- env['clang'] = 0
- env['msvc'] = 0
- if host_platform.system() == 'Windows':
- env['msvc'] = check_cc(env, 'MSVC', 'defined(_MSC_VER)', '/E')
- if not env['msvc']:
- env['gcc_compat'] = check_cc(env, 'GCC', 'defined(__GNUC__)')
- env['clang'] = check_cc(env, 'Clang', '__clang__')
- env['gcc'] = env['gcc_compat'] and not env['clang']
- env['suncc'] = env['platform'] == 'sunos' and os.path.basename(env['CC']) == 'cc'
- env['icc'] = 'icc' == os.path.basename(env['CC'])
-
- if env['msvc'] and env['toolchain'] == 'default' and env['machine'] == 'x86_64':
- # MSVC x64 support is broken in earlier versions of scons
- env.EnsurePythonVersion(2, 0)
-
- # shortcuts
- machine = env['machine']
- platform = env['platform']
- x86 = env['machine'] == 'x86'
- ppc = env['machine'] == 'ppc'
- gcc_compat = env['gcc_compat']
- msvc = env['msvc']
- suncc = env['suncc']
- icc = env['icc']
-
- # Determine whether we are cross compiling; in particular, whether we need
- # to compile code generators with a different compiler as the target code.
- hosthost_platform = host_platform.system().lower()
- if hosthost_platform.startswith('cygwin'):
- hosthost_platform = 'cygwin'
- host_machine = os.environ.get('PROCESSOR_ARCHITEW6432', os.environ.get('PROCESSOR_ARCHITECTURE', host_platform.machine()))
- host_machine = {
- 'x86': 'x86',
- 'i386': 'x86',
- 'i486': 'x86',
- 'i586': 'x86',
- 'i686': 'x86',
- 'ppc' : 'ppc',
- 'AMD64': 'x86_64',
- 'x86_64': 'x86_64',
- }.get(host_machine, 'generic')
- env['crosscompile'] = platform != hosthost_platform
- if machine == 'x86_64' and host_machine != 'x86_64':
- env['crosscompile'] = True
- env['hostonly'] = False
-
- # Backwards compatability with the debug= profile= options
- if env['build'] == 'debug':
- if not env['debug']:
- print 'scons: warning: debug option is deprecated and will be removed eventually; use instead'
- print
- print ' scons build=release'
- print
- env['build'] = 'release'
- if env['profile']:
- print 'scons: warning: profile option is deprecated and will be removed eventually; use instead'
- print
- print ' scons build=profile'
- print
- env['build'] = 'profile'
- if False:
- # Enforce SConscripts to use the new build variable
- env.popitem('debug')
- env.popitem('profile')
- else:
- # Backwards portability with older sconscripts
- if env['build'] in ('debug', 'checked'):
- env['debug'] = True
- env['profile'] = False
- if env['build'] == 'profile':
- env['debug'] = False
- env['profile'] = True
- if env['build'] in ('release', 'opt'):
- env['debug'] = False
- env['profile'] = False
-
- # Put build output in a separate dir, which depends on the current
- # configuration. See also http://www.scons.org/wiki/AdvancedBuildExample
- build_topdir = 'build'
- build_subdir = env['platform']
- if env['embedded']:
- build_subdir = 'embedded-' + build_subdir
- if env['machine'] != 'generic':
- build_subdir += '-' + env['machine']
- if env['build'] != 'release':
- build_subdir += '-' + env['build']
- build_dir = os.path.join(build_topdir, build_subdir)
- # Place the .sconsign file in the build dir too, to avoid issues with
- # different scons versions building the same source file
- env['build_dir'] = build_dir
- env.SConsignFile(os.path.join(build_dir, '.sconsign'))
- if 'SCONS_CACHE_DIR' in os.environ:
- print 'scons: Using build cache in %s.' % (os.environ['SCONS_CACHE_DIR'],)
- env.CacheDir(os.environ['SCONS_CACHE_DIR'])
- env['CONFIGUREDIR'] = os.path.join(build_dir, 'conf')
- env['CONFIGURELOG'] = os.path.join(os.path.abspath(build_dir), 'config.log')
-
- # Parallel build
- if env.GetOption('num_jobs') <= 1:
- env.SetOption('num_jobs', num_jobs())
-
- env.Decider('MD5-timestamp')
- env.SetOption('max_drift', 60)
-
- # C preprocessor options
- cppdefines = []
- cppdefines += [
- '__STDC_LIMIT_MACROS',
- '__STDC_CONSTANT_MACROS',
- 'HAVE_NO_AUTOCONF',
- ]
- if env['build'] in ('debug', 'checked'):
- cppdefines += ['DEBUG']
- else:
- cppdefines += ['NDEBUG']
- if env['build'] == 'profile':
- cppdefines += ['PROFILE']
- if env['build'] in ('opt', 'profile'):
- cppdefines += ['VMX86_STATS']
- if env['platform'] in ('posix', 'linux', 'freebsd', 'darwin'):
- cppdefines += [
- '_POSIX_SOURCE',
- ('_POSIX_C_SOURCE', '199309L'),
- '_SVID_SOURCE',
- '_BSD_SOURCE',
- '_GNU_SOURCE',
- '_DEFAULT_SOURCE',
- ]
- if env['platform'] == 'darwin':
- cppdefines += [
- '_DARWIN_C_SOURCE',
- 'GLX_USE_APPLEGL',
- 'GLX_DIRECT_RENDERING',
- ]
- else:
- cppdefines += [
- 'GLX_DIRECT_RENDERING',
- 'GLX_INDIRECT_RENDERING',
- ]
- if env['platform'] in ('linux', 'freebsd'):
- cppdefines += ['HAVE_ALIAS']
- else:
- cppdefines += ['GLX_ALIAS_UNSUPPORTED']
-
- if env['platform'] in ('linux', 'darwin'):
- cppdefines += ['HAVE_XLOCALE_H']
-
- if platform == 'windows':
- cppdefines += [
- 'WIN32',
- '_WINDOWS',
- #'_UNICODE',
- #'UNICODE',
- # http://msdn.microsoft.com/en-us/library/aa383745.aspx
- ('_WIN32_WINNT', '0x0601'),
- ('WINVER', '0x0601'),
- ]
- if gcc_compat:
- cppdefines += [('__MSVCRT_VERSION__', '0x0700')]
- if msvc:
- cppdefines += [
- 'VC_EXTRALEAN',
- '_USE_MATH_DEFINES',
- '_CRT_SECURE_NO_WARNINGS',
- '_CRT_SECURE_NO_DEPRECATE',
- '_SCL_SECURE_NO_WARNINGS',
- '_SCL_SECURE_NO_DEPRECATE',
- '_ALLOW_KEYWORD_MACROS',
- '_HAS_EXCEPTIONS=0', # Tell C++ STL to not use exceptions
- ]
- if env['build'] in ('debug', 'checked'):
- cppdefines += ['_DEBUG']
- if platform == 'windows':
- cppdefines += ['PIPE_SUBSYSTEM_WINDOWS_USER']
- if env['embedded']:
- cppdefines += ['PIPE_SUBSYSTEM_EMBEDDED']
- if env['texture_float']:
- print 'warning: Floating-point textures enabled.'
- print 'warning: Please consult docs/patents.txt with your lawyer before building Mesa.'
- cppdefines += ['TEXTURE_FLOAT_ENABLED']
- env.Append(CPPDEFINES = cppdefines)
-
- # C compiler options
- cflags = [] # C
- cxxflags = [] # C++
- ccflags = [] # C & C++
- if gcc_compat:
- if env['build'] == 'debug':
- ccflags += ['-O0']
- else:
- ccflags += ['-O3']
- if env['gcc']:
- # gcc's builtin memcmp is slower than glibc's
- # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43052
- ccflags += ['-fno-builtin-memcmp']
- # Work around aliasing bugs - developers should comment this out
- ccflags += ['-fno-strict-aliasing']
- ccflags += ['-g']
- if env['build'] in ('checked', 'profile') or env['asan']:
- # See http://code.google.com/p/jrfonseca/wiki/Gprof2Dot#Which_options_should_I_pass_to_gcc_when_compiling_for_profiling?
- ccflags += [
- '-fno-omit-frame-pointer',
- ]
- if env['gcc']:
- ccflags += ['-fno-optimize-sibling-calls']
- if env['machine'] == 'x86':
- ccflags += [
- '-m32',
- #'-march=pentium4',
- ]
- if platform != 'haiku':
- # NOTE: We need to ensure stack is realigned given that we
- # produce shared objects, and have no control over the stack
- # alignment policy of the application. Therefore we need
- # -mstackrealign ore -mincoming-stack-boundary=2.
- #
- # XXX: We could have SSE without -mstackrealign if we always used
- # __attribute__((force_align_arg_pointer)), but that's not
- # always the case.
- ccflags += [
- '-mstackrealign', # ensure stack is aligned
- '-msse', '-msse2', # enable SIMD intrinsics
- '-mfpmath=sse', # generate SSE floating-point arithmetic
- ]
- if platform in ['windows', 'darwin']:
- # Workaround http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37216
- ccflags += ['-fno-common']
- if platform in ['haiku']:
- # Make optimizations compatible with Pentium or higher on Haiku
- ccflags += [
- '-mstackrealign', # ensure stack is aligned
- '-march=i586', # Haiku target is Pentium
- '-mtune=i686' # use i686 where we can
- ]
- if env['machine'] == 'x86_64':
- ccflags += ['-m64']
- if platform == 'darwin':
- ccflags += ['-fno-common']
- if env['platform'] not in ('cygwin', 'haiku', 'windows'):
- ccflags += ['-fvisibility=hidden']
- # See also:
- # - http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
- ccflags += [
- '-Wall',
- '-Wno-long-long',
- '-fmessage-length=0', # be nice to Eclipse
- ]
- cflags += [
- '-Wmissing-prototypes',
- '-std=gnu99',
- ]
- if icc:
- cflags += [
- '-std=gnu99',
- ]
- if msvc:
- # See also:
- # - http://msdn.microsoft.com/en-us/library/19z1t1wy.aspx
- # - cl /?
- if env['build'] == 'debug':
- ccflags += [
- '/Od', # disable optimizations
- '/Oi', # enable intrinsic functions
- ]
- else:
- ccflags += [
- '/O2', # optimize for speed
- ]
- if env['build'] in ('release', 'opt'):
- if not env['clang']:
- ccflags += [
- '/GL', # enable whole program optimization
- ]
- else:
- ccflags += [
- '/Oy-', # disable frame pointer omission
- ]
- ccflags += [
- '/W3', # warning level
- '/wd4018', # signed/unsigned mismatch
- '/wd4056', # overflow in floating-point constant arithmetic
- '/wd4244', # conversion from 'type1' to 'type2', possible loss of data
- '/wd4267', # 'var' : conversion from 'size_t' to 'type', possible loss of data
- '/wd4305', # truncation from 'type1' to 'type2'
- '/wd4351', # new behavior: elements of array 'array' will be default initialized
- '/wd4756', # overflow in constant arithmetic
- '/wd4800', # forcing value to bool 'true' or 'false' (performance warning)
- '/wd4996', # disable deprecated POSIX name warnings
- ]
- if env['clang']:
- ccflags += [
- '-Wno-microsoft-enum-value', # enumerator value is not representable in underlying type 'int'
- ]
- if env['machine'] == 'x86':
- ccflags += [
- '/arch:SSE2', # use the SSE2 instructions (default since MSVC 2012)
- ]
- if platform == 'windows':
- ccflags += [
- # TODO
- ]
- # Automatic pdb generation
- # See http://scons.tigris.org/issues/show_bug.cgi?id=1656
- env.EnsureSConsVersion(0, 98, 0)
- env['PDB'] = '${TARGET.base}.pdb'
- env.Append(CCFLAGS = ccflags)
- env.Append(CFLAGS = cflags)
- env.Append(CXXFLAGS = cxxflags)
-
- if env['platform'] == 'windows' and msvc:
- # Choose the appropriate MSVC CRT
- # http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx
- if env['build'] in ('debug', 'checked'):
- env.Append(CCFLAGS = ['/MTd'])
- env.Append(SHCCFLAGS = ['/LDd'])
- else:
- env.Append(CCFLAGS = ['/MT'])
- env.Append(SHCCFLAGS = ['/LD'])
-
- # Static code analysis
- if env['analyze']:
- if env['msvc']:
- # http://msdn.microsoft.com/en-us/library/ms173498.aspx
- env.Append(CCFLAGS = [
- '/analyze',
- #'/analyze:log', '${TARGET.base}.xml',
- '/wd28251', # Inconsistent annotation for function
- ])
- if env['clang']:
- # scan-build will produce more comprehensive output
- env.Append(CCFLAGS = ['--analyze'])
-
- # https://github.com/google/sanitizers/wiki/AddressSanitizer
- if env['asan']:
- if gcc_compat:
- env.Append(CCFLAGS = [
- '-fsanitize=address',
- ])
- env.Append(LINKFLAGS = [
- '-fsanitize=address',
- ])
-
- # Assembler options
- if gcc_compat:
- if env['machine'] == 'x86':
- env.Append(ASFLAGS = ['-m32'])
- if env['machine'] == 'x86_64':
- env.Append(ASFLAGS = ['-m64'])
-
- # Linker options
- linkflags = []
- shlinkflags = []
- if gcc_compat:
- if env['machine'] == 'x86':
- linkflags += ['-m32']
- if env['machine'] == 'x86_64':
- linkflags += ['-m64']
- if env['platform'] not in ('darwin'):
- shlinkflags += [
- '-Wl,-Bsymbolic',
- ]
- # Handle circular dependencies in the libraries
- if env['platform'] in ('darwin'):
- pass
- else:
- env['_LIBFLAGS'] = '-Wl,--start-group ' + env['_LIBFLAGS'] + ' -Wl,--end-group'
- if env['platform'] == 'windows':
- linkflags += [
- '-Wl,--nxcompat', # DEP
- '-Wl,--dynamicbase', # ASLR
- ]
- # Avoid depending on gcc runtime DLLs
- linkflags += ['-static-libgcc']
- if 'w64' in env['CC'].split('-'):
- linkflags += ['-static-libstdc++']
- # Handle the @xx symbol munging of DLL exports
- shlinkflags += ['-Wl,--enable-stdcall-fixup']
- #shlinkflags += ['-Wl,--kill-at']
- if msvc:
- if env['build'] in ('release', 'opt') and not env['clang']:
- # enable Link-time Code Generation
- linkflags += ['/LTCG']
- env.Append(ARFLAGS = ['/LTCG'])
- if platform == 'windows' and msvc:
- # See also:
- # - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx
- linkflags += [
- '/fixed:no',
- '/incremental:no',
- '/dynamicbase', # ASLR
- '/nxcompat', # DEP
- ]
- env.Append(LINKFLAGS = linkflags)
- env.Append(SHLINKFLAGS = shlinkflags)
-
- # We have C++ in several libraries, so always link with the C++ compiler
- if gcc_compat:
- env['LINK'] = env['CXX']
-
- # Default libs
- libs = []
- if env['platform'] in ('darwin', 'freebsd', 'linux', 'posix', 'sunos'):
- libs += ['m', 'pthread', 'dl']
- if env['platform'] in ('linux',):
- libs += ['rt']
- if env['platform'] in ('haiku'):
- libs += ['root', 'be', 'network', 'translation']
- env.Append(LIBS = libs)
-
- # OpenMP
- if env['openmp']:
- if env['msvc']:
- env.Append(CCFLAGS = ['/openmp'])
- # When building openmp release VS2008 link.exe crashes with LNK1103 error.
- # Workaround: overwrite PDB flags with empty value as it isn't required anyways
- if env['build'] == 'release':
- env['PDB'] = ''
- if env['gcc']:
- env.Append(CCFLAGS = ['-fopenmp'])
- env.Append(LIBS = ['gomp'])
-
- # Load tools
- env.Tool('lex')
- if env['msvc']:
- env.Append(LEXFLAGS = [
- # Force flex to use const keyword in prototypes, as relies on
- # __cplusplus or __STDC__ macro to determine whether it's safe to
- # use const keyword, but MSVC never defines __STDC__ unless we
- # disable all MSVC extensions.
- '-DYY_USE_CONST=',
- ])
- # Flex relies on __STDC_VERSION__>=199901L to decide when to include
- # C99 inttypes.h. We always have inttypes.h available with MSVC
- # (either the one bundled with MSVC 2013, or the one we bundle
- # ourselves), but we can't just define __STDC_VERSION__ without
- # breaking stuff, as MSVC doesn't fully support C99. There's also no
- # way to premptively include stdint.
- env.Append(CCFLAGS = ['-FIinttypes.h'])
- if host_platform.system() == 'Windows':
- # Prefer winflexbison binaries, as not only they are easier to install
- # (no additional dependencies), but also better Windows support.
- if check_prog(env, 'win_flex'):
- env["LEX"] = 'win_flex'
- env.Append(LEXFLAGS = [
- # windows compatibility (uses <io.h> instead of <unistd.h> and
- # _isatty, _fileno functions)
- '--wincompat'
- ])
-
- env.Tool('yacc')
- if host_platform.system() == 'Windows':
- if check_prog(env, 'win_bison'):
- env["YACC"] = 'win_bison'
-
- if env['llvm']:
- env.Tool('llvm')
-
- # Custom builders and methods
- env.Tool('custom')
- env.AddMethod(install_program, 'InstallProgram')
- env.AddMethod(install_shared_library, 'InstallSharedLibrary')
- env.AddMethod(msvc2013_compat, 'MSVC2013Compat')
- env.AddMethod(unit_test, 'UnitTest')
-
- env.PkgCheckModules('X11', ['x11', 'xext', 'xdamage', 'xfixes', 'glproto >= 1.4.13'])
- env.PkgCheckModules('XCB', ['x11-xcb', 'xcb-glx >= 1.8.1', 'xcb-dri2 >= 1.8'])
- env.PkgCheckModules('XF86VIDMODE', ['xxf86vm'])
- env.PkgCheckModules('DRM', ['libdrm >= 2.4.38'])
- env.PkgCheckModules('UDEV', ['libudev >= 151'])
-
- if env['x11']:
- env.Append(CPPPATH = env['X11_CPPPATH'])
-
- env['dri'] = env['x11'] and env['drm']
-
- # for debugging
- #print env.Dump()
-
-
- def exists(env):
- return 1
|