AMBuildScript
author David Anderson <danderson@mozilla.com>
Wed Jul 25 23:45:47 2012 -0700 (2012-07-25)
changeset 99 8d6f0341c367
parent 93 23189d937087
child 102 6726ff987b9b
permissions -rw-r--r--
Remove pointless arguments.
     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('CFLAGS', '-pipe')
    22 				self.compiler.AddToListVar('CFLAGS', '-fno-strict-aliasing')
    23 				if (self.vendor == 'gcc' and cxx.majorVersion >= 4) or self.vendor == 'clang':
    24 					self.compiler.AddToListVar('CFLAGS', '-fvisibility=hidden')
    25 					self.compiler.AddToListVar('CXXFLAGS', '-fvisibility-inlines-hidden')
    26 				self.compiler.AddToListVar('CFLAGS', '-Wall')
    27 				self.compiler.AddToListVar('CFLAGS', '-Werror')
    28 				self.compiler.AddToListVar('CFLAGS', '-Wno-switch')
    29 
    30 				if AMBuild.options.arch == 'x86':
    31 					self.compiler.AddToListVar('CFLAGS', '-m32')
    32 					self.compiler.AddToListVar('POSTLINKFLAGS', '-m32')
    33 				elif AMBuild.options.arch == 'x64':
    34 					self.compiler.AddToListVar('CFLAGS', '-m64')
    35 					self.compiler.AddToListVar('POSTLINKFLAGS', '-m64')
    36 				elif AMBuild.options.arch:
    37 					raise Exception('Unknown architecture: {0}'.format(AMBuild.options.arch))
    38 
    39 				# Disable some stuff we don't use, that gives us better binary
    40         # compatibility on Linux.
    41 				self.compiler.AddToListVar('CXXFLAGS', '-fno-exceptions')
    42 				self.compiler.AddToListVar('CXXFLAGS', '-fno-rtti')
    43 				self.compiler.AddToListVar('CXXFLAGS', '-fno-threadsafe-statics')
    44 
    45 				# We don't really care about these.
    46 				self.compiler.AddToListVar('CXXFLAGS', '-Wno-non-virtual-dtor')
    47 				self.compiler.AddToListVar('CXXFLAGS', '-Wno-overloaded-virtual')
    48 
    49 				# The compiler is too aggressive about what what should be a valid offsetof.
    50 				self.compiler.AddToListVar('CXXFLAGS', '-Wno-invalid-offsetof')
    51 
    52 				# This would otherwise forbid ((x = y) == NULL) in clang apparently.
    53 				if self.vendor == 'clang':
    54 					self.compiler.AddToListVar('CXXFLAGS', '-Wno-null-arithmetic')
    55 
    56 				if (self.vendor == 'gcc' and cxx.majorVersion >= 4 and cxx.minorVersion >= 7) or \
    57 						(self.vendor == 'clang' and cxx.majorVersion >= 3):
    58 					self.compiler.AddToListVar('CXXFLAGS', '-Wno-delete-non-virtual-dtor')
    59 
    60 				self.compiler.AddToListVar('POSTLINKFLAGS', '-lm')
    61 			elif isinstance(cxx, Cpp.MSVC):
    62 				self.vendor = 'msvc'
    63 				if AMBuild.options.debug == '1':
    64 					self.compiler.AddToListVar('CFLAGS', '/MTd')
    65 					self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt')
    66 				else:
    67 					self.compiler.AddToListVar('CFLAGS', '/MT')
    68 				self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_DEPRECATE')
    69 				self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_WARNINGS')
    70 				self.compiler.AddToListVar('CDEFINES', '_CRT_NONSTDC_NO_DEPRECATE')
    71 				self.compiler.AddToListVar('CXXFLAGS', '/EHsc')
    72 				self.compiler.AddToListVar('CXXFLAGS', '/GR-')
    73 				self.compiler.AddToListVar('CFLAGS', '/W3')
    74 				self.compiler.AddToListVar('CFLAGS', '/nologo')
    75 				self.compiler.AddToListVar('CFLAGS', '/Zi')
    76 				self.compiler.AddToListVar('CXXFLAGS', '/TP')
    77 				self.compiler.AddToListVar('POSTLINKFLAGS', '/DEBUG')
    78 
    79 				# if AMBuild.options.arch == 'x86':
    80 				# 	self.compiler.AddToListVar('POSTLINKFLAGS', '/MACHINE:X86')
    81 				# elif AMBuild.options.arch == 'x64':
    82 				# 	self.compiler.AddToListVar('POSTLINKFLAGS', '/MACHINE:X64')
    83 				# elif AMBuild.options.arch:
    84 				# 	raise Exception('Unknown architecture: {0}'.format(AMBuild.options.arch))
    85 
    86 				self.compiler.AddToListVar('POSTLINKFLAGS', 'kernel32.lib')
    87 				self.compiler.AddToListVar('POSTLINKFLAGS', 'user32.lib')
    88 				self.compiler.AddToListVar('POSTLINKFLAGS', 'gdi32.lib')
    89 				self.compiler.AddToListVar('POSTLINKFLAGS', 'winspool.lib')
    90 				self.compiler.AddToListVar('POSTLINKFLAGS', 'comdlg32.lib')
    91 				self.compiler.AddToListVar('POSTLINKFLAGS', 'advapi32.lib')
    92 				self.compiler.AddToListVar('POSTLINKFLAGS', 'shell32.lib')
    93 				self.compiler.AddToListVar('POSTLINKFLAGS', 'ole32.lib')
    94 				self.compiler.AddToListVar('POSTLINKFLAGS', 'oleaut32.lib')
    95 				self.compiler.AddToListVar('POSTLINKFLAGS', 'uuid.lib')
    96 				self.compiler.AddToListVar('POSTLINKFLAGS', 'odbc32.lib')
    97 				self.compiler.AddToListVar('POSTLINKFLAGS', 'odbccp32.lib')
    98 
    99 			#Optimization
   100 			if AMBuild.options.opt == '1':
   101 				self.compiler.AddToListVar('CDEFINES', 'NDEBUG')
   102 				if self.vendor == 'gcc' or self.vendor == 'clang':
   103 					self.compiler.AddToListVar('CFLAGS', '-O3')
   104 				elif self.vendor == 'msvc':
   105 					self.compiler.AddToListVar('CFLAGS', '/Ox')
   106 					self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:ICF')
   107 					self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:REF')
   108 
   109 			#Debugging
   110 			if AMBuild.options.debug == '1':
   111 				if self.vendor == 'gcc' or self.vendor == 'clang':
   112 					self.compiler.AddToListVar('CFLAGS', '-g3')
   113 				elif self.vendor == 'msvc':
   114 					self.compiler.AddToListVar('CFLAGS', '/Od')
   115 					self.compiler.AddToListVar('CFLAGS', '/RTC1')
   116 
   117 			#Platform-specifics
   118 			if AMBuild.target['platform'] == 'linux':
   119 				self.compiler.AddToListVar('CDEFINES', '_LINUX')
   120 				if self.vendor == 'gcc':
   121 					self.compiler.AddToListVar('POSTLINKFLAGS', '-static-libgcc')
   122 				if self.vendor == 'clang':
   123 					self.compiler.AddToListVar('POSTLINKFLAGS', '-lgcc_eh')
   124 			elif AMBuild.target['platform'] == 'darwin':
   125 				self.compiler.AddToListVar('POSTLINKFLAGS', '-mmacosx-version-min=10.5')
   126 				if AMBuild.options.arch == 'x86':
   127 					self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'i386'])
   128 				elif AMBuild.options.arch == 'x64':
   129 					self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'x86_64'])
   130 				self.compiler.AddToListVar('POSTLINKFLAGS', '-lstdc++')
   131 
   132 				# For OS X dylib versioning
   133 				import re
   134 				productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r')
   135 				productContents = productFile.read()
   136 				productFile.close()
   137 				m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
   138 				if m == None:
   139 					self.version = '1.0.0'
   140 				else:
   141 					major, minor, release = m.groups()
   142 					self.version = '{0}.{1}.{2}'.format(major, minor, release)
   143 				AMBuild.cache.CacheVariable('version', self.version)
   144 
   145 			#Finish up
   146 			self.compiler.ToConfig(AMBuild, 'compiler')
   147 			AMBuild.cache.CacheVariable('vendor', self.vendor)
   148 			self.targetMap = { }
   149 			AMBuild.cache.CacheVariable('targetMap', self.targetMap)
   150 		else:
   151 			self.compiler.FromConfig(AMBuild, 'compiler')
   152 			self.targetMap = AMBuild.cache['targetMap']
   153 
   154 	def DefaultCompiler(self):
   155 		return self.compiler.Clone()
   156 
   157 	def JobMatters(self, jobname):
   158 		file = sys._getframe().f_code.co_filename
   159 		if AMBuild.mode == 'config':
   160 			self.targetMap[jobname] = file
   161 			return True
   162 		if len(AMBuild.args) == 0:
   163 			return True
   164 		if not jobname in AMBuild.args:
   165 			return False
   166 
   167 ke = KE()
   168 globals = {
   169 	'KE': ke
   170 }
   171 
   172 FileList = [
   173 		['src', 'AMBuild.library'],
   174 		['src', 'AMBuild.shell']
   175 	]
   176 
   177 for parts in FileList:
   178 	AMBuild.Include(os.path.join(*parts), globals)
   179