diff options
| -rwxr-xr-x | cook.py | 78 |
1 files changed, 41 insertions, 37 deletions
@@ -29,7 +29,7 @@ C_COMPILERS = { "gcc", exe=find_program("gcc"), mkargs=lambda o, i, ea: "-MD -MF %s.d -o %s -c %s %s" % (o, o, i, ea), - mkout=lambda i: i.name + ".o", + mkout=lambda i: "%s.o" % (i), mkinc=lambda i: "-I" + i, mkdep=lambda o: "%s.d" % (o), depstyle="gcc", @@ -121,16 +121,30 @@ class Target(File): self.processor = processor # The inputs - self.inputs = inputs + self.inputs = File.resolve(inputs) # The extra arguments taken self.extra_args = extra_args def gen_makefile(self): - return self.processor.gen_target_makefile(self) + inputs = " ".join([str(x) for x in self.inputs]) + extra_args = " ".join([x for x in self.extra_args]) + + out = "%s: %s\n" % (self.path, inputs) + out += "\t@$(%s) %s\n" % (self.processor.name, self.processor.mkargs("$@", inputs, extra_args)) + out += "\t@echo '%s'" % (self.processor.desc("$@", inputs, extra_args)) + + return out def gen_ninja(self): - return self.processor.gen_target_ninja(self) + inputs = " ".join([str(x) for x in self.inputs]) + extra_args = " ".join(self.extra_args) + + out = "build %s: %s %s" % (self.path, self.processor.name, inputs) + if self.extra_args != []: + out += "\n extra = %s" % (extra_args) + + return out class ProcessorMeta(type): def __call__(cls, name, *rest, **krest): @@ -170,30 +184,10 @@ class Processor(metaclass = ProcessorMeta): path = BUILD / Path.cwd().relative_to(ROOT) / name return Target(path, self, inputs, extra_args) - - def gen_target_makefile(self, target): - inputs = " ".join([str(x) for x in target.inputs]) - extra_args = " ".join([x for x in target.extra_args]) - - out = "%s: %s\n" % (target.path, inputs) - out += "\t@$(%s) %s\n" % (self.name, self.mkargs("$@", inputs, extra_args)) - out += "\t@echo '%s'" % (self.desc("$@", inputs, extra_args)) - - return out def gen_makefile(self): return "%s = %s" % (self.name, self.exe) - def gen_target_ninja(self, target): - inputs = " ".join([str(x) for x in target.inputs]) - - out = "build %s: %s %s" % (target.path, self.name, inputs) - if target.extra_args != []: - extra_args = " ".join([x for x in target.extra_args]) - out += "\n extra = %s" % (extra_args) - - return out - def gen_ninja(self): out = "rule %s\n" % (self.name) @@ -223,6 +217,18 @@ class Vec(Processor): return targets +class CTarget(Target): + def __init__(self, path, processor, inputs, header_depends, extra_args = []): + super().__init__(path, processor, inputs, extra_args = extra_args) + self.header_depends = File.resolve(header_depends) + + def gen_makefile(self): + out = [] + if self.header_depends != []: + out += ["-include %s\n" % hdep for hdep in self.header_depends] + out += super().gen_makefile() + return "".join(out) + class CC(Vec): def __init__(self, name, exe, mkargs, mkout, mkinc, mkdep=None, depstyle=None, desc=DEFDESC): super().__init__(name, exe, mkargs, mkout, desc=desc) @@ -234,13 +240,22 @@ class CC(Vec): return self.gen(*args, extra_args = extra_args, include_dirs = include_dirs) def gen(self, *args, extra_args = [], include_dirs = []): + inputs = File.resolve(args) + extra_args = flatten(extra_args) include_dirs = File.resolve(include_dirs) include_args = [self.mkinc(str(x)) for x in include_dirs] extra_args += include_args + + targets = [] + for input in inputs: + path = BUILD / self.mkout(input.path) + hdep = BUILD / self.mkdep(input.path) + + targets.append(CTarget(path, self, input, header_depends = hdep, extra_args = extra_args)) - return super().gen(*args, extra_args = extra_args) + return targets def gen_ninja(self): out = super().gen_ninja() @@ -252,17 +267,6 @@ class CC(Vec): raise Exception("ninja dependencies for selected depstyle is unimplemented") return out - - def gen_target_makefile(self, target): - out = super().gen_target_makefile(target) - out += "\n" - - if self.mkdep and self.depstyle == "gcc": - out += "-include %s\n" % self.mkdep(target.path) - elif self.mkdep: - raise Exception("makefile dependencies for selected depstyle is unimplemented") - - return out def find_one(names): for name in names: @@ -304,7 +308,7 @@ def gen_bld(): def gen_makefile(): out = [mach.gen_makefile() + "\n" for mach in Processor.mdb.values()] - out += ["\n" + target.gen_makefile() for target in File.fdb.values() if issubclass(type(target), Target)] + out += ["\n\n" + target.gen_makefile() for target in File.fdb.values() if issubclass(type(target), Target)] return "".join(out) |
