diff options
Diffstat (limited to 'generators.py')
-rwxr-xr-x | generators.py | 96 |
1 files changed, 62 insertions, 34 deletions
diff --git a/generators.py b/generators.py index a24b5f8..d4e00cc 100755 --- a/generators.py +++ b/generators.py @@ -46,6 +46,7 @@ def do_conf_file(src, dst, variables): result.append(line) open(dst, 'w').writelines(result) + class Generator(): def __init__(self, build, interp): self.build = build @@ -53,6 +54,12 @@ class Generator(): self.interpreter = interp self.processed_targets = {} + def get_compiler_for_source(self, src): + for i in self.build.compilers: + if i.can_compile(src): + return i + raise RuntimeError('No specified compiler can handle file ' + src) + def get_target_filename(self, target): targetdir = self.get_target_dir(target) filename = os.path.join(targetdir, target.get_filename()) @@ -90,6 +97,32 @@ class Generator(): if not tname in self.processed_targets: self.generate_target(t, outfile) + def get_pch_include_args(self, compiler, target): + args = [] + pchpath = self.get_target_private_dir(target) + includearg = compiler.get_include_arg(pchpath) + for p in target.get_pch(): + if compiler.can_compile(p): + args.append('-include') + args.append(os.path.split(p)[-1]) + if len(args) > 0: + args = [includearg] + args + return args + + def generate_basic_compiler_arguments(self, target, compiler): + commands = [] + commands += compiler.get_exelist() + commands += self.build.get_global_flags(compiler) + commands += target.get_extra_args(compiler.get_language()) + commands += compiler.get_debug_flags() + commands += compiler.get_std_warn_flags() + commands += compiler.get_compile_only_flags() + if isinstance(target, interpreter.SharedLibrary): + commands += compiler.get_pic_flags() + for dep in target.get_external_deps(): + commands += dep.get_compile_flags() + return commands + class NinjaGenerator(Generator): def __init__(self, build, interp): @@ -103,7 +136,7 @@ class NinjaGenerator(Generator): outfile.write('# It is autogenerated. Do not edit by hand.\n\n') self.generate_rules(outfile) outfile.write('# Build rules for targets\n\n') - [self.generate_target(outfile, t[1]) for t in self.build.get_targets()] + [self.generate_target(t, outfile) for t in self.build.get_targets().values()] outfile.write('# Suffix\n\n') self.generate_ending(outfile) @@ -155,7 +188,33 @@ class NinjaGenerator(Generator): outfile.write('\n') outfile.write('\n') - def generate_target(self, target, outfile): + def generate_single_compile(self, target, outfile, src): + compiler = self.get_compiler_for_source(src) + commands = self.generate_basic_compiler_arguments(target, compiler) + abs_src = os.path.join(self.environment.get_source_dir(), target.get_source_subdir(), src) + abs_obj = os.path.join(self.get_target_private_dir(target), src) + abs_obj += '.' + self.environment.get_object_suffix() + for i in target.get_include_dirs(): + basedir = i.get_curdir() + for d in i.get_incdirs(): + expdir = os.path.join(basedir, d) + fulldir = os.path.join(self.environment.get_source_dir(), expdir) + barg = compiler.get_include_arg(expdir) + sarg = compiler.get_include_arg(fulldir) + commands.append(barg) + commands.append(sarg) + commands += self.get_pch_include_args(compiler, target) + commands.append(abs_src) + compiler_name = '%s_COMPILER' % compiler.get_language() + build = 'build %s: %s %s\n' % (abs_obj, compiler_name, abs_src) + flags = ' FLAGS = %s\n\n' % ' '.join([ninja_quote(t) for t in commands]) + outfile.write(build) + outfile.write(flags) + + def generate_link(self, target, outfile, outname, obj_list): + pass + + def generate_shlib_aliases(self, target, outdir, outfile): pass def generate_ending(self, outfile): @@ -328,37 +387,6 @@ echo Run compile.sh before this or bad things will happen. outfile.write('echo Running test \\"%s\\".\n' % t.get_name()) outfile.write(' '.join(shell_quote(cmds)) + ' || exit\n') - def get_compiler_for_source(self, src): - for i in self.build.compilers: - if i.can_compile(src): - return i - raise RuntimeError('No specified compiler can handle file ' + src) - - def generate_basic_compiler_arguments(self, target, compiler): - commands = [] - commands += compiler.get_exelist() - commands += self.build.get_global_flags(compiler) - commands += target.get_extra_args(compiler.get_language()) - commands += compiler.get_debug_flags() - commands += compiler.get_std_warn_flags() - commands += compiler.get_compile_only_flags() - if isinstance(target, interpreter.SharedLibrary): - commands += compiler.get_pic_flags() - for dep in target.get_external_deps(): - commands += dep.get_compile_flags() - return commands - - def get_pch_include_args(self, compiler, target): - args = [] - pchpath = self.get_target_private_dir(target) - includearg = compiler.get_include_arg(pchpath) - for p in target.get_pch(): - if compiler.can_compile(p): - args.append('-include') - args.append(os.path.split(p)[-1]) - if len(args) > 0: - args = [includearg] + args - return args def generate_single_compile(self, target, outfile, src): compiler = self.get_compiler_for_source(src) @@ -442,7 +470,7 @@ echo Run compile.sh before this or bad things will happen. quoted = shell_quote(commands) outfile.write('\necho Generating pch \\"%s\\".\n' % pch) outfile.write(' '.join(quoted) + ' || exit\n') - + def generate_shlib_aliases(self, target, outdir, outfile): basename = target.get_filename() aliases = target.get_aliaslist() |