summaryrefslogtreecommitdiff
path: root/cook.py
diff options
context:
space:
mode:
Diffstat (limited to 'cook.py')
-rwxr-xr-xcook.py81
1 files changed, 78 insertions, 3 deletions
diff --git a/cook.py b/cook.py
index 3c4588f..b3f4622 100755
--- a/cook.py
+++ b/cook.py
@@ -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)