From 533fc1eb6e1a2327ef6f1acb04cc3bd9983d97d5 Mon Sep 17 00:00:00 2001 From: Alejandro Sior Date: Fri, 12 Aug 2022 09:58:00 +0200 Subject: cook: added C++ toolchains --- cook.py | 52 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/cook.py b/cook.py index 3b8e6c8..db409ba 100755 --- a/cook.py +++ b/cook.py @@ -327,14 +327,14 @@ def CCStyleToolchain(name, gccname, arname, suffix="", c_args=[], ld_args=[]): ) return cc, exe, lib, shlib -def GccToolchain(suffix="", c_args=[], ld_args=[]): - return CCStyleToolchain("gcc", "gcc", "gcc-ar", suffix, c_args, ld_args) +def GccToolchain(*args, **kwargs): + return CCStyleToolchain("gcc", "gcc", "gcc-ar", *args, **kwargs) -def ClangToolchain(suffix="", c_args=[], ld_args=[]): - return CCStyleToolchain("clang", "clang", "llvm-ar", suffix, c_args, ld_args) +def ClangToolchain(*args, **kwargs): + return CCStyleToolchain("clang", "clang", "llvm-ar", *args, **kwargs) -def CCToolchain(suffix="", c_args=[], ld_args=[]): - return CCStyleToolchain("cc", "cc", "ar", suffix, c_args, ld_args) +def CCToolchain(*args, **kwargs): + return CCStyleToolchain("cc", "cc", "ar", *args, **kwargs) def MSVCStyleToolchain(name, gccname, arname, ldname, suffix="", c_args=[], ld_args=[]): ccname = name + suffix @@ -384,12 +384,22 @@ def MSVCStyleToolchain(name, gccname, arname, ldname, suffix="", c_args=[], ld_a ) return cc, exe, lib, shlib -def MSVCToolchain(suffix="", c_args=[], ld_args=[]): - return MSVCStyleToolchain("msvc", "cl", "lib", "link", suffix, c_args, ld_args) +def MSVCToolchain(*args, **kwargs): + return MSVCStyleToolchain("msvc", "cl", "lib", "link", *args, **kwargs) -def ClangClToolchain(suffix="", c_args=[], ld_args=[]): +def ClangClToolchain(*args, **kwargs): # This toolchain depends on lib.exe shipped by microsoft. Is there a llvm way? - return MSVCStyleToolchain("clang-cl", "clang-cl", "lib", "lld-link", suffix, c_args, ld_args) + return MSVCStyleToolchain("clang-cl", "clang-cl", "lib", "lld-link", *args, **kwargs) + +def CppToolchain(*args, **kwargs): + return CCStyleToolchain("cpp", "c++", "ar", *args, **kwargs) + +def GppToolchain(*args, **kwargs): + return CCStyleToolchain("gpp", "g++", "gcc-ar", *args, **kwargs) + +def ClangppToolchain(*args, **kwargs): + return CCStyleToolchain("clangpp", "clang++", "llvm-ar", *args, **kwargs) + CTOOLCHAINS = { 'msvc': MSVCToolchain, @@ -399,19 +409,27 @@ CTOOLCHAINS = { 'gcc': GccToolchain } +CXXTOOLCHAINS = { + 'msvc': MSVCToolchain, + 'clang-cl': ClangClToolchain, + 'c++': CppToolchain, + 'g++': GppToolchain, + 'clang++': ClangppToolchain +} + -def CToolchain(name="system", suffix="", c_args=[], ld_args=[]): +def CToolchain(name="system", suffix="", c_args=[], ld_args=[], tdb=CTOOLCHAINS): if suffix == "" and (c_args != [] or ld_args != []): error("warning: instanciating default toolchain %s with non-default arguments" % (name)) error("note: to fix this, add a suffix") if name != "system": - if not name in CTOOLCHAINS: + if not name in tdb: raise Exception("No such C toolchain available") - return CTOOLCHAINS[name](suffix, c_args, ld_args) + return tdb[name](suffix, c_args, ld_args) - for t in CTOOLCHAINS.values(): + for t in tdb.values(): try: return t(suffix, c_args, ld_args) except ProgramNotFoundException as e: @@ -421,6 +439,9 @@ def CToolchain(name="system", suffix="", c_args=[], ld_args=[]): raise Exception("No C toolchain found on system") +def CppToolchain(*args, tdb=CXXTOOLCHAINS, **kwargs): + return CToolchain(*args, tdb = tdb, **kwargs) + # NOTE: this implementation is very simple and bad but does what # i need class CModule: @@ -489,6 +510,9 @@ class CModule: return prev + def set_toolchain(self, toolchain): + self.cc, self.exe, self.lib, self.shlib = toolchain + def mklib(self): if self.objects == [] or self.lib == None: return None -- cgit v1.2.3