1b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca"""gallium 2b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca 3b04aa714afad014f2cdecc3ded9df0586f685921José FonsecaFrontend-tool for Gallium3D architecture. 4b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca 5b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca""" 6b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca 7381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca# 8b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 9b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# All Rights Reserved. 10381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca# 11b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# Permission is hereby granted, free of charge, to any person obtaining a 12b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# copy of this software and associated documentation files (the 13b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# "Software"), to deal in the Software without restriction, including 14b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# without limitation the rights to use, copy, modify, merge, publish, 15b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# distribute, sub license, and/or sell copies of the Software, and to 16b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# permit persons to whom the Software is furnished to do so, subject to 17b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# the following conditions: 18381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca# 19b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# The above copyright notice and this permission notice (including the 20b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# next paragraph) shall be included in all copies or substantial portions 21b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# of the Software. 22381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca# 23b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 24b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 26b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 27b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 28b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 29b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 30381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca# 31b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca 32b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca 337d29afb3a29642e6e13fb30948f7c87434057102Vinson Leeimport distutils.version 3427d8d6f44faa61a61c330d032111eee64dd8b8c7José Fonsecaimport os 35b04aa714afad014f2cdecc3ded9df0586f685921José Fonsecaimport os.path 3627d8d6f44faa61a61c330d032111eee64dd8b8c7José Fonsecaimport re 371ecf505087136c1120f440c265c57418b14d0442Alan Hourihaneimport subprocess 38ae760279f142244590c8aa76e3139529ca42952fJosé Fonsecaimport platform as _platform 39b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca 40b04aa714afad014f2cdecc3ded9df0586f685921José Fonsecaimport SCons.Action 41b04aa714afad014f2cdecc3ded9df0586f685921José Fonsecaimport SCons.Builder 4227d8d6f44faa61a61c330d032111eee64dd8b8c7José Fonsecaimport SCons.Scanner 43b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca 4427d8d6f44faa61a61c330d032111eee64dd8b8c7José Fonseca 4552c2dd1f73e17c8352fe976e2ee4cdf049f81957José Fonsecadef symlink(target, source, env): 4652c2dd1f73e17c8352fe976e2ee4cdf049f81957José Fonseca target = str(target[0]) 4752c2dd1f73e17c8352fe976e2ee4cdf049f81957José Fonseca source = str(source[0]) 4852c2dd1f73e17c8352fe976e2ee4cdf049f81957José Fonseca if os.path.islink(target) or os.path.exists(target): 4952c2dd1f73e17c8352fe976e2ee4cdf049f81957José Fonseca os.remove(target) 5052c2dd1f73e17c8352fe976e2ee4cdf049f81957José Fonseca os.symlink(os.path.basename(source), target) 5152c2dd1f73e17c8352fe976e2ee4cdf049f81957José Fonseca 528a318edd0838ee3343be0425019d93541b621567José Fonsecadef install(env, source, subdir): 5367450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca target_dir = os.path.join(env.Dir('#.').srcnode().abspath, env['build_dir'], subdir) 54265b53983e5100420847d3d2c086409fc9ca8e17José Fonseca return env.Install(target_dir, source) 558a318edd0838ee3343be0425019d93541b621567José Fonseca 56b5a408bae518ededbb871d113dab89f3e15bfb45José Fonsecadef install_program(env, source): 57265b53983e5100420847d3d2c086409fc9ca8e17José Fonseca return install(env, source, 'bin') 58b5a408bae518ededbb871d113dab89f3e15bfb45José Fonseca 598a318edd0838ee3343be0425019d93541b621567José Fonsecadef install_shared_library(env, sources, version = ()): 60265b53983e5100420847d3d2c086409fc9ca8e17José Fonseca targets = [] 6167450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca install_dir = os.path.join(env.Dir('#.').srcnode().abspath, env['build_dir']) 6252c2dd1f73e17c8352fe976e2ee4cdf049f81957José Fonseca version = tuple(map(str, version)) 638a318edd0838ee3343be0425019d93541b621567José Fonseca if env['SHLIBSUFFIX'] == '.dll': 648a318edd0838ee3343be0425019d93541b621567José Fonseca dlls = env.FindIxes(sources, 'SHLIBPREFIX', 'SHLIBSUFFIX') 65265b53983e5100420847d3d2c086409fc9ca8e17José Fonseca targets += install(env, dlls, 'bin') 668a318edd0838ee3343be0425019d93541b621567José Fonseca libs = env.FindIxes(sources, 'LIBPREFIX', 'LIBSUFFIX') 67265b53983e5100420847d3d2c086409fc9ca8e17José Fonseca targets += install(env, libs, 'lib') 68b2e40643a328e4a60c04acf3e3079befb813c705José Fonseca else: 698a318edd0838ee3343be0425019d93541b621567José Fonseca for source in sources: 708a318edd0838ee3343be0425019d93541b621567José Fonseca target_dir = os.path.join(install_dir, 'lib') 718a318edd0838ee3343be0425019d93541b621567José Fonseca target_name = '.'.join((str(source),) + version) 728a318edd0838ee3343be0425019d93541b621567José Fonseca last = env.InstallAs(os.path.join(target_dir, target_name), source) 73265b53983e5100420847d3d2c086409fc9ca8e17José Fonseca targets += last 748a318edd0838ee3343be0425019d93541b621567José Fonseca while len(version): 758a318edd0838ee3343be0425019d93541b621567José Fonseca version = version[:-1] 768a318edd0838ee3343be0425019d93541b621567José Fonseca target_name = '.'.join((str(source),) + version) 7737058c3497850f452bdaf70a5dda07ee4840b6b9José Fonseca action = SCons.Action.Action(symlink, " Symlinking $TARGET ...") 788a318edd0838ee3343be0425019d93541b621567José Fonseca last = env.Command(os.path.join(target_dir, target_name), last, action) 79265b53983e5100420847d3d2c086409fc9ca8e17José Fonseca targets += last 80265b53983e5100420847d3d2c086409fc9ca8e17José Fonseca return targets 81265b53983e5100420847d3d2c086409fc9ca8e17José Fonseca 8252c2dd1f73e17c8352fe976e2ee4cdf049f81957José Fonseca 8352c2dd1f73e17c8352fe976e2ee4cdf049f81957José Fonsecadef createInstallMethods(env): 84b5a408bae518ededbb871d113dab89f3e15bfb45José Fonseca env.AddMethod(install_program, 'InstallProgram') 8552c2dd1f73e17c8352fe976e2ee4cdf049f81957José Fonseca env.AddMethod(install_shared_library, 'InstallSharedLibrary') 8652c2dd1f73e17c8352fe976e2ee4cdf049f81957José Fonseca 8752c2dd1f73e17c8352fe976e2ee4cdf049f81957José Fonseca 881e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonsecadef num_jobs(): 891e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca try: 901e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca return int(os.environ['NUMBER_OF_PROCESSORS']) 911e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca except (ValueError, KeyError): 921e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca pass 931e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca 941e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca try: 951e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca return os.sysconf('SC_NPROCESSORS_ONLN') 961e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca except (ValueError, OSError, AttributeError): 971e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca pass 981e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca 991e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca try: 1001e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca return int(os.popen2("sysctl -n hw.ncpu")[1].read()) 1011e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca except ValueError: 1021e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca pass 1031e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca 1041e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca return 1 1051e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca 1061e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca 107b04aa714afad014f2cdecc3ded9df0586f685921José Fonsecadef generate(env): 108381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca """Common environment generation code""" 109381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca 110051f8bbfee6618e8bf04712cf214d96cec433e38José Fonseca # Tell tools which machine to compile for 111051f8bbfee6618e8bf04712cf214d96cec433e38José Fonseca env['TARGET_ARCH'] = env['machine'] 112051f8bbfee6618e8bf04712cf214d96cec433e38José Fonseca env['MSVS_ARCH'] = env['machine'] 113051f8bbfee6618e8bf04712cf214d96cec433e38José Fonseca 1146cf59e1293c5777ba5675e6315cbfad3211f9260José Fonseca # Toolchain 1156cf59e1293c5777ba5675e6315cbfad3211f9260José Fonseca platform = env['platform'] 1166cf59e1293c5777ba5675e6315cbfad3211f9260José Fonseca env.Tool(env['toolchain']) 1176cf59e1293c5777ba5675e6315cbfad3211f9260José Fonseca 118601498ae73e654c2de997ea75075613a694d604dJosé Fonseca # Allow override compiler and specify additional flags from environment 119601498ae73e654c2de997ea75075613a694d604dJosé Fonseca if os.environ.has_key('CC'): 120601498ae73e654c2de997ea75075613a694d604dJosé Fonseca env['CC'] = os.environ['CC'] 121601498ae73e654c2de997ea75075613a694d604dJosé Fonseca # Update CCVERSION to match 122601498ae73e654c2de997ea75075613a694d604dJosé Fonseca pipe = SCons.Action._subproc(env, [env['CC'], '--version'], 123601498ae73e654c2de997ea75075613a694d604dJosé Fonseca stdin = 'devnull', 124601498ae73e654c2de997ea75075613a694d604dJosé Fonseca stderr = 'devnull', 125601498ae73e654c2de997ea75075613a694d604dJosé Fonseca stdout = subprocess.PIPE) 126601498ae73e654c2de997ea75075613a694d604dJosé Fonseca if pipe.wait() == 0: 127601498ae73e654c2de997ea75075613a694d604dJosé Fonseca line = pipe.stdout.readline() 128601498ae73e654c2de997ea75075613a694d604dJosé Fonseca match = re.search(r'[0-9]+(\.[0-9]+)+', line) 129601498ae73e654c2de997ea75075613a694d604dJosé Fonseca if match: 130601498ae73e654c2de997ea75075613a694d604dJosé Fonseca env['CCVERSION'] = match.group(0) 131601498ae73e654c2de997ea75075613a694d604dJosé Fonseca if os.environ.has_key('CFLAGS'): 132601498ae73e654c2de997ea75075613a694d604dJosé Fonseca env['CCFLAGS'] += SCons.Util.CLVar(os.environ['CFLAGS']) 133601498ae73e654c2de997ea75075613a694d604dJosé Fonseca if os.environ.has_key('CXX'): 134601498ae73e654c2de997ea75075613a694d604dJosé Fonseca env['CXX'] = os.environ['CXX'] 135601498ae73e654c2de997ea75075613a694d604dJosé Fonseca if os.environ.has_key('CXXFLAGS'): 136601498ae73e654c2de997ea75075613a694d604dJosé Fonseca env['CXXFLAGS'] += SCons.Util.CLVar(os.environ['CXXFLAGS']) 137601498ae73e654c2de997ea75075613a694d604dJosé Fonseca if os.environ.has_key('LDFLAGS'): 138601498ae73e654c2de997ea75075613a694d604dJosé Fonseca env['LINKFLAGS'] += SCons.Util.CLVar(os.environ['LDFLAGS']) 1391ecf505087136c1120f440c265c57418b14d0442Alan Hourihane 14026e27ba30884be927cf1bc21d39f32d6096a6678José Fonseca env['gcc'] = 'gcc' in os.path.basename(env['CC']).split('-') 14126e27ba30884be927cf1bc21d39f32d6096a6678José Fonseca env['msvc'] = env['CC'] == 'cl' 142ee99647e02fe5b947838cfea276f095775eb1537Vinson Lee env['suncc'] = env['platform'] == 'sunos' and os.path.basename(env['CC']) == 'cc' 1434f109ca4e8ca2c1f0a60b52fa79dd907777e8beeVinson Lee env['clang'] = env['CC'] == 'clang' 1448734584952ea257d53ce421959bd9706345f221fVinson Lee env['icc'] = 'icc' == os.path.basename(env['CC']) 14526e27ba30884be927cf1bc21d39f32d6096a6678José Fonseca 146051f8bbfee6618e8bf04712cf214d96cec433e38José Fonseca if env['msvc'] and env['toolchain'] == 'default' and env['machine'] == 'x86_64': 147051f8bbfee6618e8bf04712cf214d96cec433e38José Fonseca # MSVC x64 support is broken in earlier versions of scons 148051f8bbfee6618e8bf04712cf214d96cec433e38José Fonseca env.EnsurePythonVersion(2, 0) 149051f8bbfee6618e8bf04712cf214d96cec433e38José Fonseca 150381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # shortcuts 151381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca machine = env['machine'] 152381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca platform = env['platform'] 153381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca x86 = env['machine'] == 'x86' 1546b69e3c71741d99a54c6f4dcb605a3c241239aebMichel Dänzer ppc = env['machine'] == 'ppc' 15526e27ba30884be927cf1bc21d39f32d6096a6678José Fonseca gcc = env['gcc'] 15626e27ba30884be927cf1bc21d39f32d6096a6678José Fonseca msvc = env['msvc'] 157ee99647e02fe5b947838cfea276f095775eb1537Vinson Lee suncc = env['suncc'] 1588734584952ea257d53ce421959bd9706345f221fVinson Lee icc = env['icc'] 159381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca 160ae760279f142244590c8aa76e3139529ca42952fJosé Fonseca # Determine whether we are cross compiling; in particular, whether we need 161ae760279f142244590c8aa76e3139529ca42952fJosé Fonseca # to compile code generators with a different compiler as the target code. 162ae760279f142244590c8aa76e3139529ca42952fJosé Fonseca host_platform = _platform.system().lower() 163eb1780238621c7be0342d9129eb639e4892c004dVinson Lee if host_platform.startswith('cygwin'): 164eb1780238621c7be0342d9129eb639e4892c004dVinson Lee host_platform = 'cygwin' 165590c2ee5681d1224befa334ed15c70fa4a0d007aJosé Fonseca host_machine = os.environ.get('PROCESSOR_ARCHITEW6432', os.environ.get('PROCESSOR_ARCHITECTURE', _platform.machine())) 166ae760279f142244590c8aa76e3139529ca42952fJosé Fonseca host_machine = { 167ae760279f142244590c8aa76e3139529ca42952fJosé Fonseca 'x86': 'x86', 168ae760279f142244590c8aa76e3139529ca42952fJosé Fonseca 'i386': 'x86', 169ae760279f142244590c8aa76e3139529ca42952fJosé Fonseca 'i486': 'x86', 170ae760279f142244590c8aa76e3139529ca42952fJosé Fonseca 'i586': 'x86', 171ae760279f142244590c8aa76e3139529ca42952fJosé Fonseca 'i686': 'x86', 172ae760279f142244590c8aa76e3139529ca42952fJosé Fonseca 'ppc' : 'ppc', 17333d8ff9c317eeb1300bc8e189d7b9c00b352323aJosé Fonseca 'AMD64': 'x86_64', 174ae760279f142244590c8aa76e3139529ca42952fJosé Fonseca 'x86_64': 'x86_64', 175ae760279f142244590c8aa76e3139529ca42952fJosé Fonseca }.get(host_machine, 'generic') 176ae760279f142244590c8aa76e3139529ca42952fJosé Fonseca env['crosscompile'] = platform != host_platform 177ae760279f142244590c8aa76e3139529ca42952fJosé Fonseca if machine == 'x86_64' and host_machine != 'x86_64': 178ae760279f142244590c8aa76e3139529ca42952fJosé Fonseca env['crosscompile'] = True 179982609f4cf2afc4e0afd450aa24907986bca41abJosé Fonseca env['hostonly'] = False 180ae760279f142244590c8aa76e3139529ca42952fJosé Fonseca 18167450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca # Backwards compatability with the debug= profile= options 18267450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca if env['build'] == 'debug': 18367450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca if not env['debug']: 184601498ae73e654c2de997ea75075613a694d604dJosé Fonseca print 'scons: warning: debug option is deprecated and will be removed eventually; use instead' 185601498ae73e654c2de997ea75075613a694d604dJosé Fonseca print 186601498ae73e654c2de997ea75075613a694d604dJosé Fonseca print ' scons build=release' 187601498ae73e654c2de997ea75075613a694d604dJosé Fonseca print 18867450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca env['build'] = 'release' 18967450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca if env['profile']: 190601498ae73e654c2de997ea75075613a694d604dJosé Fonseca print 'scons: warning: profile option is deprecated and will be removed eventually; use instead' 191601498ae73e654c2de997ea75075613a694d604dJosé Fonseca print 192601498ae73e654c2de997ea75075613a694d604dJosé Fonseca print ' scons build=profile' 193601498ae73e654c2de997ea75075613a694d604dJosé Fonseca print 19467450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca env['build'] = 'profile' 19567450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca if False: 19667450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca # Enforce SConscripts to use the new build variable 19767450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca env.popitem('debug') 19867450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca env.popitem('profile') 19967450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca else: 20067450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca # Backwards portability with older sconscripts 20167450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca if env['build'] in ('debug', 'checked'): 20267450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca env['debug'] = True 20367450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca env['profile'] = False 20467450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca if env['build'] == 'profile': 20567450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca env['debug'] = False 20667450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca env['profile'] = True 20767450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca if env['build'] == 'release': 20867450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca env['debug'] = False 20967450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca env['profile'] = False 21067450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca 211381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # Put build output in a separate dir, which depends on the current 212381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # configuration. See also http://www.scons.org/wiki/AdvancedBuildExample 213381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca build_topdir = 'build' 214381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca build_subdir = env['platform'] 21541750107496858a047afa8d81d20fe903f285a78José Fonseca if env['embedded']: 21641750107496858a047afa8d81d20fe903f285a78José Fonseca build_subdir = 'embedded-' + build_subdir 217381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca if env['machine'] != 'generic': 218381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca build_subdir += '-' + env['machine'] 21967450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca if env['build'] != 'release': 22067450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca build_subdir += '-' + env['build'] 221381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca build_dir = os.path.join(build_topdir, build_subdir) 222381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # Place the .sconsign file in the build dir too, to avoid issues with 223381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # different scons versions building the same source file 22467450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca env['build_dir'] = build_dir 225381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca env.SConsignFile(os.path.join(build_dir, '.sconsign')) 226fe889a89d28293d8f98b2cd730efc58785ceb5d8José Fonseca if 'SCONS_CACHE_DIR' in os.environ: 227fe889a89d28293d8f98b2cd730efc58785ceb5d8José Fonseca print 'scons: Using build cache in %s.' % (os.environ['SCONS_CACHE_DIR'],) 228fe889a89d28293d8f98b2cd730efc58785ceb5d8José Fonseca env.CacheDir(os.environ['SCONS_CACHE_DIR']) 2298b7552673f38b47abb432985e205785accdae5dfJosé Fonseca env['CONFIGUREDIR'] = os.path.join(build_dir, 'conf') 2308b7552673f38b47abb432985e205785accdae5dfJosé Fonseca env['CONFIGURELOG'] = os.path.join(os.path.abspath(build_dir), 'config.log') 231381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca 2321e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca # Parallel build 2331e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca if env.GetOption('num_jobs') <= 1: 2341e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca env.SetOption('num_jobs', num_jobs()) 2351e8177ee178b131afa86d874b062a8ae3fae0ccaJosé Fonseca 236601498ae73e654c2de997ea75075613a694d604dJosé Fonseca env.Decider('MD5-timestamp') 237601498ae73e654c2de997ea75075613a694d604dJosé Fonseca env.SetOption('max_drift', 60) 238601498ae73e654c2de997ea75075613a694d604dJosé Fonseca 239381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # C preprocessor options 240381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca cppdefines = [] 24167450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca if env['build'] in ('debug', 'checked'): 242381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca cppdefines += ['DEBUG'] 243381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca else: 244381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca cppdefines += ['NDEBUG'] 24567450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca if env['build'] == 'profile': 246381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca cppdefines += ['PROFILE'] 2478173471fc25f4c768cab54fa840fd4c53d1c3c0fJosé Fonseca if env['platform'] in ('posix', 'linux', 'freebsd', 'darwin'): 2488173471fc25f4c768cab54fa840fd4c53d1c3c0fJosé Fonseca cppdefines += [ 2498173471fc25f4c768cab54fa840fd4c53d1c3c0fJosé Fonseca '_POSIX_SOURCE', 2508173471fc25f4c768cab54fa840fd4c53d1c3c0fJosé Fonseca ('_POSIX_C_SOURCE', '199309L'), 2518173471fc25f4c768cab54fa840fd4c53d1c3c0fJosé Fonseca '_SVID_SOURCE', 2528173471fc25f4c768cab54fa840fd4c53d1c3c0fJosé Fonseca '_BSD_SOURCE', 2538173471fc25f4c768cab54fa840fd4c53d1c3c0fJosé Fonseca '_GNU_SOURCE', 254a2f28ceea22254f09ee37039eec873ccdf689e6cMatt Turner 'HAVE_PTHREAD', 2558173471fc25f4c768cab54fa840fd4c53d1c3c0fJosé Fonseca 'HAVE_POSIX_MEMALIGN', 2568173471fc25f4c768cab54fa840fd4c53d1c3c0fJosé Fonseca ] 2572699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca if env['platform'] == 'darwin': 2582699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca cppdefines += [ 2592699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca '_DARWIN_C_SOURCE', 2602699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca 'GLX_USE_APPLEGL', 2612699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca 'GLX_DIRECT_RENDERING', 2622699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca ] 2632699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca else: 2642699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca cppdefines += [ 2652699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca 'GLX_DIRECT_RENDERING', 2662699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca 'GLX_INDIRECT_RENDERING', 2672699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca ] 2682699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca if env['platform'] in ('linux', 'freebsd'): 2692699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca cppdefines += ['HAVE_ALIAS'] 2702699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca else: 2712699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca cppdefines += ['GLX_ALIAS_UNSUPPORTED'] 272381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca if platform == 'windows': 273381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca cppdefines += [ 274381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca 'WIN32', 275381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca '_WINDOWS', 27642be0104a22fdff0db3c39af9feb7d157ac87f46José Fonseca #'_UNICODE', 27742be0104a22fdff0db3c39af9feb7d157ac87f46José Fonseca #'UNICODE', 27857617c8eba7093be3da9d818389ef5f18246e4caJosé Fonseca # http://msdn.microsoft.com/en-us/library/aa383745.aspx 27957617c8eba7093be3da9d818389ef5f18246e4caJosé Fonseca ('_WIN32_WINNT', '0x0601'), 28057617c8eba7093be3da9d818389ef5f18246e4caJosé Fonseca ('WINVER', '0x0601'), 281381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca ] 2820646246cae023333220aebddd142670858f70e5aJosé Fonseca if gcc: 2830646246cae023333220aebddd142670858f70e5aJosé Fonseca cppdefines += [('__MSVCRT_VERSION__', '0x0700')] 28410b07665be5cff9fa9f03b0f7db459f3b380570dJosé Fonseca if msvc: 285b3e03ede3eeb224a2c293ae924ffa58f1de7e84aJosé Fonseca cppdefines += [ 286b3e03ede3eeb224a2c293ae924ffa58f1de7e84aJosé Fonseca 'VC_EXTRALEAN', 287ad0975f7011222f8da4fda5cc4a6d45468445ab1José Fonseca '_USE_MATH_DEFINES', 2881acd891ed31b14ac6c81fd869a681c4b89c7d901José Fonseca '_CRT_SECURE_NO_WARNINGS', 289b3e03ede3eeb224a2c293ae924ffa58f1de7e84aJosé Fonseca '_CRT_SECURE_NO_DEPRECATE', 2901acd891ed31b14ac6c81fd869a681c4b89c7d901José Fonseca '_SCL_SECURE_NO_WARNINGS', 2911acd891ed31b14ac6c81fd869a681c4b89c7d901José Fonseca '_SCL_SECURE_NO_DEPRECATE', 292b3e03ede3eeb224a2c293ae924ffa58f1de7e84aJosé Fonseca ] 29367450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca if env['build'] in ('debug', 'checked'): 294381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca cppdefines += ['_DEBUG'] 295381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca if platform == 'windows': 296381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca cppdefines += ['PIPE_SUBSYSTEM_WINDOWS_USER'] 29764ae209d50e2d28f46a3f0c6880e40e94ba23569Alexander von Gluck IV if platform == 'haiku': 29864ae209d50e2d28f46a3f0c6880e40e94ba23569Alexander von Gluck IV cppdefines += ['BEOS_THREADS'] 29941750107496858a047afa8d81d20fe903f285a78José Fonseca if env['embedded']: 30041750107496858a047afa8d81d20fe903f285a78José Fonseca cppdefines += ['PIPE_SUBSYSTEM_EMBEDDED'] 3013d6892c4793ae1fd1ef82d40e4af8004393b0480Vinson Lee if env['texture_float']: 3023d6892c4793ae1fd1ef82d40e4af8004393b0480Vinson Lee print 'warning: Floating-point textures enabled.' 3033d6892c4793ae1fd1ef82d40e4af8004393b0480Vinson Lee print 'warning: Please consult docs/patents.txt with your lawyer before building Mesa.' 3043d6892c4793ae1fd1ef82d40e4af8004393b0480Vinson Lee cppdefines += ['TEXTURE_FLOAT_ENABLED'] 305381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca env.Append(CPPDEFINES = cppdefines) 306381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca 307381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # C compiler options 30825f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca cflags = [] # C 30925f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca cxxflags = [] # C++ 31025f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca ccflags = [] # C & C++ 311381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca if gcc: 3129f151f93e69e988508d480beb36adb7674434ea7José Fonseca ccversion = env['CCVERSION'] 31367450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca if env['build'] == 'debug': 31467450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca ccflags += ['-O0'] 3151ecf505087136c1120f440c265c57418b14d0442Alan Hourihane elif ccversion.startswith('4.2.'): 316bb8f3090ba37aa3f24943fdb43c4120776289658José Fonseca # gcc 4.2.x optimizer is broken 317bb8f3090ba37aa3f24943fdb43c4120776289658José Fonseca print "warning: gcc 4.2.x optimizer is broken -- disabling optimizations" 31867450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca ccflags += ['-O0'] 319381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca else: 32067450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca ccflags += ['-O3'] 321983fa4ad523535debf2e94cf6ac1fd4c5630c0d2José Fonseca # gcc's builtin memcmp is slower than glibc's 322983fa4ad523535debf2e94cf6ac1fd4c5630c0d2José Fonseca # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43052 323983fa4ad523535debf2e94cf6ac1fd4c5630c0d2José Fonseca ccflags += ['-fno-builtin-memcmp'] 3242699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca # Work around aliasing bugs - developers should comment this out 3252699fce0d69db5158427c8b6c8194b2eefc5e58bJosé Fonseca ccflags += ['-fno-strict-aliasing'] 3262864f723d111810532fab7697ad7badf161f45abJosé Fonseca ccflags += ['-g'] 32767450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca if env['build'] in ('checked', 'profile'): 3281a9eec84bd363409b884fbf468dbec6ca595b593José Fonseca # See http://code.google.com/p/jrfonseca/wiki/Gprof2Dot#Which_options_should_I_pass_to_gcc_when_compiling_for_profiling? 3291a9eec84bd363409b884fbf468dbec6ca595b593José Fonseca ccflags += [ 3301a9eec84bd363409b884fbf468dbec6ca595b593José Fonseca '-fno-omit-frame-pointer', 3311a9eec84bd363409b884fbf468dbec6ca595b593José Fonseca '-fno-optimize-sibling-calls', 3321a9eec84bd363409b884fbf468dbec6ca595b593José Fonseca ] 333381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca if env['machine'] == 'x86': 33425f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca ccflags += [ 335381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca '-m32', 336381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca #'-march=pentium4', 337381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca ] 338d60f07489ef45fcdc46edbc51e662d2157a55cabJosé Fonseca if distutils.version.LooseVersion(ccversion) >= distutils.version.LooseVersion('4.2') \ 339cb3054c849d8485af53da6a61b31b5c4e4eeb95dAlexander von Gluck IV and (platform != 'windows' or env['build'] == 'debug' or True) \ 340cb3054c849d8485af53da6a61b31b5c4e4eeb95dAlexander von Gluck IV and platform != 'haiku': 34130c5d5d9d866749f55730117011f18f3f217b6d5José Fonseca # NOTE: We need to ensure stack is realigned given that we 34230c5d5d9d866749f55730117011f18f3f217b6d5José Fonseca # produce shared objects, and have no control over the stack 34330c5d5d9d866749f55730117011f18f3f217b6d5José Fonseca # alignment policy of the application. Therefore we need 34430c5d5d9d866749f55730117011f18f3f217b6d5José Fonseca # -mstackrealign ore -mincoming-stack-boundary=2. 34530c5d5d9d866749f55730117011f18f3f217b6d5José Fonseca # 346d60f07489ef45fcdc46edbc51e662d2157a55cabJosé Fonseca # XXX: -O and -mstackrealign causes stack corruption on MinGW 347d60f07489ef45fcdc46edbc51e662d2157a55cabJosé Fonseca # 34830c5d5d9d866749f55730117011f18f3f217b6d5José Fonseca # XXX: We could have SSE without -mstackrealign if we always used 34930c5d5d9d866749f55730117011f18f3f217b6d5José Fonseca # __attribute__((force_align_arg_pointer)), but that's not 35030c5d5d9d866749f55730117011f18f3f217b6d5José Fonseca # always the case. 3515ba645f0fbcb16ac97064c3d25d5966645410a44José Fonseca ccflags += [ 35230c5d5d9d866749f55730117011f18f3f217b6d5José Fonseca '-mstackrealign', # ensure stack is aligned 3535ba645f0fbcb16ac97064c3d25d5966645410a44José Fonseca '-mmmx', '-msse', '-msse2', # enable SIMD intrinsics 35430c5d5d9d866749f55730117011f18f3f217b6d5José Fonseca #'-mfpmath=sse', 3555ba645f0fbcb16ac97064c3d25d5966645410a44José Fonseca ] 35695ca22001a4d72325f963662a635d2b45feaf7b5Vinson Lee if platform in ['windows', 'darwin']: 3576f81b78cb4354af0c5a13805bcb59758a3db1c5eJosé Fonseca # Workaround http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37216 3586f81b78cb4354af0c5a13805bcb59758a3db1c5eJosé Fonseca ccflags += ['-fno-common'] 359cb3054c849d8485af53da6a61b31b5c4e4eeb95dAlexander von Gluck IV if platform in ['haiku']: 360cb3054c849d8485af53da6a61b31b5c4e4eeb95dAlexander von Gluck IV # Make optimizations compatible with Pentium or higher on Haiku 361cb3054c849d8485af53da6a61b31b5c4e4eeb95dAlexander von Gluck IV ccflags += [ 362cb3054c849d8485af53da6a61b31b5c4e4eeb95dAlexander von Gluck IV '-mstackrealign', # ensure stack is aligned 363cb3054c849d8485af53da6a61b31b5c4e4eeb95dAlexander von Gluck IV '-march=i586', # Haiku target is Pentium 364cb3054c849d8485af53da6a61b31b5c4e4eeb95dAlexander von Gluck IV '-mtune=i686', # use i686 where we can 365cb3054c849d8485af53da6a61b31b5c4e4eeb95dAlexander von Gluck IV '-mmmx' # use mmx math where we can 366cb3054c849d8485af53da6a61b31b5c4e4eeb95dAlexander von Gluck IV ] 367381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca if env['machine'] == 'x86_64': 36825f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca ccflags += ['-m64'] 369462e8a8b0d0836c2c2e3b4bf137ecd17db7292d2Vinson Lee if platform == 'darwin': 370462e8a8b0d0836c2c2e3b4bf137ecd17db7292d2Vinson Lee ccflags += ['-fno-common'] 371183133271c04c551f41d87baae17356ad4e9b384Alexander von Gluck IV if env['platform'] not in ('windows', 'haiku'): 3728173471fc25f4c768cab54fa840fd4c53d1c3c0fJosé Fonseca ccflags += ['-fvisibility=hidden'] 373102cb5c9cd5ce12fc43828e44e7baf390d4c351dJosé Fonseca # See also: 374102cb5c9cd5ce12fc43828e44e7baf390d4c351dJosé Fonseca # - http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html 37525f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca ccflags += [ 376381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca '-Wall', 377381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca '-Wno-long-long', 378381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca '-fmessage-length=0', # be nice to Eclipse 379381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca ] 38025f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca cflags += [ 38125f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca '-Wmissing-prototypes', 38225f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca '-std=gnu99', 38325f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca ] 3841ecf505087136c1120f440c265c57418b14d0442Alan Hourihane if distutils.version.LooseVersion(ccversion) >= distutils.version.LooseVersion('4.2'): 3857b6fa78d86612b73e662dc6981d32ef3cd534642José Fonseca ccflags += [ 3860edb40cb69124722691011b0db1c8b7376217728José Fonseca '-Wpointer-arith', 3877b6fa78d86612b73e662dc6981d32ef3cd534642José Fonseca ] 3887b6fa78d86612b73e662dc6981d32ef3cd534642José Fonseca cflags += [ 3890edb40cb69124722691011b0db1c8b7376217728José Fonseca '-Wdeclaration-after-statement', 3907b6fa78d86612b73e662dc6981d32ef3cd534642José Fonseca ] 3918734584952ea257d53ce421959bd9706345f221fVinson Lee if icc: 3928734584952ea257d53ce421959bd9706345f221fVinson Lee cflags += [ 3938734584952ea257d53ce421959bd9706345f221fVinson Lee '-std=gnu99', 3948734584952ea257d53ce421959bd9706345f221fVinson Lee ] 395381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca if msvc: 396381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # See also: 397a6c725839482f3d0f2af0eb15e5b6ab80184fb6cJosé Fonseca # - http://msdn.microsoft.com/en-us/library/19z1t1wy.aspx 398381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # - cl /? 39967450f0644f61fc17ab1315124dfe50537d36e9eJosé Fonseca if env['build'] == 'debug': 40025f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca ccflags += [ 401381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca '/Od', # disable optimizations 402381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca '/Oi', # enable intrinsic functions 403381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca '/Oy-', # disable frame pointer omission 404381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca ] 405381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca else: 40625f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca ccflags += [ 40778dad275646b720511dac31ca6ba0535568af81fJosé Fonseca '/O2', # optimize for speed 4083b8bb7b449dae6c16df0fa45e6567ec3d6b05dccJosé Fonseca ] 4093b8bb7b449dae6c16df0fa45e6567ec3d6b05dccJosé Fonseca if env['build'] == 'release': 4103b8bb7b449dae6c16df0fa45e6567ec3d6b05dccJosé Fonseca ccflags += [ 411da3bc492d2438ac915e720c17b54d0d12ffd8a97José Fonseca '/GL', # enable whole program optimization 412381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca ] 4133b8bb7b449dae6c16df0fa45e6567ec3d6b05dccJosé Fonseca else: 4143b8bb7b449dae6c16df0fa45e6567ec3d6b05dccJosé Fonseca ccflags += [ 4153b8bb7b449dae6c16df0fa45e6567ec3d6b05dccJosé Fonseca '/GL-', # disable whole program optimization 4163b8bb7b449dae6c16df0fa45e6567ec3d6b05dccJosé Fonseca ] 41725f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca ccflags += [ 418381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca '/W3', # warning level 419381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca #'/Wp64', # enable 64 bit porting warnings 4201d1c0fa2f31de5190909c869452ae9a2e23bba00José Fonseca '/wd4996', # disable deprecated POSIX name warnings 421381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca ] 422a6c725839482f3d0f2af0eb15e5b6ab80184fb6cJosé Fonseca if env['machine'] == 'x86': 42325f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca ccflags += [ 424a6c725839482f3d0f2af0eb15e5b6ab80184fb6cJosé Fonseca #'/arch:SSE2', # use the SSE2 instructions 425a6c725839482f3d0f2af0eb15e5b6ab80184fb6cJosé Fonseca ] 426381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca if platform == 'windows': 42725f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca ccflags += [ 428381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # TODO 429381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca ] 430381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # Automatic pdb generation 431381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # See http://scons.tigris.org/issues/show_bug.cgi?id=1656 432381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca env.EnsureSConsVersion(0, 98, 0) 433381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca env['PDB'] = '${TARGET.base}.pdb' 43425f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca env.Append(CCFLAGS = ccflags) 435381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca env.Append(CFLAGS = cflags) 43625f6c936fea899dd2989c76275f3f25d3a9a7d77José Fonseca env.Append(CXXFLAGS = cxxflags) 437381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca 4381781d7fa3880ffb6d3062414704fb4d29e9297adJosé Fonseca if env['platform'] == 'windows' and msvc: 4391781d7fa3880ffb6d3062414704fb4d29e9297adJosé Fonseca # Choose the appropriate MSVC CRT 4401781d7fa3880ffb6d3062414704fb4d29e9297adJosé Fonseca # http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx 441e3a3a5378e4a1b45f30fcb26730d6c73e623cfacJosé Fonseca if env['build'] in ('debug', 'checked'): 4421781d7fa3880ffb6d3062414704fb4d29e9297adJosé Fonseca env.Append(CCFLAGS = ['/MTd']) 4431781d7fa3880ffb6d3062414704fb4d29e9297adJosé Fonseca env.Append(SHCCFLAGS = ['/LDd']) 4441781d7fa3880ffb6d3062414704fb4d29e9297adJosé Fonseca else: 4451781d7fa3880ffb6d3062414704fb4d29e9297adJosé Fonseca env.Append(CCFLAGS = ['/MT']) 4461781d7fa3880ffb6d3062414704fb4d29e9297adJosé Fonseca env.Append(SHCCFLAGS = ['/LD']) 4471781d7fa3880ffb6d3062414704fb4d29e9297adJosé Fonseca 448381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # Assembler options 449381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca if gcc: 450381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca if env['machine'] == 'x86': 451381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca env.Append(ASFLAGS = ['-m32']) 452381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca if env['machine'] == 'x86_64': 453381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca env.Append(ASFLAGS = ['-m64']) 454381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca 455381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # Linker options 456381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca linkflags = [] 45772ad039d19e033baff774b184ece9ffbfef4a2ffJosé Fonseca shlinkflags = [] 458381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca if gcc: 459381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca if env['machine'] == 'x86': 460381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca linkflags += ['-m32'] 461381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca if env['machine'] == 'x86_64': 462381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca linkflags += ['-m64'] 46351ab599ddb213d6b846f333bbf03d5f6dde4831fVinson Lee if env['platform'] not in ('darwin'): 46451ab599ddb213d6b846f333bbf03d5f6dde4831fVinson Lee shlinkflags += [ 46551ab599ddb213d6b846f333bbf03d5f6dde4831fVinson Lee '-Wl,-Bsymbolic', 46651ab599ddb213d6b846f333bbf03d5f6dde4831fVinson Lee ] 4677b39194e2dbad6191b86c232d305dd910000753cJosé Fonseca # Handle circular dependencies in the libraries 4686b55aacccbbc2c86f03eafab23d5d74bc165c9edVinson Lee if env['platform'] in ('darwin'): 4696b55aacccbbc2c86f03eafab23d5d74bc165c9edVinson Lee pass 4706b55aacccbbc2c86f03eafab23d5d74bc165c9edVinson Lee else: 4716b55aacccbbc2c86f03eafab23d5d74bc165c9edVinson Lee env['_LIBFLAGS'] = '-Wl,--start-group ' + env['_LIBFLAGS'] + ' -Wl,--end-group' 4720646246cae023333220aebddd142670858f70e5aJosé Fonseca if env['platform'] == 'windows': 4730646246cae023333220aebddd142670858f70e5aJosé Fonseca # Avoid depending on gcc runtime DLLs 4740646246cae023333220aebddd142670858f70e5aJosé Fonseca linkflags += ['-static-libgcc'] 47597213fd7417bae8ef65cd3a30c26968a45a6df94José Fonseca if 'w64' in env['CC'].split('-'): 476129ace49f457858bc7640b67cf5dd688aee50323José Fonseca linkflags += ['-static-libstdc++'] 4770646246cae023333220aebddd142670858f70e5aJosé Fonseca # Handle the @xx symbol munging of DLL exports 4780646246cae023333220aebddd142670858f70e5aJosé Fonseca shlinkflags += ['-Wl,--enable-stdcall-fixup'] 4790646246cae023333220aebddd142670858f70e5aJosé Fonseca #shlinkflags += ['-Wl,--kill-at'] 480da3bc492d2438ac915e720c17b54d0d12ffd8a97José Fonseca if msvc: 4813b8bb7b449dae6c16df0fa45e6567ec3d6b05dccJosé Fonseca if env['build'] == 'release': 482da3bc492d2438ac915e720c17b54d0d12ffd8a97José Fonseca # enable Link-time Code Generation 483da3bc492d2438ac915e720c17b54d0d12ffd8a97José Fonseca linkflags += ['/LTCG'] 484da3bc492d2438ac915e720c17b54d0d12ffd8a97José Fonseca env.Append(ARFLAGS = ['/LTCG']) 4856fe421cf4634033bc7e75375e1d981bd235e2e51José Fonseca if platform == 'windows' and msvc: 486381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # See also: 487381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx 488381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca linkflags += [ 48973ccabc124f2c706d7fde490e4438413d2b94317José Fonseca '/fixed:no', 49073ccabc124f2c706d7fde490e4438413d2b94317José Fonseca '/incremental:no', 49173ccabc124f2c706d7fde490e4438413d2b94317José Fonseca ] 492381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca env.Append(LINKFLAGS = linkflags) 49372ad039d19e033baff774b184ece9ffbfef4a2ffJosé Fonseca env.Append(SHLINKFLAGS = shlinkflags) 494381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca 49511b15c4d254ee689183306579d9c4851e29c3c4aJosé Fonseca # We have C++ in several libraries, so always link with the C++ compiler 4964f109ca4e8ca2c1f0a60b52fa79dd907777e8beeVinson Lee if env['gcc'] or env['clang']: 49711b15c4d254ee689183306579d9c4851e29c3c4aJosé Fonseca env['LINK'] = env['CXX'] 49811b15c4d254ee689183306579d9c4851e29c3c4aJosé Fonseca 499c76787a1dcfa10b00fae5ac7f3d71dda758123cfJosé Fonseca # Default libs 5008173471fc25f4c768cab54fa840fd4c53d1c3c0fJosé Fonseca libs = [] 5017b676fd738691dba283fb17626026774b790cc0dVinson Lee if env['platform'] in ('darwin', 'freebsd', 'linux', 'posix', 'sunos'): 5028173471fc25f4c768cab54fa840fd4c53d1c3c0fJosé Fonseca libs += ['m', 'pthread', 'dl'] 5038173471fc25f4c768cab54fa840fd4c53d1c3c0fJosé Fonseca env.Append(LIBS = libs) 504c76787a1dcfa10b00fae5ac7f3d71dda758123cfJosé Fonseca 505e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger # OpenMP 506e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger if env['openmp']: 507e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger if env['msvc']: 508e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger env.Append(CCFLAGS = ['/openmp']) 509e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger # When building openmp release VS2008 link.exe crashes with LNK1103 error. 510e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger # Workaround: overwrite PDB flags with empty value as it isn't required anyways 511e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger if env['build'] == 'release': 512e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger env['PDB'] = '' 513e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger if env['gcc']: 514e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger env.Append(CCFLAGS = ['-fopenmp']) 515e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger env.Append(LIBS = ['gomp']) 516e411cd7b0a54d2f9b9f4cda4918aa7742ed5c2a6Andreas Fänger 517601498ae73e654c2de997ea75075613a694d604dJosé Fonseca # Load tools 5188987109c27899273bffca941c48b466218ba56eaJosé Fonseca env.Tool('lex') 5198987109c27899273bffca941c48b466218ba56eaJosé Fonseca env.Tool('yacc') 520ea532f0e725bd68e7784189c9b7f6f7bf7f9d901José Fonseca if env['llvm']: 521ea532f0e725bd68e7784189c9b7f6f7bf7f9d901José Fonseca env.Tool('llvm') 522601498ae73e654c2de997ea75075613a694d604dJosé Fonseca 523381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # Custom builders and methods 52497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env.Tool('custom') 52552c2dd1f73e17c8352fe976e2ee4cdf049f81957José Fonseca createInstallMethods(env) 526381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca 527235225ec935002b4669d14a48c9c20864a5496f8José Fonseca env.PkgCheckModules('X11', ['x11', 'xext', 'xdamage', 'xfixes']) 528bd3aab8d7915b0bc5829a32964955d9da84bef3bJosé Fonseca env.PkgCheckModules('XCB', ['x11-xcb', 'xcb-glx >= 1.8.1']) 529235225ec935002b4669d14a48c9c20864a5496f8José Fonseca env.PkgCheckModules('XF86VIDMODE', ['xxf86vm']) 5302470e918cc29e5d057a28551ce9c15e7d83fab7eJosé Fonseca env.PkgCheckModules('DRM', ['libdrm >= 2.4.24']) 531699e3b98214b52579e186594c21b972ea4cb4037Dave Airlie env.PkgCheckModules('DRM_INTEL', ['libdrm_intel >= 2.4.30']) 5322470e918cc29e5d057a28551ce9c15e7d83fab7eJosé Fonseca env.PkgCheckModules('DRM_RADEON', ['libdrm_radeon >= 2.4.31']) 5332470e918cc29e5d057a28551ce9c15e7d83fab7eJosé Fonseca env.PkgCheckModules('XORG', ['xorg-server >= 1.6.0']) 5342470e918cc29e5d057a28551ce9c15e7d83fab7eJosé Fonseca env.PkgCheckModules('KMS', ['libkms >= 2.4.24']) 5352470e918cc29e5d057a28551ce9c15e7d83fab7eJosé Fonseca env.PkgCheckModules('UDEV', ['libudev > 150']) 536235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 537235225ec935002b4669d14a48c9c20864a5496f8José Fonseca env['dri'] = env['x11'] and env['drm'] 538235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 539381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca # for debugging 540381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca #print env.Dump() 541b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca 542b04aa714afad014f2cdecc3ded9df0586f685921José Fonseca 543b04aa714afad014f2cdecc3ded9df0586f685921José Fonsecadef exists(env): 544381e3489c21c177d87bac9d7cdbfe7e2611772e5José Fonseca return 1 545