Added a product.version file.
1 # vim: set ts=2 sw=2 tw=99 noet ft=python:
4 from ambuild.command import SymlinkCommand
8 self.compiler = Cpp.Compiler()
10 if AMBuild.mode == 'config':
12 self.compiler.DetectAll(AMBuild)
15 cxx = self.compiler.cxx
16 if isinstance(cxx, Cpp.CompatGCC):
17 if isinstance(cxx, Cpp.GCC):
19 elif isinstance(cxx, Cpp.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')
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))
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')
49 self.compiler.AddToListVar('CXXFLAGS', '-Wno-non-virtual-dtor')
50 self.compiler.AddToListVar('CXXFLAGS', '-Wno-overloaded-virtual')
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):
57 if AMBuild.options.debug == '1':
58 self.compiler.AddToListVar('CFLAGS', '/MTd')
59 self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt')
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')
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))
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')
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')
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')
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++')
128 # For OS X dylib versioning
130 productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r')
131 productContents = productFile.read()
133 m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
135 self.version = '1.0.0'
137 major, minor, release = m.groups()
138 self.version = '{0}.{1}.{2}'.format(major, minor, release)
139 AMBuild.cache.CacheVariable('version', self.version)
142 self.compiler.ToConfig(AMBuild, 'compiler')
143 AMBuild.cache.CacheVariable('vendor', self.vendor)
145 AMBuild.cache.CacheVariable('targetMap', self.targetMap)
147 self.compiler.FromConfig(AMBuild, 'compiler')
148 self.targetMap = AMBuild.cache['targetMap']
150 def DefaultCompiler(self):
151 return self.compiler.Clone()
153 def JobMatters(self, jobname):
154 file = sys._getframe().f_code.co_filename
155 if AMBuild.mode == 'config':
156 self.targetMap[jobname] = file
158 if len(AMBuild.args) == 0:
160 if not jobname in AMBuild.args:
169 ['src', 'AMBuild.library'],
170 ['src', 'AMBuild.shell']
173 for parts in FileList:
174 AMBuild.Include(os.path.join(*parts), globals)