Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(310)

Side by Side Diff: native_client_sdk/src/build_tools/generate_make.py

Issue 10824092: [NaCl SDK] Build gtest on buildbots, but don't include it in the SDK. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: changes so i can land Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 make_rules 7 import make_rules
8 import optparse 8 import optparse
9 import os 9 import os
10 import sys 10 import sys
11 11
12 from make_rules import BuildDefineList, BuildLibList, BuildToolDict 12 from make_rules import BuildDefineList, BuildLibList, BuildToolDict
13 from make_rules import GetBuildRule, BUILD_RULES 13 from make_rules import BuildIncludeList, GetBuildRule, BUILD_RULES
14 14
15 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) 15 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
16 SDK_SRC_DIR = os.path.dirname(SCRIPT_DIR) 16 SDK_SRC_DIR = os.path.dirname(SCRIPT_DIR)
17 SDK_EXAMPLE_DIR = os.path.join(SDK_SRC_DIR, 'examples') 17 SDK_EXAMPLE_DIR = os.path.join(SDK_SRC_DIR, 'examples')
18 SDK_DIR = os.path.dirname(SDK_SRC_DIR) 18 SDK_DIR = os.path.dirname(SDK_SRC_DIR)
19 SRC_DIR = os.path.dirname(SDK_DIR) 19 SRC_DIR = os.path.dirname(SDK_DIR)
20 OUT_DIR = os.path.join(SRC_DIR, 'out') 20 OUT_DIR = os.path.join(SRC_DIR, 'out')
21 PPAPI_DIR = os.path.join(SRC_DIR, 'ppapi') 21 PPAPI_DIR = os.path.join(SRC_DIR, 'ppapi')
22 22
23 # Add SDK make tools scripts to the python path. 23 # Add SDK make tools scripts to the python path.
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 For the given target, toolset and architecture, returns a rule to generate 138 For the given target, toolset and architecture, returns a rule to generate
139 the object files for the set of sources. 139 the object files for the set of sources.
140 140
141 Returns: 141 Returns:
142 Returns a tuple containin the objects and the rule. 142 Returns a tuple containin the objects and the rule.
143 """ 143 """
144 rules = '' 144 rules = ''
145 name = target['NAME'] 145 name = target['NAME']
146 object_sets = [] 146 object_sets = []
147 147
148 defines = target.get('DEFINES', []) 148 defs = BuildDefineList(tool, target.get('DEFINES', []))
149 defs = BuildDefineList(tool, defines) 149 includes = BuildIncludeList(tool, target.get('INCLUDES', []))
150 150
151 if srcs['.c']: 151 if srcs['.c']:
152 replace = BuildToolDict(tool, name, arch, 'c', DEFLIST=defs) 152 replace = BuildToolDict(tool, name, arch, 'c',
153 DEFLIST=defs, INCLUDELIST=includes)
153 compile_rule = GetBuildRule(tool, 'CC') 154 compile_rule = GetBuildRule(tool, 'CC')
154 rules += Replace(compile_rule, replace) 155 rules += Replace(compile_rule, replace)
155 object_sets.append('$(%s)' % replace['<OBJS>']) 156 object_sets.append('$(%s)' % replace['<OBJS>'])
156 157
157 if srcs['.cc']: 158 if srcs['.cc']:
158 replace = BuildToolDict(tool, name, arch, 'cc', DEFLIST=defs) 159 replace = BuildToolDict(tool, name, arch, 'cc',
160 DEFLIST=defs, INCLUDELIST=includes)
159 compile_rule = GetBuildRule(tool, 'CXX') 161 compile_rule = GetBuildRule(tool, 'CXX')
160 rules += Replace(compile_rule, replace) 162 rules += Replace(compile_rule, replace)
161 object_sets.append('$(%s)' % replace['<OBJS>']) 163 object_sets.append('$(%s)' % replace['<OBJS>'])
162 164
163 return (' '.join(object_sets), rules) 165 return (' '.join(object_sets), rules)
164 166
165 167
166 def GenerateLink(target, tool, arch, objs): 168 def GenerateLink(target, tool, arch, objs):
167 """Generate a Link target. 169 """Generate a Link target.
168 170
(...skipping 28 matching lines...) Expand all
197 tc, tc, tc) 199 tc, tc, tc)
198 main = None 200 main = None
199 for target in desc['TARGETS']: 201 for target in desc['TARGETS']:
200 name = target['NAME'] 202 name = target['NAME']
201 srcs = GetSourcesDict(target['SOURCES']) 203 srcs = GetSourcesDict(target['SOURCES'])
202 for arch in BUILD_RULES[tc]['ARCHES']: 204 for arch in BUILD_RULES[tc]['ARCHES']:
203 objs, comp_rule = GenerateCompile(target, tc, arch, srcs) 205 objs, comp_rule = GenerateCompile(target, tc, arch, srcs)
204 targs, link_rule = GenerateLink(target, tc, arch, objs) 206 targs, link_rule = GenerateLink(target, tc, arch, objs)
205 rules += comp_rule + link_rule 207 rules += comp_rule + link_rule
206 clean.append(objs) 208 clean.append(objs)
209 if target['TYPE'] == 'lib':
210 all_targets.append(targs)
207 211
208 if target['TYPE'] == 'main': 212 if target['TYPE'] == 'main':
209 main = target 213 main = target
210 elif target['TYPE'] == 'lib':
211 all_targets.append(targs)
212 214
213 if main: 215 if main:
214 targs, nmf_rule = GenerateNMF(main, tc) 216 targs, nmf_rule = GenerateNMF(main, tc)
215 rules += nmf_rule 217 rules += nmf_rule
216 all_targets.append(targs) 218 all_targets.append(targs)
217 rules += '\n.PHONY : clean\nclean:\n\t$(RM) $(DEPFILES) ' + ' '.join(clean) 219 rules += '\n.PHONY : clean\nclean:\n\t$(RM) $(DEPFILES) ' + ' '.join(clean)
218 rules += '\n\n-include $(DEPFILES)' 220 rules += '\n\n-include $(DEPFILES)'
219 return ' '.join(all_targets), rules 221 return ' '.join(all_targets), rules
220 222
221 223
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 DSC_FORMAT = { 264 DSC_FORMAT = {
263 'TOOLS' : (list, ['newlib', 'glibc', 'pnacl', 'win'], True), 265 'TOOLS' : (list, ['newlib', 'glibc', 'pnacl', 'win'], True),
264 'PREREQ' : (list, '', False), 266 'PREREQ' : (list, '', False),
265 'TARGETS' : (list, { 267 'TARGETS' : (list, {
266 'NAME': (str, '', True), 268 'NAME': (str, '', True),
267 'TYPE': (str, ['main', 'nexe', 'lib', 'so'], True), 269 'TYPE': (str, ['main', 'nexe', 'lib', 'so'], True),
268 'SOURCES': (list, '', True), 270 'SOURCES': (list, '', True),
269 'CCFLAGS': (list, '', False), 271 'CCFLAGS': (list, '', False),
270 'CXXFLAGS': (list, '', False), 272 'CXXFLAGS': (list, '', False),
271 'LDFLAGS': (list, '', False), 273 'LDFLAGS': (list, '', False),
274 'INCLUDES': (list, '', False),
272 'LIBS' : (list, '', False) 275 'LIBS' : (list, '', False)
273 }, True), 276 }, True),
274 'HEADERS': (list, { 277 'HEADERS': (list, {
275 'FILES': (list, '', True), 278 'FILES': (list, '', True),
276 'DEST': (str, '', True), 279 'DEST': (str, '', True),
277 }, False), 280 }, False),
278 'SEARCH': (list, '', False), 281 'SEARCH': (list, '', False),
279 'POST': (str, '', False), 282 'POST': (str, '', False),
280 'PRE': (str, '', False), 283 'PRE': (str, '', False),
281 'DEST': (str, ['examples', 'src'], True), 284 'DEST': (str, ['examples', 'src', 'testing'], True),
282 'NAME': (str, '', False), 285 'NAME': (str, '', False),
283 'DATA': (list, '', False), 286 'DATA': (list, '', False),
284 'TITLE': (str, '', False), 287 'TITLE': (str, '', False),
285 'DESC': (str, '', False), 288 'DESC': (str, '', False),
286 'INFO': (str, '', False), 289 'INFO': (str, '', False),
287 'EXPERIMENTAL': (bool, [True, False], False) 290 'EXPERIMENTAL': (bool, [True, False], False)
288 } 291 }
289 292
290 293
291 def ErrorMsgFunc(text): 294 def ErrorMsgFunc(text):
(...skipping 27 matching lines...) Expand all
319 key, exp_type.__name__.upper(), type(value).__name__.upper())) 322 key, exp_type.__name__.upper(), type(value).__name__.upper()))
320 failed = True 323 failed = True
321 continue 324 continue
322 325
323 # Verify the value is non-empty if required 326 # Verify the value is non-empty if required
324 if required and not value: 327 if required and not value:
325 ErrorMsg('Expected non-empty value for %s.' % key) 328 ErrorMsg('Expected non-empty value for %s.' % key)
326 failed = True 329 failed = True
327 continue 330 continue
328 331
332 # If it's a bool, the expected values are always True or False.
333 if exp_type is bool:
334 continue
335
329 # If it's a string and there are expected values, make sure it matches 336 # If it's a string and there are expected values, make sure it matches
330 if exp_type is str: 337 if exp_type is str:
331 if type(exp_value) is list and exp_value: 338 if type(exp_value) is list and exp_value:
332 if value not in exp_value: 339 if value not in exp_value:
333 ErrorMsg('Value %s not expected for %s.' % (value, key)) 340 ErrorMsg('Value %s not expected for %s.' % (value, key))
334 failed = True 341 failed = True
335 continue 342 continue
336 343
337 # if it's a list, then we need to validate the values 344 # if it's a list, then we need to validate the values
338 if exp_type is list: 345 if exp_type is list:
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 toolchains.append(platform) 552 toolchains.append(platform)
546 553
547 if not args: 554 if not args:
548 ErrorExit('Please specify one or more projects to generate Makefiles for.') 555 ErrorExit('Please specify one or more projects to generate Makefiles for.')
549 556
550 # By default support newlib and glibc 557 # By default support newlib and glibc
551 if not toolchains: 558 if not toolchains:
552 toolchains = ['newlib', 'glibc'] 559 toolchains = ['newlib', 'glibc']
553 print 'Using default toolchains: ' + ' '.join(toolchains) 560 print 'Using default toolchains: ' + ' '.join(toolchains)
554 561
555 examples = [] 562 master_projects = {}
556 libs = []
557 for filename in args: 563 for filename in args:
558 desc = LoadProject(filename, toolchains) 564 desc = LoadProject(filename, toolchains)
559 if not desc: 565 if not desc:
560 print 'Skipping %s, not in [%s].' % (filename, ', '.join(toolchains)) 566 print 'Skipping %s, not in [%s].' % (filename, ', '.join(toolchains))
561 continue 567 continue
562 568
563 if desc.get('EXPERIMENTAL', False) and not options.experimental: 569 if desc.get('EXPERIMENTAL', False) and not options.experimental:
564 print 'Skipping %s, experimental only.' % (filename,) 570 print 'Skipping %s, experimental only.' % (filename,)
565 continue 571 continue
566 572
567 srcroot = os.path.dirname(os.path.abspath(filename)) 573 srcroot = os.path.dirname(os.path.abspath(filename))
568 if not ProcessProject(srcroot, options.dstroot, desc, toolchains): 574 if not ProcessProject(srcroot, options.dstroot, desc, toolchains):
569 ErrorExit('\n*** Failed to process project: %s ***' % filename) 575 ErrorExit('\n*** Failed to process project: %s ***' % filename)
570 576
571 # if this is an example add it to the master make and update the html 577 # if this is an example update the html
572 if desc['DEST'] == 'examples': 578 if desc['DEST'] == 'examples':
573 examples.append(desc['NAME'])
574 ProcessHTML(srcroot, options.dstroot, desc, toolchains) 579 ProcessHTML(srcroot, options.dstroot, desc, toolchains)
575 580
576 # if this is a library add it to the master make 581 # Create a list of projects for each DEST. This will be used to generate a
577 if desc['DEST'] == 'src': 582 # master makefile.
578 libs.append(desc['NAME']) 583 master_projects.setdefault(desc['DEST'], []).append(desc['NAME'])
579 584
580 if options.master: 585 if options.master:
581 master_in = os.path.join(SDK_EXAMPLE_DIR, 'Makefile') 586 master_in = os.path.join(SDK_EXAMPLE_DIR, 'Makefile')
582 master_out = os.path.join(options.dstroot, 'examples', 'Makefile') 587 for dest, projects in master_projects.iteritems():
583 GenerateMasterMakefile(master_in, master_out, examples) 588 master_out = os.path.join(options.dstroot, dest, 'Makefile')
584 master_out = os.path.join(options.dstroot, 'src', 'Makefile') 589 GenerateMasterMakefile(master_in, master_out, projects)
585 GenerateMasterMakefile(master_in, master_out, libs)
586 return 0 590 return 0
587 591
588 592
589 if __name__ == '__main__': 593 if __name__ == '__main__':
590 sys.exit(main(sys.argv[1:])) 594 sys.exit(main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « native_client_sdk/src/build_tools/build_sdk.py ('k') | native_client_sdk/src/build_tools/make_rules.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698