dvander@89: # vim: set ts=2 sw=2 tw=99 noet ft=python: dvander@89: import os dvander@89: import sys dvander@89: from ambuild.command import SymlinkCommand dvander@89: dvander@89: class KE: dvander@89: def __init__(self): dvander@89: self.compiler = Cpp.Compiler() dvander@89: dvander@89: if AMBuild.mode == 'config': dvander@89: #Detect compilers dvander@89: self.compiler.DetectAll(AMBuild) dvander@89: dvander@89: #Set up defines dvander@89: cxx = self.compiler.cxx dvander@89: if isinstance(cxx, Cpp.CompatGCC): dvander@89: if isinstance(cxx, Cpp.GCC): dvander@89: self.vendor = 'gcc' dvander@89: elif isinstance(cxx, Cpp.Clang): dvander@89: self.vendor = 'clang' dvander@89: self.compiler.AddToListVar('CDEFINES', 'stricmp=strcasecmp') dvander@89: self.compiler.AddToListVar('CDEFINES', '_stricmp=strcasecmp') dvander@89: self.compiler.AddToListVar('CDEFINES', '_snprintf=snprintf') dvander@89: self.compiler.AddToListVar('CDEFINES', '_vsnprintf=vsnprintf') dvander@89: self.compiler.AddToListVar('CFLAGS', '-pipe') dvander@89: self.compiler.AddToListVar('CFLAGS', '-fno-strict-aliasing') dvander@89: if (self.vendor == 'gcc' and cxx.majorVersion >= 4) or self.vendor == 'clang': dvander@89: self.compiler.AddToListVar('CFLAGS', '-fvisibility=hidden') dvander@89: self.compiler.AddToListVar('CXXFLAGS', '-fvisibility-inlines-hidden') dvander@89: self.compiler.AddToListVar('CFLAGS', '-Wall') dvander@89: self.compiler.AddToListVar('CFLAGS', '-Werror') dvander@89: self.compiler.AddToListVar('CFLAGS', '-Wno-switch') dvander@89: dvander@89: if AMBuild.options.arch == 'x86': dvander@89: self.compiler.AddToListVar('CFLAGS', '-m32') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', '-m32') dvander@89: elif AMBuild.options.arch == 'x64': dvander@89: self.compiler.AddToListVar('CFLAGS', '-m64') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', '-m64') dvander@89: elif AMBuild.options.arch: dvander@89: raise Exception('Unknown architecture: {0}'.format(AMBuild.options.arch)) dvander@89: dvander@89: # Disable some stuff we don't use, that gives us better binary dvander@89: # compatibility on Linux. dvander@89: self.compiler.AddToListVar('CXXFLAGS', '-fno-exceptions') dvander@89: self.compiler.AddToListVar('CXXFLAGS', '-fno-rtti') dvander@89: self.compiler.AddToListVar('CXXFLAGS', '-fno-threadsafe-statics') dvander@89: danderson@91: # We don't really care about these. dvander@89: self.compiler.AddToListVar('CXXFLAGS', '-Wno-non-virtual-dtor') dvander@89: self.compiler.AddToListVar('CXXFLAGS', '-Wno-overloaded-virtual') dvander@89: danderson@91: # The compiler is too aggressive about what what should be a valid offsetof. danderson@91: self.compiler.AddToListVar('CXXFLAGS', '-Wno-invalid-offsetof') danderson@91: danderson@91: # This would otherwise forbid ((x = y) == NULL) in clang apparently. danderson@91: self.compiler.AddToListVar('CXXFLAGS', '-Wno-null-arithmetic') danderson@91: dvander@89: if (self.vendor == 'gcc' and cxx.majorVersion >= 4 and cxx.minorVersion >= 7) or \ dvander@89: (self.vendor == 'clang' and cxx.majorVersion >= 3): dvander@89: self.compiler.AddToListVar('CXXFLAGS', '-Wno-delete-non-virtual-dtor') dvander@89: elif isinstance(cxx, Cpp.MSVC): dvander@89: self.vendor = 'msvc' dvander@89: if AMBuild.options.debug == '1': dvander@89: self.compiler.AddToListVar('CFLAGS', '/MTd') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt') dvander@89: else: dvander@89: self.compiler.AddToListVar('CFLAGS', '/MT') dvander@89: self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_DEPRECATE') dvander@89: self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_WARNINGS') dvander@89: self.compiler.AddToListVar('CDEFINES', '_CRT_NONSTDC_NO_DEPRECATE') dvander@89: self.compiler.AddToListVar('CXXFLAGS', '/EHsc') dvander@89: self.compiler.AddToListVar('CXXFLAGS', '/GR-') dvander@89: self.compiler.AddToListVar('CFLAGS', '/W3') dvander@89: self.compiler.AddToListVar('CFLAGS', '/nologo') dvander@89: self.compiler.AddToListVar('CFLAGS', '/Zi') dvander@89: self.compiler.AddToListVar('CXXFLAGS', '/TP') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', '/DEBUG') dvander@89: dvander@89: # if AMBuild.options.arch == 'x86': dvander@89: # self.compiler.AddToListVar('POSTLINKFLAGS', '/MACHINE:X86') dvander@89: # elif AMBuild.options.arch == 'x64': dvander@89: # self.compiler.AddToListVar('POSTLINKFLAGS', '/MACHINE:X64') dvander@89: # elif AMBuild.options.arch: dvander@89: # raise Exception('Unknown architecture: {0}'.format(AMBuild.options.arch)) dvander@89: dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', 'kernel32.lib') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', 'user32.lib') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', 'gdi32.lib') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', 'winspool.lib') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', 'comdlg32.lib') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', 'advapi32.lib') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', 'shell32.lib') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', 'ole32.lib') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', 'oleaut32.lib') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', 'uuid.lib') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', 'odbc32.lib') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', 'odbccp32.lib') dvander@89: dvander@89: #Optimization dvander@89: if AMBuild.options.opt == '1': dvander@89: self.compiler.AddToListVar('CDEFINES', 'NDEBUG') dvander@89: if self.vendor == 'gcc' or self.vendor == 'clang': dvander@89: self.compiler.AddToListVar('CFLAGS', '-O3') dvander@89: elif self.vendor == 'msvc': dvander@89: self.compiler.AddToListVar('CFLAGS', '/Ox') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:ICF') dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:REF') dvander@89: dvander@89: #Debugging dvander@89: if AMBuild.options.debug == '1': dvander@89: self.compiler.AddToListVar('CDEFINES', 'DEBUG') dvander@89: self.compiler.AddToListVar('CDEFINES', '_DEBUG') dvander@89: if self.vendor == 'gcc' or self.vendor == 'clang': dvander@89: self.compiler.AddToListVar('CFLAGS', '-g3') dvander@89: elif self.vendor == 'msvc': dvander@89: self.compiler.AddToListVar('CFLAGS', '/Od') dvander@89: self.compiler.AddToListVar('CFLAGS', '/RTC1') dvander@89: dvander@89: #Platform-specifics dvander@89: if AMBuild.target['platform'] == 'linux': dvander@89: self.compiler.AddToListVar('CDEFINES', '_LINUX') dvander@89: if self.vendor == 'gcc': dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', '-static-libgcc') dvander@89: if self.vendor == 'clang': dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', '-lgcc_eh') dvander@89: elif AMBuild.target['platform'] == 'darwin': dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', '-mmacosx-version-min=10.5') dvander@89: if AMBuild.options.arch == 'x86': dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'i386']) dvander@89: elif AMBuild.options.arch == 'x64': dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'x86_64']) dvander@89: self.compiler.AddToListVar('POSTLINKFLAGS', '-lstdc++') dvander@89: dvander@89: # For OS X dylib versioning dvander@89: import re dvander@89: productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r') dvander@89: productContents = productFile.read() dvander@89: productFile.close() dvander@89: m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents) dvander@89: if m == None: dvander@89: self.version = '1.0.0' dvander@89: else: dvander@89: major, minor, release = m.groups() dvander@89: self.version = '{0}.{1}.{2}'.format(major, minor, release) dvander@89: AMBuild.cache.CacheVariable('version', self.version) dvander@89: dvander@89: #Finish up dvander@89: self.compiler.ToConfig(AMBuild, 'compiler') dvander@89: AMBuild.cache.CacheVariable('vendor', self.vendor) dvander@89: self.targetMap = { } dvander@89: AMBuild.cache.CacheVariable('targetMap', self.targetMap) dvander@89: else: dvander@89: self.compiler.FromConfig(AMBuild, 'compiler') dvander@89: self.targetMap = AMBuild.cache['targetMap'] dvander@89: dvander@89: def DefaultCompiler(self): dvander@89: return self.compiler.Clone() dvander@89: dvander@89: def JobMatters(self, jobname): dvander@89: file = sys._getframe().f_code.co_filename dvander@89: if AMBuild.mode == 'config': dvander@89: self.targetMap[jobname] = file dvander@89: return True dvander@89: if len(AMBuild.args) == 0: dvander@89: return True dvander@89: if not jobname in AMBuild.args: dvander@89: return False dvander@89: dvander@89: ke = KE() dvander@89: globals = { dvander@89: 'KE': ke dvander@89: } dvander@89: dvander@89: FileList = [ dvander@89: ['src', 'AMBuild.library'], dvander@89: ['src', 'AMBuild.shell'] dvander@89: ] dvander@89: dvander@89: for parts in FileList: dvander@89: AMBuild.Include(os.path.join(*parts), globals) dvander@89: