summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xcook.py78
1 files changed, 41 insertions, 37 deletions
diff --git a/cook.py b/cook.py
index 2c10e6b..40aad8e 100755
--- a/cook.py
+++ b/cook.py
@@ -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)