Work started on supporting simultaneous native and cross builds.

pull/15/head
Jussi Pakkanen 12 years ago
parent 6a6f0d1d84
commit 702d3e2d9c
  1. 25
      backends.py
  2. 6
      build.py
  3. 1
      coredata.py
  4. 4
      environment.py
  5. 49
      interpreter.py
  6. 1
      run_cross_test.py

@ -541,8 +541,12 @@ class NinjaBackend(Backend):
outfile.write(syndesc)
outfile.write('\n')
def generate_compile_rule_for(self, langname, compiler, qstr, outfile):
rule = 'rule %s_COMPILER\n' % langname
def generate_compile_rule_for(self, langname, compiler, qstr, is_cross, outfile):
if is_cross:
crstr = '_CROSS'
else:
crstr = ''
rule = 'rule %s%s_COMPILER\n' % (langname, crstr)
depflags = compiler.get_dependency_gen_flags('$out', '$DEPFILE')
command = " command = %s $FLAGS %s %s %s $in\n" % \
(' '.join(compiler.get_exelist()),\
@ -560,8 +564,12 @@ class NinjaBackend(Backend):
outfile.write(description)
outfile.write('\n')
def generate_pch_rule_for(self, langname, compiler, qstr, outfile):
rule = 'rule %s_PCH\n' % langname
def generate_pch_rule_for(self, langname, compiler, qstr, is_cross, outfile):
if is_cross:
crstr = '_CROSS'
else:
crstr = ''
rule = 'rule %s%s_PCH\n' % (langname, crstr)
depflags = compiler.get_dependency_gen_flags('$out', '$DEPFILE')
if compiler.get_id() == 'msvc':
output = ''
@ -587,8 +595,13 @@ class NinjaBackend(Backend):
qstr = quote_char + "%s" + quote_char
for compiler in self.build.compilers:
langname = compiler.get_language()
self.generate_compile_rule_for(langname, compiler, qstr, outfile)
self.generate_pch_rule_for(langname, compiler, qstr, outfile)
self.generate_compile_rule_for(langname, compiler, qstr, False, outfile)
self.generate_pch_rule_for(langname, compiler, qstr, False, outfile)
if self.environment.is_cross_build():
for compiler in self.build.cross_compilers:
langname = compiler.get_language()
self.generate_compile_rule_for(langname, compiler, qstr, True, outfile)
self.generate_pch_rule_for(langname, compiler, qstr, True, outfile)
outfile.write('\n')
def generate_custom_generator_rules(self, target, outfile):

@ -22,6 +22,7 @@ class Build:
self.project = None
self.targets = {}
self.compilers = []
self.cross_compilers = []
self.global_args = {}
self.tests = []
self.headers = []
@ -35,6 +36,11 @@ class Build:
self.static_linker = self.environment.detect_static_linker(compiler)
self.compilers.append(compiler)
def add_cross_compiler(self, compiler):
#if len(self.cross_compilers) == 0:
# self.static_linker = self.environment.detect_static_linker(compiler)
self.cross_compilers.append(compiler)
def get_project(self):
return self.project

@ -40,6 +40,7 @@ class CoreData():
self.cross_file = None
self.compilers = {}
self.cross_compilers = {}
self.deps = {}
self.ext_progs = {}
self.ext_libs = {}

@ -790,9 +790,9 @@ class Environment():
def is_source(self, fname):
return is_source(fname)
def detect_c_compiler(self):
def detect_c_compiler(self, want_cross):
evar = 'CC'
if self.is_cross_build():
if self.is_cross_build() and want_cross:
compilers = [self.cross_info['c']]
ccache = []
is_cross = True

@ -410,11 +410,11 @@ class Man(InterpreterObject):
return self.sources
class BuildTarget(InterpreterObject):
def __init__(self, name, subdir, sources, kwargs):
def __init__(self, name, subdir, is_cross, sources, kwargs):
InterpreterObject.__init__(self)
self.name = name
self.subdir = subdir
self.is_cross = is_cross
self.sources = []
self.external_deps = []
self.include_dirs = []
@ -583,8 +583,8 @@ class BuildTarget(InterpreterObject):
return []
class Executable(BuildTarget):
def __init__(self, name, subdir, sources, environment, kwargs):
BuildTarget.__init__(self, name, subdir, sources, kwargs)
def __init__(self, name, subdir, is_cross, sources, environment, kwargs):
BuildTarget.__init__(self, name, subdir, is_cross, sources, kwargs)
suffix = environment.get_exe_suffix()
if suffix != '':
self.filename = self.name + '.' + suffix
@ -987,24 +987,40 @@ class Interpreter():
raise InterpreterException('Error encountered: ' + args[0])
def add_languages(self, node, args):
is_cross = self.environment.is_cross_build()
for lang in args:
if lang in self.coredata.compilers:
comp = self.coredata.compilers[lang]
cross_comp = self.coredata.cross_compilers.get(lang, None)
else:
cross_comp = None
if lang.lower() == 'c':
comp = self.environment.detect_c_compiler()
comp = self.environment.detect_c_compiler(False)
if is_cross:
cross_comp = self.environment.detect_c_compiler(True)
elif lang.lower() == 'cpp':
comp = self.environment.detect_cpp_compiler()
comp = self.environment.detect_cpp_compiler(False)
if is_cross:
cross_comp = self.environment.detect_cpp_compiler(True)
elif lang.lower() == 'objc':
comp = self.environment.detect_objc_compiler()
comp = self.environment.detect_objc_compiler(False)
if is_cross:
cross_comp = self.environment.detect_objc_compiler(True)
elif lang.lower() == 'objcpp':
comp = self.environment.detect_objcpp_compiler()
comp = self.environment.detect_objcpp_compiler(False)
if is_cross:
cross_comp = self.environment.detect_objcpp_compiler(True)
else:
raise InvalidCode('Tried to use unknown language "%s".' % lang)
comp.sanity_check(self.environment.get_scratch_dir())
self.coredata.compilers[lang] = comp
mlog.log('Using %s compiler "' % lang, mlog.bold(' '.join(comp.get_exelist())), '". (%s %s)' % (comp.id, comp.version), sep='')
if cross_comp is not None:
self.coredata.cross_compilers[lang] = cross_comp
mlog.log('Using native %s compiler "' % lang, mlog.bold(' '.join(comp.get_exelist())), '". (%s %s)' % (comp.id, comp.version), sep='')
self.build.add_compiler(comp)
if is_cross:
mlog.log('Using cross %s compiler "' % lang, mlog.bold(' '.join(cross_comp.get_exelist())), '". (%s %s)' % (cross_comp.id, cross_comp.version), sep='')
self.build.add_cross_compiler(cross_comp)
def func_find_program(self, node, args, kwargs):
self.validate_arguments(args, 1, [str])
@ -1187,6 +1203,13 @@ class Interpreter():
args = self.flatten(args)
name = args[0]
sources = args[1:]
if self.environment.is_cross_build():
if kwargs.get('native', False):
is_cross = False
else:
is_cross = True
else:
is_cross = False
if name in coredata.forbidden_target_names:
raise InvalidArguments('Target name "%s" is reserved for Meson\'s internal use. Please rename.'\
% name)
@ -1200,9 +1223,13 @@ class Interpreter():
if name in self.build.targets:
raise InvalidCode('Tried to create target "%s", but a target of that name already exists.' % name)
self.check_sources_exist(os.path.join(self.environment.source_dir, self.subdir), sources)
l = targetclass(name, self.subdir, sources, self.environment, kwargs)
l = targetclass(name, self.subdir, is_cross, sources, self.environment, kwargs)
self.build.targets[name] = l
mlog.log('Creating build target "', mlog.bold(name), '" with %d files.' % len(sources), sep='')
if self.environment.is_cross_build() and l.is_cross:
txt = ' cross build '
else:
txt = ' build '
mlog.log('Creating', txt, 'target "', mlog.bold(name), '" with %d files.' % len(sources), sep='')
return l
def check_sources_exist(self, subdir, sources):

@ -78,7 +78,6 @@ def run_tests():
except OSError:
pass
print('\nRunning cross compilation tests.\n')
commontests = commontests[:28] + commontests[30:38] + commontests[39:]
[run_test(t) for t in commontests]
if __name__ == '__main__':

Loading…
Cancel
Save