| Index: native_client_sdk/src/build_tools/generate_make.py
|
| ===================================================================
|
| --- native_client_sdk/src/build_tools/generate_make.py (revision 141601)
|
| +++ native_client_sdk/src/build_tools/generate_make.py (working copy)
|
| @@ -19,11 +19,24 @@
|
|
|
| ARCHITECTURES = ['32', '64']
|
|
|
| +SRC_EXT = {
|
| + 'c': 'CC',
|
| + 'cc' : 'CXX',
|
| + '.so' : '.so',
|
| + '.nexe': '.nexe'
|
| +}
|
|
|
| +
|
| +def Replace(text, replacements):
|
| + for key in replacements:
|
| + print 'Print replacing: %s' % key
|
| + text = text.replace(key, replacements[key])
|
| + return text
|
| +
|
| +
|
| def WriteMakefile(srcpath, dstpath, replacements):
|
| text = open(srcpath, 'rb').read()
|
| - for key in replacements:
|
| - text = text.replace(key, replacements[key])
|
| + text = Replace(text, replacements)
|
| open(dstpath, 'wb').write(text)
|
|
|
|
|
| @@ -35,8 +48,8 @@
|
| return ext
|
|
|
|
|
| -def GenPatsubst(arch, macro, ext, EXT):
|
| - return '$(patsubst %%.%s,%%_%s.o,$(%s_%s))' % (ext, arch, macro, EXT)
|
| +def GenPatsubst(arch, tool, macro, ext, EXT):
|
| + return '$(patsubst %%.%s,%s/%%_%s.o,$(%s_%s))' % (ext, tool, arch, macro, EXT)
|
|
|
|
|
| def SetVar(varname, values):
|
| @@ -70,7 +83,77 @@
|
| return sources
|
|
|
|
|
| +def BuildToolDict(tc, proj, arch='', ext='.nexe', OBJS='', TARG='', REMAP=''):
|
| + TC = tc.upper()
|
| + PROJ = proj.upper()
|
| +
|
| + if not OBJS:
|
| + OBJS = '%s_%s_%s_%s_O' % (TC, PROJ, arch, ext)
|
| +
|
| + if not TARG:
|
| + TARG = '%s_x86_%s%s' % (proj,arch,ext)
|
| +
|
| + replace = {
|
| + '<ARCH>': arch,
|
| + '<CC>': '%s_%s' % (TC, SRC_EXT[ext]),
|
| + '<DUMP>': '%s_DUMP' % TC,
|
| + '<ext>' : ext,
|
| + '<EXT>' : SRC_EXT[ext],
|
| + '<LINK>': '%s_LINK' % TC,
|
| + '<OBJS>' : OBJS,
|
| + '<proj>': proj,
|
| + '<PROJ>': PROJ,
|
| + '<REMAP>': REMAP,
|
| + '<TARG>': TARG,
|
| + '<TAB>': '\t',
|
| + '<tc>' : tc,
|
| + '<TC>' : TC
|
| + }
|
| + return replace
|
| +
|
| +
|
| +def GenerateNEXE(toolchain, name, ext, cc_sources, cxx_sources):
|
| + COMPILE_RULE = """
|
| +<OBJS>:=$(patsubst %.<ext>, <tc>/%_<ARCH>.o,$(<PROJ>_<EXT>))
|
| +$(<OBJS>) : <tc>/%_<ARCH>.o : %.<ext> $(THIS_MAKE) | <tc>
|
| +<TAB>$(<CC>) -o $@ $< -m<ARCH> $(<PROJ>_<EXT>FLAGS) -DTCNAME=\\"<tc>\\"
|
| +"""
|
| + LINK_RULE = """
|
| +<tc>/<TARG> : $(<OBJS>)
|
| +<TAB>$(<LINK>) -o $@ $^ -m<ARCH> $(<PROJ>_LDFLAGS)
|
| +"""
|
| + rules = ''
|
| + targs = []
|
| + for arch in ARCHITECTURES:
|
| + object_sets = []
|
| + remap = ''
|
| + if cc_sources:
|
| + replace = BuildToolDict(toolchain, name, arch, 'c')
|
| + rules += Replace(COMPILE_RULE, replace)
|
| + object_sets.append(replace['<OBJS>'])
|
| +
|
| + if cxx_sources:
|
| + replace = BuildToolDict(toolchain, name, arch, 'cc')
|
| + rules += Replace(COMPILE_RULE, replace)
|
| + object_sets.append(replace['<OBJS>'])
|
| +
|
| + objs = ' '.join(object_sets)
|
| + replace = BuildToolDict(toolchain, name, arch, ext, OBJS=objs)
|
| + rules += Replace(LINK_RULE, replace)
|
| + if ext == '.so':
|
| + remap = ' -n %s,%s.so' % (replace['<TARG>'], name)
|
| + rules += '%s_NMF+=%s/%s\n' % (replace['<TC>'], toolchain, replace['<TARG>'])
|
| + if remap:
|
| + rules += '%s_REMAP+=%s\n' % (replace['<TC>'], remap)
|
| + return rules
|
| +
|
| +
|
| def GenerateReplacements(desc):
|
| + NMF_RULE = """
|
| +<tc>/<proj>.nmf : $(<TC>_NMF)
|
| +<TAB>$(NMF) -D $(<DUMP>) -o $@ $(<TC>_PATHS) $^ -t <tc> -s <tc> $(<TC>_REMAP)
|
| +
|
| +"""
|
| # Generate target settings
|
| tools = desc['TOOLS']
|
|
|
| @@ -106,38 +189,28 @@
|
| flags = target.get('LDFLAGS', ['$(NACL_LDFLAGS)'])
|
| settings += SetVar(macro + '_LDFLAGS', flags)
|
|
|
| - for arch in ARCHITECTURES:
|
| - object_sets = []
|
| - if cc_sources:
|
| - objs = '%s_%s_CC_O' % (macro, arch)
|
| - rules += '%s:=%s\n' % (objs, GenPatsubst(arch, macro, 'c', 'CC'))
|
| - rules += '$(%s) : %%_%s.o : %%.c $(THIS_MAKEFILE)\n' % (objs, arch)
|
| - rules += '\t$(NACL_CC) -o $@ $< -m%s $(%s_CCFLAGS)\n\n' % (arch, macro)
|
| - object_sets.append('$(%s)' % objs)
|
| - if cxx_sources:
|
| - objs = '%s_%s_CXX_O' % (macro, arch)
|
| - rules += '%s:=%s\n' % (objs, GenPatsubst(arch, macro, 'cc', 'CXX'))
|
| - rules += '$(%s) : %%_%s.o : %%.cc $(THIS_MAKEFILE)\n' % (objs, arch)
|
| - rules += '\t$(NACL_CXX) -o $@ $< -m%s $(%s_CXXFLAGS)\n\n' % (arch,
|
| - macro)
|
| - object_sets.append('$(%s)' % objs)
|
| - target_name = '%s_x86_%s%s' % (name, arch, ext)
|
| - targets.append(target_name)
|
| - rules += '%s : %s\n' % (target_name, ' '.join(object_sets))
|
| - rules += '\t$(NACL_LINK) -o $@ $^ -m%s $(%s_LDFLAGS)\n\n' % (arch, macro)
|
| - if target['TYPE'] == 'so':
|
| - remaps += ' -n %s,%s.so' % (target_name, name)
|
| + for tc in tools:
|
| + rules += '#\n# Rules for %s toolchain\n#\n%s:\n\t$(MKDIR) %s\n' % (
|
| + tc, tc, tc)
|
| + for target in desc['TARGETS']:
|
| + name = target['NAME']
|
| + ext = GetExtType(target)
|
| + sources = target['SOURCES']
|
| + cc_sources = [fname for fname in sources if fname.endswith('.c')]
|
| + cxx_sources = [fname for fname in sources if fname.endswith('.cc')]
|
| + rules += GenerateNEXE(tc, name, ext, cc_sources, cxx_sources)
|
| + if target['TYPE'] == 'main':
|
| + nexe = name
|
| + targets.append('%s/%s.nmf' % (tc, name))
|
| + replace = BuildToolDict(tc, nexe)
|
| + rules += Replace(NMF_RULE, replace)
|
|
|
| - nmf = desc['NAME'] + '.nmf'
|
| - nmfs = '%s : %s\n' % (nmf, ' '.join(targets))
|
| - nmfs +='\t$(NMF) $(NMF_ARGS) -o $@ $(NMF_PATHS) $^%s\n' % remaps
|
|
|
| - targets = 'all : '+ ' '.join(targets + [nmf])
|
| + targets = 'all : '+ ' '.join(targets)
|
| return {
|
| '__PROJECT_SETTINGS__' : settings,
|
| '__PROJECT_TARGETS__' : targets,
|
| '__PROJECT_RULES__' : rules,
|
| - '__PROJECT_NMFS__' : nmfs,
|
| '__PROJECT_PRELAUNCH__' : prelaunch,
|
| '__PROJECT_PRERUN__' : prerun,
|
| '__PROJECT_POSTLAUNCH__' : postlaunch
|
|
|