OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 import os | 6 import os |
7 | 7 |
8 # pylint: disable=C0301 | 8 # pylint: disable=C0301 |
9 # This file contains lines longer than 80 | 9 # This file contains lines longer than 80 |
10 | 10 |
11 # | 11 # |
12 # Default macros for various platforms. | 12 # Default macros for various platforms. |
13 # | 13 # |
14 NEWLIB_DEFAULTS = """ | 14 NEWLIB_DEFAULTS = """ |
15 NEWLIB_CC?=$(TC_PATH)/$(OSNAME)_x86_newlib/bin/i686-nacl-gcc -c | 15 NEWLIB_CC?=$(TC_PATH)/$(OSNAME)_x86_newlib/bin/i686-nacl-gcc -c |
16 NEWLIB_CXX?=$(TC_PATH)/$(OSNAME)_x86_newlib/bin/i686-nacl-g++ -c | 16 NEWLIB_CXX?=$(TC_PATH)/$(OSNAME)_x86_newlib/bin/i686-nacl-g++ -c |
17 NEWLIB_LINK?=$(TC_PATH)/$(OSNAME)_x86_newlib/bin/i686-nacl-g++ -Wl,-as-needed | 17 NEWLIB_LINK?=$(TC_PATH)/$(OSNAME)_x86_newlib/bin/i686-nacl-g++ -Wl,-as-needed |
18 NEWLIB_LIB?=$(TC_PATH)/$(OSNAME)_x86_newlib/bin/i686-nacl-ar r | 18 NEWLIB_LIB?=$(TC_PATH)/$(OSNAME)_x86_newlib/bin/i686-nacl-ar r |
19 NEWLIB_CCFLAGS?=-MMD -pthread $(NACL_WARNINGS) -idirafter $(NACL_SDK_ROOT)/inclu
de | 19 NEWLIB_CCFLAGS?=-MMD -pthread $(NACL_WARNINGS) -idirafter $(NACL_SDK_ROOT)/inclu
de |
20 NEWLIB_LDFLAGS?=-pthread | 20 NEWLIB_LDFLAGS?=-pthread |
21 """ | 21 """ |
22 | 22 |
| 23 ARM_DEFAULTS = """ |
| 24 ARM_CC?=$(TC_PATH)/$(OSNAME)_arm_newlib/bin/arm-nacl-gcc -c |
| 25 ARM_CXX?=$(TC_PATH)/$(OSNAME)_arm_newlib/bin/arm-nacl-g++ -c |
| 26 ARM_LINK?=$(TC_PATH)/$(OSNAME)_arm_newlib/bin/arm-nacl-g++ -Wl,-as-needed |
| 27 ARM_LIB?=$(TC_PATH)/$(OSNAME)_arm_newlib/bin/arm-nacl-ar r |
| 28 ARM_CCFLAGS?=-MMD -pthread $(NACL_WARNINGS) -idirafter $(NACL_SDK_ROOT)/include |
| 29 ARM_LDFLAGS?=-pthread |
| 30 """ |
| 31 |
23 GLIBC_DEFAULTS = """ | 32 GLIBC_DEFAULTS = """ |
24 GLIBC_CC?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-gcc -c | 33 GLIBC_CC?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-gcc -c |
25 GLIBC_CXX?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-g++ -c | 34 GLIBC_CXX?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-g++ -c |
26 GLIBC_LINK?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-g++ -Wl,-as-needed | 35 GLIBC_LINK?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-g++ -Wl,-as-needed |
27 GLIBC_LIB?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-ar r | 36 GLIBC_LIB?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-ar r |
28 GLIBC_DUMP?=$(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/bin/objdump | 37 GLIBC_DUMP?=$(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/bin/objdump |
29 GLIBC_PATHS:=-L $(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/lib32 | 38 GLIBC_PATHS:=-L $(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/lib32 |
30 GLIBC_PATHS+=-L $(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/lib | 39 GLIBC_PATHS+=-L $(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/lib |
31 GLIBC_CCFLAGS?=-MMD -pthread $(NACL_WARNINGS) -idirafter $(NACL_SDK_ROOT)/includ
e | 40 GLIBC_CCFLAGS?=-MMD -pthread $(NACL_WARNINGS) -idirafter $(NACL_SDK_ROOT)/includ
e |
32 GLIBC_LDFLAGS?=-pthread | 41 GLIBC_LDFLAGS?=-pthread |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 } | 225 } |
217 NACL_X86_64 = { | 226 NACL_X86_64 = { |
218 '<arch>': '64', | 227 '<arch>': '64', |
219 '<ARCH>': 'x86_64', | 228 '<ARCH>': 'x86_64', |
220 '<MACH>': '-m64', | 229 '<MACH>': '-m64', |
221 } | 230 } |
222 NACL_PNACL = { | 231 NACL_PNACL = { |
223 '<arch>': 'pnacl', | 232 '<arch>': 'pnacl', |
224 '<MACH>': '', | 233 '<MACH>': '', |
225 } | 234 } |
| 235 NACL_ARM = { |
| 236 '<ARCH>': 'arm', |
| 237 '<MACH>': '', |
| 238 # override the default NACL toolchain |
| 239 'TOOLSET': 'ARM', |
| 240 } |
226 WIN_32 = { | 241 WIN_32 = { |
227 '<arch>': '', | 242 '<arch>': '', |
228 '<ARCH>': 'x86_32', | 243 '<ARCH>': 'x86_32', |
229 '<MACH>': '', | 244 '<MACH>': '', |
230 } | 245 } |
231 | 246 |
232 | 247 |
233 BUILD_RULES = { | 248 BUILD_RULES = { |
234 'newlib' : { | 249 'newlib' : { |
235 'ARCHES': [NACL_X86_32, NACL_X86_64], | 250 'ARCHES': [NACL_X86_32, NACL_X86_64, NACL_ARM], |
236 'DEFS': NEWLIB_DEFAULTS, | 251 'DEFS': NEWLIB_DEFAULTS + ARM_DEFAULTS, |
237 'CC' : NACL_CC_RULES, | 252 'CC' : NACL_CC_RULES, |
238 'CXX' : NACL_CC_RULES, | 253 'CXX' : NACL_CC_RULES, |
239 'NMF' : NMF_RULE, | 254 'NMF' : NMF_RULE, |
240 'MAIN': NEXE_LINK_RULES, | 255 'MAIN': NEXE_LINK_RULES, |
241 'LIB': POSIX_LIB_RULES, | 256 'LIB': POSIX_LIB_RULES, |
242 'SO' : None, | 257 'SO' : None, |
243 'TOOL': NACL_TOOL, | 258 'TOOL': NACL_TOOL, |
244 }, | 259 }, |
245 'glibc' : { | 260 'glibc' : { |
246 'ARCHES': [NACL_X86_32, NACL_X86_64], | 261 'ARCHES': [NACL_X86_32, NACL_X86_64], |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 | 305 |
291 class MakeRules(object): | 306 class MakeRules(object): |
292 """MakeRules generates Tool, Config, and Arch dependend makefile settings. | 307 """MakeRules generates Tool, Config, and Arch dependend makefile settings. |
293 | 308 |
294 The MakeRules object generates strings used in the makefile based on the | 309 The MakeRules object generates strings used in the makefile based on the |
295 current object settings such as toolchain, configuration, architecture... | 310 current object settings such as toolchain, configuration, architecture... |
296 It stores settings such as includes, defines, and lists, and converts them | 311 It stores settings such as includes, defines, and lists, and converts them |
297 to the appropriate format whenever the toolchain changes. | 312 to the appropriate format whenever the toolchain changes. |
298 """ | 313 """ |
299 | 314 |
300 def __init__(self, tc, cfg=None, arch=None): | 315 def __init__(self, tc): |
301 self.tc = tc | 316 self.tc = tc |
302 self.project = '' | 317 self.project = '' |
303 self.cfg = '' | 318 self.cfg = '' |
304 self.arch = '' | |
305 self.ptype = '' | 319 self.ptype = '' |
306 self.arch_ext = '' | 320 self.arch_ext = '' |
307 self.defines = [] | 321 self.defines = [] |
308 self.includes = [] | 322 self.includes = [] |
309 self.libraries = [] | 323 self.libraries = [] |
310 self.vars = { | 324 self.vars = { |
311 '<TAB>': '\t', | 325 '<TAB>': '\t', |
312 } | 326 } |
313 self.SetToolchain(tc) | 327 self.SetToolchain(tc) |
314 if cfg: | |
315 self.SetConfig(cfg) | |
316 if arch: | |
317 self.SetArch(arch) | |
318 | 328 |
319 def _BuildList(self, key, items): | 329 def _BuildList(self, key, items): |
320 pattern = BUILD_RULES[self.tc]['TOOL'][key] | 330 pattern = BUILD_RULES[self.tc]['TOOL'][key] |
321 if pattern and items: | 331 if pattern and items: |
322 items = [pattern % item for item in items] | 332 items = [pattern % item for item in items] |
323 return ' '.join(items) | 333 return ' '.join(items) |
324 return '' | 334 return '' |
325 | 335 |
326 def BuildDefaults(self): | 336 def BuildDefaults(self): |
327 return BUILD_RULES[self.tc]['DEFS'] | 337 return BUILD_RULES[self.tc]['DEFS'] |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
364 sub_str = '$(patsubst %%,%s/%s/%%%s.o,$(%s_OBJS))' % ( | 374 sub_str = '$(patsubst %%,%s/%s/%%%s.o,$(%s_OBJS))' % ( |
365 self.tc, self.cfg, self.arch_ext, self.project.upper()) | 375 self.tc, self.cfg, self.arch_ext, self.project.upper()) |
366 return '%s:=%s\n' % (obj_list, sub_str) | 376 return '%s:=%s\n' % (obj_list, sub_str) |
367 | 377 |
368 def GetArches(self): | 378 def GetArches(self): |
369 return BUILD_RULES[self.tc]['ARCHES'] | 379 return BUILD_RULES[self.tc]['ARCHES'] |
370 | 380 |
371 def GetObjectList(self): | 381 def GetObjectList(self): |
372 return '%s_%s_%s%s_O' % (self.project.upper(), self.tc.upper(), | 382 return '%s_%s_%s%s_O' % (self.project.upper(), self.tc.upper(), |
373 self.cfg.upper(), self.arch_ext) | 383 self.cfg.upper(), self.arch_ext) |
374 | |
375 def GetPepperPlugin(self): | 384 def GetPepperPlugin(self): |
376 plugin = self.Replace(BUILD_RULES[self.tc]['TOOL']['MAIN']) | 385 plugin = self.Replace(BUILD_RULES[self.tc]['TOOL']['MAIN']) |
377 text = 'PPAPI_<CONFIG>:=$(abspath %s)' % plugin | 386 text = 'PPAPI_<CONFIG>:=$(abspath %s)' % plugin |
378 text += ';application/x-ppapi-%s\n' % self.vars['<config>'].lower() | 387 text += ';application/x-ppapi-%s\n' % self.vars['<config>'].lower() |
379 return self.Replace(text) | 388 return self.Replace(text) |
380 | 389 |
381 | |
382 def SetArch(self, arch): | 390 def SetArch(self, arch): |
383 self.arch = arch | |
384 for key in arch: | 391 for key in arch: |
385 self.vars[key] = arch[key] | 392 self.vars[key] = arch[key] |
386 if '<ARCH>' in self.vars: | 393 if '<ARCH>' in self.vars: |
387 self.arch_ext = "_" + self.arch['<ARCH>'] | 394 self.arch_ext = "_" + arch['<ARCH>'] |
388 self.vars['<libdir>'] = "%s_%s" % (self.tc, self.vars['<ARCH>']) | 395 self.vars['<libdir>'] = "%s_%s" % (self.tc, self.vars['<ARCH>']) |
389 else: | 396 else: |
390 self.vars['<libdir>'] = self.tc | 397 self.vars['<libdir>'] = self.tc |
391 | 398 |
| 399 toolset = arch.get('TOOLSET', self.tc.upper()) |
| 400 self.SetTools(toolset) |
| 401 |
392 def SetConfig(self, config): | 402 def SetConfig(self, config): |
393 self.cfg = config | 403 self.cfg = config |
394 self.vars['<config>'] = config | 404 self.vars['<config>'] = config |
395 self.vars['<CONFIG>'] = config.upper() | 405 self.vars['<CONFIG>'] = config.upper() |
396 | 406 |
397 def SetDefines(self, defs): | 407 def SetDefines(self, defs): |
398 self.defines = defs | 408 self.defines = defs |
399 self.vars['<DEFLIST>'] = self._BuildList('DEFINE', defs) | 409 self.vars['<DEFLIST>'] = self._BuildList('DEFINE', defs) |
400 | 410 |
401 def SetIncludes(self, incs): | 411 def SetIncludes(self, incs): |
(...skipping 15 matching lines...) Expand all Loading... |
417 | 427 |
418 def SetSource(self, src): | 428 def SetSource(self, src): |
419 self.vars['<src>'] = src | 429 self.vars['<src>'] = src |
420 | 430 |
421 def SetToolchain(self, tc): | 431 def SetToolchain(self, tc): |
422 TC = tc.upper() | 432 TC = tc.upper() |
423 if tc in ('linux', 'win'): | 433 if tc in ('linux', 'win'): |
424 tcname = 'host' | 434 tcname = 'host' |
425 else: | 435 else: |
426 tcname = tc | 436 tcname = tc |
427 self.vars['<CC>'] = '%s_CC' % TC | |
428 self.vars['<CXX>'] = '%s_CXX' % TC | |
429 self.vars['<LIB>'] = '%s_LIB' % TC | |
430 self.vars['<LINK>'] = '%s_LINK' % TC | |
431 self.vars['<tc>'] = tc | 437 self.vars['<tc>'] = tc |
432 self.vars['<tcname>'] = tcname | 438 self.vars['<tcname>'] = tcname |
433 self.vars['<TC>'] = TC | 439 self.vars['<TC>'] = TC |
434 self.SetDefines(self.defines) | 440 self.SetDefines(self.defines) |
435 self.SetIncludes(self.includes) | 441 self.SetIncludes(self.includes) |
436 self.SetLibraries(self.libraries) | 442 self.SetLibraries(self.libraries) |
437 | 443 |
| 444 def SetTools(self, toolname): |
| 445 self.vars['<CC>'] = '%s_CC' % toolname |
| 446 self.vars['<CXX>'] = '%s_CXX' % toolname |
| 447 self.vars['<LIB>'] = '%s_LIB' % toolname |
| 448 self.vars['<LINK>'] = '%s_LINK' % toolname |
| 449 |
438 def SetVars(self, **kwargs): | 450 def SetVars(self, **kwargs): |
439 # Add other passed in replacements | 451 # Add other passed in replacements |
440 for key in kwargs: | 452 for key in kwargs: |
441 self.vars['<%s>' % key] = kwargs[key] | 453 self.vars['<%s>' % key] = kwargs[key] |
442 | 454 |
443 def Replace(self, text): | 455 def Replace(self, text): |
444 return Replace(text, self.vars) | 456 return Replace(text, self.vars) |
445 | 457 |
446 | 458 |
447 def Replace(text, replacements): | 459 def Replace(text, replacements): |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 replace['<ARCH>'] = arch['<ARCH>'] | 507 replace['<ARCH>'] = arch['<ARCH>'] |
496 for dll in dlls: | 508 for dll in dlls: |
497 replace['<proj>'] = dll | 509 replace['<proj>'] = dll |
498 nmf_targets.append(Replace(dll_target, replace)) | 510 nmf_targets.append(Replace(dll_target, replace)) |
499 replace['<proj>'] = main | 511 replace['<proj>'] = main |
500 nmf_targets.append(Replace(target, replace)) | 512 nmf_targets.append(Replace(target, replace)) |
501 | 513 |
502 replace['<NMF_TARGETS>'] = ' '.join(nmf_targets) | 514 replace['<NMF_TARGETS>'] = ' '.join(nmf_targets) |
503 rules = Replace(BUILD_RULES[tc]['NMF'], replace) | 515 rules = Replace(BUILD_RULES[tc]['NMF'], replace) |
504 return '\nALL_TARGETS+=%s/%s/%s.nmf' % (tc, cfg, main) + rules + '\n' | 516 return '\nALL_TARGETS+=%s/%s/%s.nmf' % (tc, cfg, main) + rules + '\n' |
OLD | NEW |