AMBuildScript
author David Anderson <dvander@alliedmods.net>
Sun Jan 27 17:34:30 2013 -0800 (2013-01-27)
changeset 261 219b49bf4a03
parent 251 ca99a81745fe
permissions -rw-r--r--
Add support for importing enum types and enum values (as constexprs).
     1 # vim: set ts=2 sw=2 tw=99 noet ft=python:
     2 # 
     3 # Copyright (C) 2004-2012 David Anderson
     4 # 
     5 # This file is part of SourcePawn.
     6 # 
     7 # SourcePawn is free software: you can redistribute it and/or modify it under
     8 # the terms of the GNU General Public License as published by the Free
     9 # Software Foundation, either version 3 of the License, or (at your option)
    10 # any later version.
    11 # 
    12 # SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
    13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    14 # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
    15 # 
    16 # You should have received a copy of the GNU General Public License along with
    17 # SourcePawn. If not, see http://www.gnu.org/licenses/.
    18 #
    19 
    20 import os
    21 import sys
    22 from ambuild.command import SymlinkCommand
    23 
    24 class KE:
    25 	def __init__(self):
    26 		self.compiler = Cpp.Compiler()
    27 
    28 		if AMBuild.mode == 'config':
    29 			#Detect compilers
    30 			self.compiler.DetectAll(AMBuild)
    31 
    32 			#Set up defines
    33 			cxx = self.compiler.cxx
    34 			if isinstance(cxx, Cpp.CompatGCC):
    35 				if isinstance(cxx, Cpp.GCC):
    36 					self.vendor = 'gcc'
    37 				elif isinstance(cxx, Cpp.Clang):
    38 					self.vendor = 'clang'
    39 				self.compiler.AddToListVar('CFLAGS', '-pipe')
    40 				self.compiler.AddToListVar('CFLAGS', '-fno-strict-aliasing')
    41 				if (self.vendor == 'gcc' and cxx.majorVersion >= 4) or self.vendor == 'clang':
    42 					self.compiler.AddToListVar('CFLAGS', '-fvisibility=hidden')
    43 					self.compiler.AddToListVar('CXXFLAGS', '-fvisibility-inlines-hidden')
    44 				self.compiler.AddToListVar('CFLAGS', '-Wall')
    45 				self.compiler.AddToListVar('CFLAGS', '-Werror')
    46 				self.compiler.AddToListVar('CFLAGS', '-Wno-switch')
    47 
    48 				if AMBuild.options.arch == 'x86':
    49 					self.compiler.AddToListVar('CFLAGS', '-m32')
    50 					self.compiler.AddToListVar('POSTLINKFLAGS', '-m32')
    51 				elif AMBuild.options.arch == 'x64':
    52 					self.compiler.AddToListVar('CFLAGS', '-m64')
    53 					self.compiler.AddToListVar('POSTLINKFLAGS', '-m64')
    54 				elif AMBuild.options.arch:
    55 					raise Exception('Unknown architecture: {0}'.format(AMBuild.options.arch))
    56 
    57 				# Disable some stuff we don't use, that gives us better binary
    58         # compatibility on Linux.
    59 				self.compiler.AddToListVar('CXXFLAGS', '-fno-exceptions')
    60 				self.compiler.AddToListVar('CXXFLAGS', '-fno-rtti')
    61 				self.compiler.AddToListVar('CXXFLAGS', '-fno-threadsafe-statics')
    62 
    63 				# We don't really care about these.
    64 				self.compiler.AddToListVar('CXXFLAGS', '-Wno-non-virtual-dtor')
    65 				self.compiler.AddToListVar('CXXFLAGS', '-Wno-overloaded-virtual')
    66 
    67 				# The compiler is too aggressive about what what should be a valid offsetof.
    68 				self.compiler.AddToListVar('CXXFLAGS', '-Wno-invalid-offsetof')
    69 
    70 				# This would otherwise forbid ((x = y) == NULL) in clang apparently.
    71 				if self.vendor == 'clang' and cxx.majorVersion > 1:
    72 					self.compiler.AddToListVar('CXXFLAGS', '-Wno-null-arithmetic')
    73 				if self.vendor == 'clang' and \
    74 				   cxx.majorVersion >= 3 and \
    75 				   cxx.minorVersion >= 3:
    76 					self.compiler.AddToListVar('CXXFLAGS', '-Wno-unused-private-field')
    77 
    78 				if (self.vendor == 'gcc' and cxx.majorVersion >= 4 and cxx.minorVersion >= 7) or \
    79 						(self.vendor == 'clang' and cxx.majorVersion >= 3):
    80 					self.compiler.AddToListVar('CXXFLAGS', '-Wno-delete-non-virtual-dtor')
    81 
    82 				self.compiler.AddToListVar('POSTLINKFLAGS', '-lm')
    83 			elif isinstance(cxx, Cpp.MSVC):
    84 				self.vendor = 'msvc'
    85 				if AMBuild.options.debug == '1':
    86 					self.compiler.AddToListVar('CFLAGS', '/MTd')
    87 					self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt')
    88 				else:
    89 					self.compiler.AddToListVar('CFLAGS', '/MT')
    90 				self.compiler.AddToListVar('CDEFINES', 'WIN32')
    91 				self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_DEPRECATE')
    92 				self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_WARNINGS')
    93 				self.compiler.AddToListVar('CDEFINES', '_CRT_NONSTDC_NO_DEPRECATE')
    94 				self.compiler.AddToListVar('CXXFLAGS', '/EHsc')
    95 				self.compiler.AddToListVar('CXXFLAGS', '/GR-')
    96 				self.compiler.AddToListVar('CFLAGS', '/W3')
    97 				self.compiler.AddToListVar('CFLAGS', '/nologo')
    98 				self.compiler.AddToListVar('CFLAGS', '/Zi')
    99 				self.compiler.AddToListVar('CXXFLAGS', '/TP')
   100 				self.compiler.AddToListVar('POSTLINKFLAGS', '/DEBUG')
   101 
   102 				self.compiler.AddToListVar('POSTLINKFLAGS', 'kernel32.lib')
   103 				self.compiler.AddToListVar('POSTLINKFLAGS', 'user32.lib')
   104 				self.compiler.AddToListVar('POSTLINKFLAGS', 'gdi32.lib')
   105 				self.compiler.AddToListVar('POSTLINKFLAGS', 'winspool.lib')
   106 				self.compiler.AddToListVar('POSTLINKFLAGS', 'comdlg32.lib')
   107 				self.compiler.AddToListVar('POSTLINKFLAGS', 'advapi32.lib')
   108 				self.compiler.AddToListVar('POSTLINKFLAGS', 'shell32.lib')
   109 				self.compiler.AddToListVar('POSTLINKFLAGS', 'ole32.lib')
   110 				self.compiler.AddToListVar('POSTLINKFLAGS', 'oleaut32.lib')
   111 				self.compiler.AddToListVar('POSTLINKFLAGS', 'uuid.lib')
   112 				self.compiler.AddToListVar('POSTLINKFLAGS', 'odbc32.lib')
   113 				self.compiler.AddToListVar('POSTLINKFLAGS', 'odbccp32.lib')
   114 
   115 			#Optimization
   116 			if AMBuild.options.opt == '1':
   117 				self.compiler.AddToListVar('CDEFINES', 'NDEBUG')
   118 				if self.vendor == 'gcc' or self.vendor == 'clang':
   119 					self.compiler.AddToListVar('CFLAGS', '-O3')
   120 				elif self.vendor == 'msvc':
   121 					self.compiler.AddToListVar('CFLAGS', '/Ox')
   122 					self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:ICF')
   123 					self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:REF')
   124 
   125 			#Debugging
   126 			if AMBuild.options.debug == '1':
   127 				if self.vendor == 'gcc' or self.vendor == 'clang':
   128 					self.compiler.AddToListVar('CFLAGS', '-g3')
   129 				elif self.vendor == 'msvc':
   130 					self.compiler.AddToListVar('CFLAGS', '/Od')
   131 					self.compiler.AddToListVar('CFLAGS', '/RTC1')
   132 
   133 			#Platform-specifics
   134 			if AMBuild.target['platform'] == 'linux':
   135 				self.compiler.AddToListVar('CDEFINES', '_LINUX')
   136 				if self.vendor == 'gcc':
   137 					self.compiler.AddToListVar('POSTLINKFLAGS', '-static-libgcc')
   138 				if self.vendor == 'clang':
   139 					self.compiler.AddToListVar('POSTLINKFLAGS', '-lgcc_eh')
   140 			elif AMBuild.target['platform'] == 'darwin':
   141 				self.compiler.AddToListVar('POSTLINKFLAGS', '-mmacosx-version-min=10.5')
   142 				if AMBuild.options.arch == 'x86':
   143 					self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'i386'])
   144 				elif AMBuild.options.arch == 'x64':
   145 					self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'x86_64'])
   146 				self.compiler.AddToListVar('POSTLINKFLAGS', '-lstdc++')
   147 
   148 				# For OS X dylib versioning
   149 				import re
   150 				productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r')
   151 				productContents = productFile.read()
   152 				productFile.close()
   153 				m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
   154 				if m == None:
   155 					self.version = '1.0.0'
   156 				else:
   157 					major, minor, release = m.groups()
   158 					self.version = '{0}.{1}.{2}'.format(major, minor, release)
   159 				AMBuild.cache.CacheVariable('version', self.version)
   160 
   161 			#Finish up
   162 			self.compiler.ToConfig(AMBuild, 'compiler')
   163 			AMBuild.cache.CacheVariable('vendor', self.vendor)
   164 			self.targetMap = { }
   165 			AMBuild.cache.CacheVariable('targetMap', self.targetMap)
   166 		else:
   167 			self.compiler.FromConfig(AMBuild, 'compiler')
   168 			self.targetMap = AMBuild.cache['targetMap']
   169 
   170 	def DefaultCompiler(self):
   171 		return self.compiler.Clone()
   172 
   173 	def JobMatters(self, jobname):
   174 		file = sys._getframe().f_code.co_filename
   175 		if AMBuild.mode == 'config':
   176 			self.targetMap[jobname] = file
   177 			return True
   178 		if len(AMBuild.args) == 0:
   179 			return True
   180 		if not jobname in AMBuild.args:
   181 			return False
   182 
   183 ke = KE()
   184 globals = {
   185 	'KE': ke
   186 }
   187 
   188 FileList = [
   189 		['src', 'AMBuild.library'],
   190 		['src', 'AMBuild.shell'],
   191 		['AMBuild.dist']
   192 	]
   193 
   194 for parts in FileList:
   195 	AMBuild.Include(os.path.join(*parts), globals)
   196