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 buildbot_common | 6 import buildbot_common |
7 import optparse | 7 import optparse |
8 import os | 8 import os |
9 import sys | 9 import sys |
10 | 10 |
11 | 11 |
12 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) | 12 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) |
13 SDK_SRC_DIR = os.path.dirname(SCRIPT_DIR) | 13 SDK_SRC_DIR = os.path.dirname(SCRIPT_DIR) |
14 SDK_EXAMPLE_DIR = os.path.join(SDK_SRC_DIR, 'examples') | 14 SDK_EXAMPLE_DIR = os.path.join(SDK_SRC_DIR, 'examples') |
15 SDK_DIR = os.path.dirname(SDK_SRC_DIR) | 15 SDK_DIR = os.path.dirname(SDK_SRC_DIR) |
16 SRC_DIR = os.path.dirname(SDK_DIR) | 16 SRC_DIR = os.path.dirname(SDK_DIR) |
17 OUT_DIR = os.path.join(SRC_DIR, 'out') | 17 OUT_DIR = os.path.join(SRC_DIR, 'out') |
18 PPAPI_DIR = os.path.join(SRC_DIR, 'ppapi') | 18 PPAPI_DIR = os.path.join(SRC_DIR, 'ppapi') |
19 | 19 |
20 ARCHITECTURES = ['32', '64'] | 20 ARCHITECTURES = ['32', '64'] |
21 | 21 |
| 22 SRC_EXT = { |
| 23 'c': 'CC', |
| 24 'cc' : 'CXX', |
| 25 '.so' : '.so', |
| 26 '.nexe': '.nexe' |
| 27 } |
| 28 |
| 29 |
| 30 def Replace(text, replacements): |
| 31 for key in replacements: |
| 32 print 'Print replacing: %s' % key |
| 33 text = text.replace(key, replacements[key]) |
| 34 return text |
| 35 |
22 | 36 |
23 def WriteMakefile(srcpath, dstpath, replacements): | 37 def WriteMakefile(srcpath, dstpath, replacements): |
24 text = open(srcpath, 'rb').read() | 38 text = open(srcpath, 'rb').read() |
25 for key in replacements: | 39 text = Replace(text, replacements) |
26 text = text.replace(key, replacements[key]) | |
27 open(dstpath, 'wb').write(text) | 40 open(dstpath, 'wb').write(text) |
28 | 41 |
29 | 42 |
30 def GetExtType(desc): | 43 def GetExtType(desc): |
31 if desc['TYPE'] in ['main', 'nexe']: | 44 if desc['TYPE'] in ['main', 'nexe']: |
32 ext = '.nexe' | 45 ext = '.nexe' |
33 else: | 46 else: |
34 ext = '.so' | 47 ext = '.so' |
35 return ext | 48 return ext |
36 | 49 |
37 | 50 |
38 def GenPatsubst(arch, macro, ext, EXT): | 51 def GenPatsubst(arch, tool, macro, ext, EXT): |
39 return '$(patsubst %%.%s,%%_%s.o,$(%s_%s))' % (ext, arch, macro, EXT) | 52 return '$(patsubst %%.%s,%s/%%_%s.o,$(%s_%s))' % (ext, tool, arch, macro, EXT) |
40 | 53 |
41 | 54 |
42 def SetVar(varname, values): | 55 def SetVar(varname, values): |
43 if not values: | 56 if not values: |
44 return varname + ':=\n' | 57 return varname + ':=\n' |
45 | 58 |
46 line = varname + ':=' | 59 line = varname + ':=' |
47 out = '' | 60 out = '' |
48 for value in values: | 61 for value in values: |
49 if len(line) + len(value) > 78: | 62 if len(line) + len(value) > 78: |
(...skipping 13 matching lines...) Expand all Loading... |
63 # Add sources for each target | 76 # Add sources for each target |
64 for target in desc['TARGETS']: | 77 for target in desc['TARGETS']: |
65 sources.extend(target['SOURCES']) | 78 sources.extend(target['SOURCES']) |
66 | 79 |
67 # And HTML and data files | 80 # And HTML and data files |
68 sources.append(desc['NAME'] + '.html') | 81 sources.append(desc['NAME'] + '.html') |
69 sources.extend(desc.get('DATA', [])) | 82 sources.extend(desc.get('DATA', [])) |
70 return sources | 83 return sources |
71 | 84 |
72 | 85 |
| 86 def BuildToolDict(tc, proj, arch='', ext='.nexe', OBJS='', TARG='', REMAP=''): |
| 87 TC = tc.upper() |
| 88 PROJ = proj.upper() |
| 89 |
| 90 if not OBJS: |
| 91 OBJS = '%s_%s_%s_%s_O' % (TC, PROJ, arch, ext) |
| 92 |
| 93 if not TARG: |
| 94 TARG = '%s_x86_%s%s' % (proj,arch,ext) |
| 95 |
| 96 replace = { |
| 97 '<ARCH>': arch, |
| 98 '<CC>': '%s_%s' % (TC, SRC_EXT[ext]), |
| 99 '<DUMP>': '%s_DUMP' % TC, |
| 100 '<ext>' : ext, |
| 101 '<EXT>' : SRC_EXT[ext], |
| 102 '<LINK>': '%s_LINK' % TC, |
| 103 '<OBJS>' : OBJS, |
| 104 '<proj>': proj, |
| 105 '<PROJ>': PROJ, |
| 106 '<REMAP>': REMAP, |
| 107 '<TARG>': TARG, |
| 108 '<TAB>': '\t', |
| 109 '<tc>' : tc, |
| 110 '<TC>' : TC |
| 111 } |
| 112 return replace |
| 113 |
| 114 |
| 115 def GenerateNEXE(toolchain, name, ext, cc_sources, cxx_sources): |
| 116 COMPILE_RULE = """ |
| 117 <OBJS>:=$(patsubst %.<ext>, <tc>/%_<ARCH>.o,$(<PROJ>_<EXT>)) |
| 118 $(<OBJS>) : <tc>/%_<ARCH>.o : %.<ext> $(THIS_MAKE) | <tc> |
| 119 <TAB>$(<CC>) -o $@ $< -m<ARCH> $(<PROJ>_<EXT>FLAGS) -DTCNAME=\\"<tc>\\" |
| 120 """ |
| 121 LINK_RULE = """ |
| 122 <tc>/<TARG> : $(<OBJS>) |
| 123 <TAB>$(<LINK>) -o $@ $^ -m<ARCH> $(<PROJ>_LDFLAGS) |
| 124 """ |
| 125 rules = '' |
| 126 targs = [] |
| 127 for arch in ARCHITECTURES: |
| 128 object_sets = [] |
| 129 remap = '' |
| 130 if cc_sources: |
| 131 replace = BuildToolDict(toolchain, name, arch, 'c') |
| 132 rules += Replace(COMPILE_RULE, replace) |
| 133 object_sets.append(replace['<OBJS>']) |
| 134 |
| 135 if cxx_sources: |
| 136 replace = BuildToolDict(toolchain, name, arch, 'cc') |
| 137 rules += Replace(COMPILE_RULE, replace) |
| 138 object_sets.append(replace['<OBJS>']) |
| 139 |
| 140 objs = ' '.join(object_sets) |
| 141 replace = BuildToolDict(toolchain, name, arch, ext, OBJS=objs) |
| 142 rules += Replace(LINK_RULE, replace) |
| 143 if ext == '.so': |
| 144 remap = ' -n %s,%s.so' % (replace['<TARG>'], name) |
| 145 rules += '%s_NMF+=%s/%s\n' % (replace['<TC>'], toolchain, replace['<TARG>']) |
| 146 if remap: |
| 147 rules += '%s_REMAP+=%s\n' % (replace['<TC>'], remap) |
| 148 return rules |
| 149 |
| 150 |
73 def GenerateReplacements(desc): | 151 def GenerateReplacements(desc): |
| 152 NMF_RULE = """ |
| 153 <tc>/<proj>.nmf : $(<TC>_NMF) |
| 154 <TAB>$(NMF) -D $(<DUMP>) -o $@ $(<TC>_PATHS) $^ -t <tc> -s <tc> $(<TC>_REMAP) |
| 155 |
| 156 """ |
74 # Generate target settings | 157 # Generate target settings |
75 tools = desc['TOOLS'] | 158 tools = desc['TOOLS'] |
76 | 159 |
77 prerun = desc.get('PRE', '') | 160 prerun = desc.get('PRE', '') |
78 postlaunch = desc.get('POST', '') | 161 postlaunch = desc.get('POST', '') |
79 prelaunch = desc.get('LAUNCH', '') | 162 prelaunch = desc.get('LAUNCH', '') |
80 | 163 |
81 settings = SetVar('VALID_TOOLCHAINS', tools) | 164 settings = SetVar('VALID_TOOLCHAINS', tools) |
82 settings+= 'TOOLCHAIN?=%s\n\n' % tools[0] | 165 settings+= 'TOOLCHAIN?=%s\n\n' % tools[0] |
83 | 166 |
(...skipping 15 matching lines...) Expand all Loading... |
99 settings += SetVar(macro + '_CCFLAGS', flags) | 182 settings += SetVar(macro + '_CCFLAGS', flags) |
100 | 183 |
101 if cxx_sources: | 184 if cxx_sources: |
102 flags = target.get('CXXFLAGS', ['$(NACL_CXXFLAGS)']) | 185 flags = target.get('CXXFLAGS', ['$(NACL_CXXFLAGS)']) |
103 settings += SetVar(macro + '_CXX', cxx_sources) | 186 settings += SetVar(macro + '_CXX', cxx_sources) |
104 settings += SetVar(macro + '_CXXFLAGS', flags) | 187 settings += SetVar(macro + '_CXXFLAGS', flags) |
105 | 188 |
106 flags = target.get('LDFLAGS', ['$(NACL_LDFLAGS)']) | 189 flags = target.get('LDFLAGS', ['$(NACL_LDFLAGS)']) |
107 settings += SetVar(macro + '_LDFLAGS', flags) | 190 settings += SetVar(macro + '_LDFLAGS', flags) |
108 | 191 |
109 for arch in ARCHITECTURES: | 192 for tc in tools: |
110 object_sets = [] | 193 rules += '#\n# Rules for %s toolchain\n#\n%s:\n\t$(MKDIR) %s\n' % ( |
111 if cc_sources: | 194 tc, tc, tc) |
112 objs = '%s_%s_CC_O' % (macro, arch) | 195 for target in desc['TARGETS']: |
113 rules += '%s:=%s\n' % (objs, GenPatsubst(arch, macro, 'c', 'CC')) | 196 name = target['NAME'] |
114 rules += '$(%s) : %%_%s.o : %%.c $(THIS_MAKEFILE)\n' % (objs, arch) | 197 ext = GetExtType(target) |
115 rules += '\t$(NACL_CC) -o $@ $< -m%s $(%s_CCFLAGS)\n\n' % (arch, macro) | 198 sources = target['SOURCES'] |
116 object_sets.append('$(%s)' % objs) | 199 cc_sources = [fname for fname in sources if fname.endswith('.c')] |
117 if cxx_sources: | 200 cxx_sources = [fname for fname in sources if fname.endswith('.cc')] |
118 objs = '%s_%s_CXX_O' % (macro, arch) | 201 rules += GenerateNEXE(tc, name, ext, cc_sources, cxx_sources) |
119 rules += '%s:=%s\n' % (objs, GenPatsubst(arch, macro, 'cc', 'CXX')) | 202 if target['TYPE'] == 'main': |
120 rules += '$(%s) : %%_%s.o : %%.cc $(THIS_MAKEFILE)\n' % (objs, arch) | 203 nexe = name |
121 rules += '\t$(NACL_CXX) -o $@ $< -m%s $(%s_CXXFLAGS)\n\n' % (arch, | 204 targets.append('%s/%s.nmf' % (tc, name)) |
122 macro) | 205 replace = BuildToolDict(tc, nexe) |
123 object_sets.append('$(%s)' % objs) | 206 rules += Replace(NMF_RULE, replace) |
124 target_name = '%s_x86_%s%s' % (name, arch, ext) | |
125 targets.append(target_name) | |
126 rules += '%s : %s\n' % (target_name, ' '.join(object_sets)) | |
127 rules += '\t$(NACL_LINK) -o $@ $^ -m%s $(%s_LDFLAGS)\n\n' % (arch, macro) | |
128 if target['TYPE'] == 'so': | |
129 remaps += ' -n %s,%s.so' % (target_name, name) | |
130 | 207 |
131 nmf = desc['NAME'] + '.nmf' | |
132 nmfs = '%s : %s\n' % (nmf, ' '.join(targets)) | |
133 nmfs +='\t$(NMF) $(NMF_ARGS) -o $@ $(NMF_PATHS) $^%s\n' % remaps | |
134 | 208 |
135 targets = 'all : '+ ' '.join(targets + [nmf]) | 209 targets = 'all : '+ ' '.join(targets) |
136 return { | 210 return { |
137 '__PROJECT_SETTINGS__' : settings, | 211 '__PROJECT_SETTINGS__' : settings, |
138 '__PROJECT_TARGETS__' : targets, | 212 '__PROJECT_TARGETS__' : targets, |
139 '__PROJECT_RULES__' : rules, | 213 '__PROJECT_RULES__' : rules, |
140 '__PROJECT_NMFS__' : nmfs, | |
141 '__PROJECT_PRELAUNCH__' : prelaunch, | 214 '__PROJECT_PRELAUNCH__' : prelaunch, |
142 '__PROJECT_PRERUN__' : prerun, | 215 '__PROJECT_PRERUN__' : prerun, |
143 '__PROJECT_POSTLAUNCH__' : postlaunch | 216 '__PROJECT_POSTLAUNCH__' : postlaunch |
144 } | 217 } |
145 | 218 |
146 | 219 |
147 # 'KEY' : ( <TYPE>, [Accepted Values], <Required?>) | 220 # 'KEY' : ( <TYPE>, [Accepted Values], <Required?>) |
148 DSC_FORMAT = { | 221 DSC_FORMAT = { |
149 'TOOLS' : (list, ['newlib', 'glibc', 'pnacl'], True), | 222 'TOOLS' : (list, ['newlib', 'glibc', 'pnacl'], True), |
150 'TARGETS' : (list, { | 223 'TARGETS' : (list, { |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 if options.master: | 420 if options.master: |
348 master_in = os.path.join(SDK_EXAMPLE_DIR, 'Makefile') | 421 master_in = os.path.join(SDK_EXAMPLE_DIR, 'Makefile') |
349 master_out = os.path.join(options.dstroot, 'examples', 'Makefile') | 422 master_out = os.path.join(options.dstroot, 'examples', 'Makefile') |
350 GenerateExamplesMakefile(master_in, master_out, examples) | 423 GenerateExamplesMakefile(master_in, master_out, examples) |
351 | 424 |
352 return 0 | 425 return 0 |
353 | 426 |
354 | 427 |
355 if __name__ == '__main__': | 428 if __name__ == '__main__': |
356 sys.exit(main(sys.argv[1:])) | 429 sys.exit(main(sys.argv[1:])) |
OLD | NEW |