aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xgenerators.py96
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()