diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2013-08-30 22:20:10 +0300 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2013-08-30 22:20:10 +0300 |
commit | 702d3e2d9ca55ea330101c925df12e8fc9b40387 (patch) | |
tree | e947815ae107d5cb46c54616e8bd75be562dd992 | |
parent | 6a6f0d1d84fd914ab6e20e57f6f0c1c047ef34e2 (diff) | |
download | meson-702d3e2d9ca55ea330101c925df12e8fc9b40387.zip meson-702d3e2d9ca55ea330101c925df12e8fc9b40387.tar.gz meson-702d3e2d9ca55ea330101c925df12e8fc9b40387.tar.bz2 |
Work started on supporting simultaneous native and cross builds.
-rw-r--r-- | backends.py | 25 | ||||
-rw-r--r-- | build.py | 6 | ||||
-rw-r--r-- | coredata.py | 1 | ||||
-rw-r--r-- | environment.py | 4 | ||||
-rw-r--r-- | interpreter.py | 49 | ||||
-rwxr-xr-x | run_cross_test.py | 1 |
6 files changed, 66 insertions, 20 deletions
diff --git a/backends.py b/backends.py index 3595f20..f0c7650 100644 --- a/backends.py +++ b/backends.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 diff --git a/coredata.py b/coredata.py index 58c63d0..5ff142e 100644 --- a/coredata.py +++ b/coredata.py @@ -40,6 +40,7 @@ class CoreData(): self.cross_file = None self.compilers = {} + self.cross_compilers = {} self.deps = {} self.ext_progs = {} self.ext_libs = {} diff --git a/environment.py b/environment.py index 717478d..cb8913a 100644 --- a/environment.py +++ b/environment.py @@ -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 diff --git a/interpreter.py b/interpreter.py index 01fbb81..13c035f 100644 --- a/interpreter.py +++ b/interpreter.py @@ -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): diff --git a/run_cross_test.py b/run_cross_test.py index f74be63..d1eb689 100755 --- a/run_cross_test.py +++ b/run_cross_test.py @@ -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__': |