diff options
| author | Alejandro Sior <aho@sior.be> | 2022-08-06 12:02:12 +0200 |
|---|---|---|
| committer | Alejandro Sior <aho@sior.be> | 2022-08-06 12:02:12 +0200 |
| commit | 9ed173f524d657559ef27dde0a28eae72c3364bd (patch) | |
| tree | c1ee760f37f816c072dfd6d88c419085858e4203 | |
| parent | 09d7a6f5793971df4e731c601bd2550bf0a80b3d (diff) | |
cook: better toolchain system
| -rw-r--r-- | .build | 5 | ||||
| -rwxr-xr-x | cook.py | 141 | ||||
| -rw-r--r-- | test/.build | 3 | ||||
| -rw-r--r-- | test/main.c | 1 |
4 files changed, 90 insertions, 60 deletions
@@ -1,6 +1 @@ -global cc -cc = System.c_compiler() -global ld -ld = System.c_linker() - subdir("test")
\ No newline at end of file @@ -1,5 +1,6 @@ #!/usr/bin/python +from logging import error import os from pathlib import Path from threading import local @@ -23,49 +24,6 @@ BUILD = Path("bld").resolve().relative_to(ROOT) DEFMKDESC = lambda o, i, cmd: "%s" % (cmd) DEFMKOUT = lambda i: "%s" % (i) -#self, name, exe, mkargs, mkout, mkinc, desc=DEFDESC - -C_COMPILERS = { - 'gcc': lambda: CC( - "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: "%s.o" % (i), - mkinc=lambda i: "-I" + i, - mkdep=lambda o: "%s.d" % (o), - depstyle="gcc", - mkdesc=lambda o, i, cmd: "CC %s" % (o), - ), - 'clang': lambda: CC( - "clang", - find_program("clang"), - lambda o, i, ea: "-MD -MF %s.d -o %s -c %s %s" % (o, i, ea), - mkargs=lambda o, i, ea: "-MD -MF %s.d -o %s -c %s %s" % (o, o, i, ea), - mkout=lambda i: i.name + ".o", - mkinc=lambda i: "-I" + i, - mkdep=lambda o: "%s.d" % (o), - depstyle="gcc", - mkdesc=lambda o, i, cmd: "CC %s" % (o), - ) -} - -C_LINKERS = { - 'gcc': lambda: CExe( - "ld-gcc", - find_program("gcc"), - mkargs=lambda o, i, ea: "-o %s %s %s" % (o, i, ea), - mklib=lambda l: "-l" + l, - mkdesc=lambda o, i, cmd: "LD %s" % (o) - ), - 'clang': lambda: CExe( - "ld-clang", - find_program("clang"), - mkargs=lambda o, i, ea: "-o %s %s %s" % (o, i, ea), - mklib=lambda l: "-l" + l, - mkdesc=lambda o, i, cmd: "LD %s" % (o) - ) -} - def wrap_lambda(s): if callable(s): return s @@ -277,8 +235,8 @@ class CC(Vec): return out class CExe(Processor): - def __init__(self, name, exe, mkargs, mklib, mkdesc=DEFMKDESC): - super().__init__(name, exe, mkargs, mkdesc = mkdesc) + def __init__(self, name, exe, mkargs, mklib, mkout = DEFMKOUT, mkdesc=DEFMKDESC): + super().__init__(name, exe, mkargs, mkout = mkout, mkdesc = mkdesc) self.mklib = mklib @@ -296,6 +254,90 @@ class CExe(Processor): return super().gen(name, *args, extra_args = extra_args) +def CCStyleToolchain(name, ccname, arname, suffix="", c_args=[], ld_args=[]): + ccname = name + suffix + exename = name + "exe" + suffix + libname = name + "lib" + suffix + shlibname = name + "shlib" + suffix + + c_args = " ".join(flatten(c_args)) + ld_args = " ".join(flatten(ld_args)) + + gcc = find_program(ccname) + ar = find_program(arname) + + cc = CC( + name=ccname, + exe=gcc, + mkargs=lambda o, i, ea: "-MD -MF %s.d -o %s -c %s %s %s" % (o, o, i, c_args, ea), + mkout=lambda i: "%s.o" % (i), + mkinc=lambda inc: "-I%s" % (inc), + mkdep=lambda i: "%s.d" % (i), + depstyle="gcc", + mkdesc=lambda o, i, cmd: "CC %s" % (o), + ) + exe = CExe( + name=exename, + exe=gcc, + mkargs=lambda o, i, ea: "-o %s %s %s %s" % (o, i, ld_args, ea), + mklib=lambda l: "-l" + l, + mkdesc=lambda o, i, cmd: "LD %s" % (o) + ) + lib = CExe( + name=libname, + exe=ar, + mkargs=lambda o, i, ea: "-rcs %s %s %s" % (o, i, ea), + mklib=lambda l: "", # TODO: this should not be needed + mkdesc=lambda o, i, cmd: "AR %s" % (o), + mkout=lambda n: "lib%s.a" % (n) + ) + shlib = CExe( + name=shlibname, + exe=gcc, + mkargs=lambda o, i, ea: "-o %s %s %s -fPIC --shared %s" % (o, i, ld_args, ea), + mklib=lambda l: "-l" + l, + mkdesc=lambda o, i, cmd: "SO %s" % (o), + mkout=lambda n: "lib%s.so" % (n) + ) + return cc, exe, lib, shlib + +def GccToolchain(suffix="", c_args=[], ld_args=[]): + return CCStyleToolchain("gcc", "gcc", "gcc-ar", suffix, c_args, ld_args) + +def ClangToolchain(suffix="", c_args=[], ld_args=[]): + return CCStyleToolchain("clang", "clang", "llvm-ar", suffix, c_args, ld_args) + +def CCToolchain(suffix="", c_args=[], ld_args=[]): + return CCStyleToolchain("cc", "cc", "ar", suffix, c_args, ld_args) + +CTOOLCHAINS = { + 'cc': CCToolchain, + 'clang': ClangToolchain, + 'gcc': GccToolchain +} + + +def CToolchain(name="system", suffix="", c_args=[], ld_args=[]): + if name != "system": + if not name in CTOOLCHAINS: + raise Exception("No such C toolchain available") + + return CTOOLCHAINS[name](suffix, c_args, ld_args) + + for t in CTOOLCHAINS.values(): + try: + return t(suffix, c_args, ld_args) + except: + pass + + raise Exception("No C toolchain found on system") + +global cc +global exe +global lib +global shlib +cc, exe, lib, shlib = CToolchain("clang") + def find_one(names): for name in names: program = find_program(name, required=False) @@ -303,15 +345,6 @@ def find_one(names): return name return None -class System: - def c_compiler(c_compilers=C_COMPILERS.keys()): - c_compiler = find_one(c_compilers) - return C_COMPILERS[c_compiler]() - - def c_linker(c_linkers=C_LINKERS.keys()): - c_linker = find_one(c_linkers) - return C_LINKERS[c_linker]() - def subdir(dir): # Save the previous location PWD = Path.cwd() diff --git a/test/.build b/test/.build index 141c003..96b8226 100644 --- a/test/.build +++ b/test/.build @@ -1,2 +1,3 @@ obj = cc("main.c") -aout = ld("vol", obj, libs=["Xm", "Xt"])
\ No newline at end of file +l = lib("vol", obj) +aout = exe("vol", l, libs=["Xm", "Xt"])
\ No newline at end of file diff --git a/test/main.c b/test/main.c index f33d282..25c49da 100644 --- a/test/main.c +++ b/test/main.c @@ -10,6 +10,7 @@ int lol() { printf("yes!\n"); + return 0; } int main(int argc, char **argv) { |
