diff options
Diffstat (limited to 'cook.py')
| -rwxr-xr-x | cook.py | 41 |
1 files changed, 33 insertions, 8 deletions
@@ -49,17 +49,19 @@ C_COMPILERS = { } C_LINKERS = { - 'gcc': lambda: Processor( + 'gcc': lambda: CExe( "ld-gcc", find_program("gcc"), - lambda o, i, ea: "-o %s %s %s" % (o, i, ea), - lambda o, i, cmd: "LD %s" % (o) + mkargs=lambda o, i, ea: "-o %s %s %s" % (o, i, ea), + mklib=lambda l: "-l" + l, + desc=lambda o, i, cmd: "LD %s" % (o) ), - 'clang': lambda: Processor( + 'clang': lambda: CExe( "ld-clang", find_program("clang"), - lambda o, i, ea: "-o %s %s %s" % (o, i, ea), - lambda o, i, cmd: "LD %s" % (o) + mkargs=lambda o, i, ea: "-o %s %s %s" % (o, i, ea), + mklib=lambda l: "-l" + l, + desc=lambda o, i, cmd: "LD %s" % (o) ) } @@ -224,8 +226,10 @@ class CTarget(Target): 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) @@ -250,8 +254,9 @@ class CC(Vec): targets = [] for input in inputs: - path = BUILD / self.mkout(input.path) - hdep = BUILD / self.mkdep(input.path) + out = self.mkout(input.path) + path = BUILD / out + hdep = BUILD / self.mkdep(out) targets.append(CTarget(path, self, input, header_depends = hdep, extra_args = extra_args)) @@ -268,6 +273,26 @@ class CC(Vec): return out +class CExe(Processor): + def __init__(self, name, exe, mkargs, mklib, desc=DEFDESC): + super().__init__(name, exe, mkargs, desc = desc) + + self.mklib = mklib + + def __call__(self, name, *args, libs = [], extra_args = []): + return self.gen(name, *args, libs = libs, extra_args = extra_args) + + def gen(self, name, *args, libs, extra_args = []): + extra_args = flatten(extra_args) + libs = flatten(libs) + + # Note: this is bad, perhaps take a "depends" also/instead + # XXX Handling of libraries is temporary + libs_args = [self.mklib(lib) for lib in libs] + extra_args += libs_args + + return super().gen(name, *args, extra_args = extra_args) + def find_one(names): for name in names: program = find_program(name, required=False) |
