summaryrefslogtreecommitdiff
path: root/cook.py
diff options
context:
space:
mode:
Diffstat (limited to 'cook.py')
-rwxr-xr-xcook.py141
1 files changed, 87 insertions, 54 deletions
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()