Re-add line and column information to bytecode.
1 # vim: set ts=2 sw=2 tw=99 noet ft=python:
3 # Copyright (C) 2004-2012 David Anderson
5 # This file is part of SourcePawn.
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)
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.
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/.
22 from ambuild.command import SymlinkCommand
26 self.compiler = Cpp.Compiler()
28 if AMBuild.mode == 'config':
30 self.compiler.DetectAll(AMBuild)
33 cxx = self.compiler.cxx
34 if isinstance(cxx, Cpp.CompatGCC):
35 if isinstance(cxx, Cpp.GCC):
37 elif isinstance(cxx, Cpp.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')
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))
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')
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')
67 # The compiler is too aggressive about what what should be a valid offsetof.
68 self.compiler.AddToListVar('CXXFLAGS', '-Wno-invalid-offsetof')
70 # This would otherwise forbid ((x = y) == NULL) in clang apparently.
71 if self.vendor == 'clang':
72 self.compiler.AddToListVar('CXXFLAGS', '-Wno-null-arithmetic')
74 if (self.vendor == 'gcc' and cxx.majorVersion >= 4 and cxx.minorVersion >= 7) or \
75 (self.vendor == 'clang' and cxx.majorVersion >= 3):
76 self.compiler.AddToListVar('CXXFLAGS', '-Wno-delete-non-virtual-dtor')
78 self.compiler.AddToListVar('POSTLINKFLAGS', '-lm')
79 elif isinstance(cxx, Cpp.MSVC):
81 if AMBuild.options.debug == '1':
82 self.compiler.AddToListVar('CFLAGS', '/MTd')
83 self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt')
85 self.compiler.AddToListVar('CFLAGS', '/MT')
86 self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_DEPRECATE')
87 self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_WARNINGS')
88 self.compiler.AddToListVar('CDEFINES', '_CRT_NONSTDC_NO_DEPRECATE')
89 self.compiler.AddToListVar('CXXFLAGS', '/EHsc')
90 self.compiler.AddToListVar('CXXFLAGS', '/GR-')
91 self.compiler.AddToListVar('CFLAGS', '/W3')
92 self.compiler.AddToListVar('CFLAGS', '/nologo')
93 self.compiler.AddToListVar('CFLAGS', '/Zi')
94 self.compiler.AddToListVar('CXXFLAGS', '/TP')
95 self.compiler.AddToListVar('POSTLINKFLAGS', '/DEBUG')
97 self.compiler.AddToListVar('POSTLINKFLAGS', 'kernel32.lib')
98 self.compiler.AddToListVar('POSTLINKFLAGS', 'user32.lib')
99 self.compiler.AddToListVar('POSTLINKFLAGS', 'gdi32.lib')
100 self.compiler.AddToListVar('POSTLINKFLAGS', 'winspool.lib')
101 self.compiler.AddToListVar('POSTLINKFLAGS', 'comdlg32.lib')
102 self.compiler.AddToListVar('POSTLINKFLAGS', 'advapi32.lib')
103 self.compiler.AddToListVar('POSTLINKFLAGS', 'shell32.lib')
104 self.compiler.AddToListVar('POSTLINKFLAGS', 'ole32.lib')
105 self.compiler.AddToListVar('POSTLINKFLAGS', 'oleaut32.lib')
106 self.compiler.AddToListVar('POSTLINKFLAGS', 'uuid.lib')
107 self.compiler.AddToListVar('POSTLINKFLAGS', 'odbc32.lib')
108 self.compiler.AddToListVar('POSTLINKFLAGS', 'odbccp32.lib')
111 if AMBuild.options.opt == '1':
112 self.compiler.AddToListVar('CDEFINES', 'NDEBUG')
113 if self.vendor == 'gcc' or self.vendor == 'clang':
114 self.compiler.AddToListVar('CFLAGS', '-O3')
115 elif self.vendor == 'msvc':
116 self.compiler.AddToListVar('CFLAGS', '/Ox')
117 self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:ICF')
118 self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:REF')
121 if AMBuild.options.debug == '1':
122 if self.vendor == 'gcc' or self.vendor == 'clang':
123 self.compiler.AddToListVar('CFLAGS', '-g3')
124 elif self.vendor == 'msvc':
125 self.compiler.AddToListVar('CFLAGS', '/Od')
126 self.compiler.AddToListVar('CFLAGS', '/RTC1')
129 if AMBuild.target['platform'] == 'linux':
130 self.compiler.AddToListVar('CDEFINES', '_LINUX')
131 if self.vendor == 'gcc':
132 self.compiler.AddToListVar('POSTLINKFLAGS', '-static-libgcc')
133 if self.vendor == 'clang':
134 self.compiler.AddToListVar('POSTLINKFLAGS', '-lgcc_eh')
135 elif AMBuild.target['platform'] == 'darwin':
136 self.compiler.AddToListVar('POSTLINKFLAGS', '-mmacosx-version-min=10.5')
137 if AMBuild.options.arch == 'x86':
138 self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'i386'])
139 elif AMBuild.options.arch == 'x64':
140 self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'x86_64'])
141 self.compiler.AddToListVar('POSTLINKFLAGS', '-lstdc++')
143 # For OS X dylib versioning
145 productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r')
146 productContents = productFile.read()
148 m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
150 self.version = '1.0.0'
152 major, minor, release = m.groups()
153 self.version = '{0}.{1}.{2}'.format(major, minor, release)
154 AMBuild.cache.CacheVariable('version', self.version)
157 self.compiler.ToConfig(AMBuild, 'compiler')
158 AMBuild.cache.CacheVariable('vendor', self.vendor)
160 AMBuild.cache.CacheVariable('targetMap', self.targetMap)
162 self.compiler.FromConfig(AMBuild, 'compiler')
163 self.targetMap = AMBuild.cache['targetMap']
165 def DefaultCompiler(self):
166 return self.compiler.Clone()
168 def JobMatters(self, jobname):
169 file = sys._getframe().f_code.co_filename
170 if AMBuild.mode == 'config':
171 self.targetMap[jobname] = file
173 if len(AMBuild.args) == 0:
175 if not jobname in AMBuild.args:
184 ['src', 'AMBuild.library'],
185 ['src', 'AMBuild.shell'],
189 for parts in FileList:
190 AMBuild.Include(os.path.join(*parts), globals)