AMBuildScript
author David Anderson <dvander@alliedmods.net>
Wed Jul 25 00:16:52 2012 -0700 (2012-07-25)
changeset 90 3da12b433b00
parent 89 f360bbc9b140
child 91 5f4402180204
permissions -rw-r--r--
Added a product.version file.
     1 # vim: set ts=2 sw=2 tw=99 noet ft=python:
     2 import os
     3 import sys
     4 from ambuild.command import SymlinkCommand
     5 
     6 class KE:
     7 	def __init__(self):
     8 		self.compiler = Cpp.Compiler()
     9 
    10 		if AMBuild.mode == 'config':
    11 			#Detect compilers
    12 			self.compiler.DetectAll(AMBuild)
    13 
    14 			#Set up defines
    15 			cxx = self.compiler.cxx
    16 			if isinstance(cxx, Cpp.CompatGCC):
    17 				if isinstance(cxx, Cpp.GCC):
    18 					self.vendor = 'gcc'
    19 				elif isinstance(cxx, Cpp.Clang):
    20 					self.vendor = 'clang'
    21 				self.compiler.AddToListVar('CDEFINES', 'stricmp=strcasecmp')
    22 				self.compiler.AddToListVar('CDEFINES', '_stricmp=strcasecmp')
    23 				self.compiler.AddToListVar('CDEFINES', '_snprintf=snprintf')
    24 				self.compiler.AddToListVar('CDEFINES', '_vsnprintf=vsnprintf')
    25 				self.compiler.AddToListVar('CFLAGS', '-pipe')
    26 				self.compiler.AddToListVar('CFLAGS', '-fno-strict-aliasing')
    27 				if (self.vendor == 'gcc' and cxx.majorVersion >= 4) or self.vendor == 'clang':
    28 					self.compiler.AddToListVar('CFLAGS', '-fvisibility=hidden')
    29 					self.compiler.AddToListVar('CXXFLAGS', '-fvisibility-inlines-hidden')
    30 				self.compiler.AddToListVar('CFLAGS', '-Wall')
    31 				self.compiler.AddToListVar('CFLAGS', '-Werror')
    32 				self.compiler.AddToListVar('CFLAGS', '-Wno-switch')
    33 
    34 				if AMBuild.options.arch == 'x86':
    35 					self.compiler.AddToListVar('CFLAGS', '-m32')
    36 					self.compiler.AddToListVar('POSTLINKFLAGS', '-m32')
    37 				elif AMBuild.options.arch == 'x64':
    38 					self.compiler.AddToListVar('CFLAGS', '-m64')
    39 					self.compiler.AddToListVar('POSTLINKFLAGS', '-m64')
    40 				elif AMBuild.options.arch:
    41 					raise Exception('Unknown architecture: {0}'.format(AMBuild.options.arch))
    42 
    43 				# Disable some stuff we don't use, that gives us better binary
    44         # compatibility on Linux.
    45 				self.compiler.AddToListVar('CXXFLAGS', '-fno-exceptions')
    46 				self.compiler.AddToListVar('CXXFLAGS', '-fno-rtti')
    47 				self.compiler.AddToListVar('CXXFLAGS', '-fno-threadsafe-statics')
    48 
    49 				self.compiler.AddToListVar('CXXFLAGS', '-Wno-non-virtual-dtor')
    50 				self.compiler.AddToListVar('CXXFLAGS', '-Wno-overloaded-virtual')
    51 
    52 				if (self.vendor == 'gcc' and cxx.majorVersion >= 4 and cxx.minorVersion >= 7) or \
    53 						(self.vendor == 'clang' and cxx.majorVersion >= 3):
    54 					self.compiler.AddToListVar('CXXFLAGS', '-Wno-delete-non-virtual-dtor')
    55 			elif isinstance(cxx, Cpp.MSVC):
    56 				self.vendor = 'msvc'
    57 				if AMBuild.options.debug == '1':
    58 					self.compiler.AddToListVar('CFLAGS', '/MTd')
    59 					self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt')
    60 				else:
    61 					self.compiler.AddToListVar('CFLAGS', '/MT')
    62 				self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_DEPRECATE')
    63 				self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_WARNINGS')
    64 				self.compiler.AddToListVar('CDEFINES', '_CRT_NONSTDC_NO_DEPRECATE')
    65 				self.compiler.AddToListVar('CXXFLAGS', '/EHsc')
    66 				self.compiler.AddToListVar('CXXFLAGS', '/GR-')
    67 				self.compiler.AddToListVar('CFLAGS', '/W3')
    68 				self.compiler.AddToListVar('CFLAGS', '/nologo')
    69 				self.compiler.AddToListVar('CFLAGS', '/Zi')
    70 				self.compiler.AddToListVar('CXXFLAGS', '/TP')
    71 				self.compiler.AddToListVar('POSTLINKFLAGS', '/DEBUG')
    72 
    73 				# if AMBuild.options.arch == 'x86':
    74 				# 	self.compiler.AddToListVar('POSTLINKFLAGS', '/MACHINE:X86')
    75 				# elif AMBuild.options.arch == 'x64':
    76 				# 	self.compiler.AddToListVar('POSTLINKFLAGS', '/MACHINE:X64')
    77 				# elif AMBuild.options.arch:
    78 				# 	raise Exception('Unknown architecture: {0}'.format(AMBuild.options.arch))
    79 
    80 				self.compiler.AddToListVar('POSTLINKFLAGS', 'kernel32.lib')
    81 				self.compiler.AddToListVar('POSTLINKFLAGS', 'user32.lib')
    82 				self.compiler.AddToListVar('POSTLINKFLAGS', 'gdi32.lib')
    83 				self.compiler.AddToListVar('POSTLINKFLAGS', 'winspool.lib')
    84 				self.compiler.AddToListVar('POSTLINKFLAGS', 'comdlg32.lib')
    85 				self.compiler.AddToListVar('POSTLINKFLAGS', 'advapi32.lib')
    86 				self.compiler.AddToListVar('POSTLINKFLAGS', 'shell32.lib')
    87 				self.compiler.AddToListVar('POSTLINKFLAGS', 'ole32.lib')
    88 				self.compiler.AddToListVar('POSTLINKFLAGS', 'oleaut32.lib')
    89 				self.compiler.AddToListVar('POSTLINKFLAGS', 'uuid.lib')
    90 				self.compiler.AddToListVar('POSTLINKFLAGS', 'odbc32.lib')
    91 				self.compiler.AddToListVar('POSTLINKFLAGS', 'odbccp32.lib')
    92 
    93 			#Optimization
    94 			if AMBuild.options.opt == '1':
    95 				self.compiler.AddToListVar('CDEFINES', 'NDEBUG')
    96 				if self.vendor == 'gcc' or self.vendor == 'clang':
    97 					self.compiler.AddToListVar('CFLAGS', '-O3')
    98 				elif self.vendor == 'msvc':
    99 					self.compiler.AddToListVar('CFLAGS', '/Ox')
   100 					self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:ICF')
   101 					self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:REF')
   102 
   103 			#Debugging
   104 			if AMBuild.options.debug == '1':
   105 				self.compiler.AddToListVar('CDEFINES', 'DEBUG')
   106 				self.compiler.AddToListVar('CDEFINES', '_DEBUG')
   107 				if self.vendor == 'gcc' or self.vendor == 'clang':
   108 					self.compiler.AddToListVar('CFLAGS', '-g3')
   109 				elif self.vendor == 'msvc':
   110 					self.compiler.AddToListVar('CFLAGS', '/Od')
   111 					self.compiler.AddToListVar('CFLAGS', '/RTC1')
   112 
   113 			#Platform-specifics
   114 			if AMBuild.target['platform'] == 'linux':
   115 				self.compiler.AddToListVar('CDEFINES', '_LINUX')
   116 				if self.vendor == 'gcc':
   117 					self.compiler.AddToListVar('POSTLINKFLAGS', '-static-libgcc')
   118 				if self.vendor == 'clang':
   119 					self.compiler.AddToListVar('POSTLINKFLAGS', '-lgcc_eh')
   120 			elif AMBuild.target['platform'] == 'darwin':
   121 				self.compiler.AddToListVar('POSTLINKFLAGS', '-mmacosx-version-min=10.5')
   122 				if AMBuild.options.arch == 'x86':
   123 					self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'i386'])
   124 				elif AMBuild.options.arch == 'x64':
   125 					self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'x86_64'])
   126 				self.compiler.AddToListVar('POSTLINKFLAGS', '-lstdc++')
   127 
   128 				# For OS X dylib versioning
   129 				import re
   130 				productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r')
   131 				productContents = productFile.read()
   132 				productFile.close()
   133 				m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
   134 				if m == None:
   135 					self.version = '1.0.0'
   136 				else:
   137 					major, minor, release = m.groups()
   138 					self.version = '{0}.{1}.{2}'.format(major, minor, release)
   139 				AMBuild.cache.CacheVariable('version', self.version)
   140 
   141 			#Finish up
   142 			self.compiler.ToConfig(AMBuild, 'compiler')
   143 			AMBuild.cache.CacheVariable('vendor', self.vendor)
   144 			self.targetMap = { }
   145 			AMBuild.cache.CacheVariable('targetMap', self.targetMap)
   146 		else:
   147 			self.compiler.FromConfig(AMBuild, 'compiler')
   148 			self.targetMap = AMBuild.cache['targetMap']
   149 
   150 	def DefaultCompiler(self):
   151 		return self.compiler.Clone()
   152 
   153 	def JobMatters(self, jobname):
   154 		file = sys._getframe().f_code.co_filename
   155 		if AMBuild.mode == 'config':
   156 			self.targetMap[jobname] = file
   157 			return True
   158 		if len(AMBuild.args) == 0:
   159 			return True
   160 		if not jobname in AMBuild.args:
   161 			return False
   162 
   163 ke = KE()
   164 globals = {
   165 	'KE': ke
   166 }
   167 
   168 FileList = [
   169 		['src', 'AMBuild.library'],
   170 		['src', 'AMBuild.shell']
   171 	]
   172 
   173 for parts in FileList:
   174 	AMBuild.Include(os.path.join(*parts), globals)
   175