diff options
| author | Alejandro Sior <aho@sior.be> | 2022-08-07 09:10:45 +0200 |
|---|---|---|
| committer | Alejandro Sior <aho@sior.be> | 2022-08-07 09:10:45 +0200 |
| commit | 13c7009df18a4c86086bf270d125d23ee9b849e2 (patch) | |
| tree | ae560f6c2018b8d68eb90a41c7a333ba62d5c240 /cook.py | |
| parent | c8542a4424cef0aefe7400d1f276a7d9cc49083a (diff) | |
cook: added clang-cl toolchain
Diffstat (limited to 'cook.py')
| -rwxr-xr-x | cook.py | 35 |
1 files changed, 24 insertions, 11 deletions
@@ -10,10 +10,13 @@ import argparse def error(*args): print(*args, file = sys.stderr) +class ProgramNotFoundException(Exception): + pass + def find_program(prog, required=True): path = shutil.which(prog) if path == None and required: - raise Exception("Required program '%s' not found on the system" % (prog)) + raise ProgramNotFoundException(prog) return File(path) def flatten(el): @@ -223,7 +226,7 @@ class CC(Vec): header_depends = [] if self.mkdep: - hdep += BUILD / self.mkdep(out) + header_depends += [BUILD / self.mkdep(out)] targets.append(CTarget(path, self, input, header_depends = header_depends, extra_args = extra_args)) @@ -322,18 +325,18 @@ def ClangToolchain(suffix="", c_args=[], ld_args=[]): def CCToolchain(suffix="", c_args=[], ld_args=[]): return CCStyleToolchain("cc", "cc", "ar", suffix, c_args, ld_args) -def MSVCToolchain(suffix="", c_args=[], ld_args=[]): - ccname = "msvc" + suffix - exename = "msvcexe" + suffix - libname = "msvclib" + suffix - shlibname = "msvcshlib" + suffix +def MSVCStyleToolchain(name, gccname, arname, ldname, 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)) - cl = find_program("cl") - lib = find_program("lib") - link = find_program("link") + cl = find_program(gccname) + lib = find_program(arname) + link = find_program(ldname) cc = CC( name=ccname, @@ -370,8 +373,16 @@ def MSVCToolchain(suffix="", c_args=[], ld_args=[]): ) return cc, exe, lib, shlib +def MSVCToolchain(suffix="", c_args=[], ld_args=[]): + return MSVCStyleToolchain("msvc", "clp", "lib", "link", suffix, c_args, ld_args) + +def ClangClToolchain(suffix="", c_args=[], ld_args=[]): + # 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) + CTOOLCHAINS = { 'msvc': MSVCToolchain, + 'clang-cl': ClangClToolchain, 'cc': CCToolchain, 'clang': ClangToolchain, 'gcc': GccToolchain @@ -392,8 +403,10 @@ def CToolchain(name="system", suffix="", c_args=[], ld_args=[]): for t in CTOOLCHAINS.values(): try: return t(suffix, c_args, ld_args) - except: + except ProgramNotFoundException as e: pass + except Exception as e: + raise e raise Exception("No C toolchain found on system") |
