diff options
| author | Alejandro Sior <aho@sior.be> | 2022-08-07 11:53:38 +0200 |
|---|---|---|
| committer | Alejandro Sior <aho@sior.be> | 2022-08-07 11:53:38 +0200 |
| commit | 5a11f2675177074db05965e366196166943ed725 (patch) | |
| tree | 0c36cf32089242863b5257eaf6443b09a76e14f2 /cook.py | |
| parent | 13c7009df18a4c86086bf270d125d23ee9b849e2 (diff) | |
cook: add a basic C modules system
Diffstat (limited to 'cook.py')
| -rwxr-xr-x | cook.py | 81 |
1 files changed, 78 insertions, 3 deletions
@@ -6,6 +6,7 @@ from pathlib import Path from threading import local import shutil import argparse +from xml.etree.ElementInclude import include def error(*args): print(*args, file = sys.stderr) @@ -404,15 +405,89 @@ def CToolchain(name="system", suffix="", c_args=[], ld_args=[]): try: return t(suffix, c_args, ld_args) except ProgramNotFoundException as e: - pass + continue except Exception as e: raise e raise Exception("No C toolchain found on system") -global cc, exe, lib, shlib +# NOTE: this implementation is very simple and bad but does what +# i need +class CModule: + def __init__(self, name, cc, exe, lib, shlib, root = None): + self.name = name + self.cc = cc + self.exe = exe + self.lib = lib + self.shlib = shlib + + self.root = root + + self.exes = dict() + self.submodules = dict() + self.objects = [] + self.includes = [] + self.links = [] + self.shared_includes = [] + self.shared_links = [] + self.ld_args = [] + self.cc_args = [] + pass + + def eval(self): + subdir(self.name) + + def submodule(self, name, toolchain = None): + global mod + prev = mod + + root = self.root if self.root else self + cc = prev.cc + exe = prev.exe + lib = prev.lib + shlib = prev.shlib + if toolchain: + cc, exe, lib, shlib = toolchain + root = None + + mod = CModule(name, cc, exe, lib, shlib, root) + mod.eval() + + # Perhaps store everything the object created + prev.objects += [mod.lib(name, mod.objects)] + prev.shared_includes += mod.shared_includes + prev.shared_links += mod.shared_links + + mod, prev = prev, mod + + mod.submodules[name] = prev + + return prev + + + def src(self, *args, extra_args = [], include_dirs = []): + obj = self.cc(*args, extra_args = [extra_args, self.cc_args], include_dirs = [include_dirs, self.shared_includes]) + self.objects += obj + + def mkdep(self, include_dirs = [], libs = [], ld_args = []): + include_dirs = flatten(include_dirs) + libs = flatten(libs) + ld_args = flatten(ld_args) + + self.ld_args += ld_args + self.shared_includes += include_dirs + self.shared_links += libs + + def mkexe(self, name, extra_args = [], libs = []): + self.exes[name] = self.exe(name, self.objects, extra_args = [extra_args, self.ld_args], libs = [libs, self.shared_links]) + return self.exes[name] + cc, exe, lib, shlib = CToolchain() +global root, mod +root = CModule("root", cc, exe, lib, shlib) +mod = root + def find_one(names): for name in names: program = find_program(name, required=False) @@ -431,7 +506,7 @@ def subdir(dir): # Set helper path global CWD CWD = Path.cwd().relative_to(ROOT) - exec(open('.build').read()) + exec(open('.build').read(), globals()) # Revert the current directory; os.chdir(PWD) |
