summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlejandro Sior <aho@sior.be>2022-08-06 12:02:12 +0200
committerAlejandro Sior <aho@sior.be>2022-08-06 12:02:12 +0200
commit9ed173f524d657559ef27dde0a28eae72c3364bd (patch)
treec1ee760f37f816c072dfd6d88c419085858e4203
parent09d7a6f5793971df4e731c601bd2550bf0a80b3d (diff)
cook: better toolchain system
-rw-r--r--.build5
-rwxr-xr-xcook.py141
-rw-r--r--test/.build3
-rw-r--r--test/main.c1
4 files changed, 90 insertions, 60 deletions
diff --git a/.build b/.build
index 134b1c1..f7f817c 100644
--- a/.build
+++ b/.build
@@ -1,6 +1 @@
-global cc
-cc = System.c_compiler()
-global ld
-ld = System.c_linker()
-
subdir("test") \ No newline at end of file
diff --git a/cook.py b/cook.py
index aa8fdd2..c5f4688 100755
--- a/cook.py
+++ b/cook.py
@@ -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) {