cutekit/osdk/targets.py

148 lines
4 KiB
Python
Raw Normal View History

2022-06-26 08:24:13 +00:00
import copy
import os
from . import utils
def patchToolArgs(target, tool, args):
target = copy.deepcopy(target)
target["tools"][tool]["args"] += args
return target
def prefixToolCmd(target, tool, prefix):
target = copy.deepcopy(target)
target["tools"][tool]["cmd"] = prefix + " " + target["tools"][tool]["cmd"]
return target
def enableCache(target: dict) -> dict:
target = copy.deepcopy(target)
target = prefixToolCmd(target, "cc", f"ccache")
target = prefixToolCmd(target, "cxx", f"ccache")
return target
def enableSan(target: dict) -> dict:
2022-07-21 22:32:45 +00:00
if (target["props"]["freestanding"]):
2022-07-23 22:46:58 +00:00
print("Sanitization not supported for freestanding targets")
2022-06-26 08:24:13 +00:00
return target
target = copy.deepcopy(target)
target = patchToolArgs(
target, "cc", ["-fsanitize=address", "-fsanitize=undefined"])
target = patchToolArgs(
target, "cxx", ["-fsanitize=address", "-fsanitize=undefined"])
target = patchToolArgs(
target, "ld", ["-fsanitize=address", "-fsanitize=undefined"])
return target
def enableColors(target: dict) -> dict:
target = copy.deepcopy(target)
if (target["props"]["toolchain"] == "clang"):
target = patchToolArgs(target, "cc", ["-fcolor-diagnostics"])
target = patchToolArgs(target, "cxx", ["-fcolor-diagnostics"])
elif (target["props"]["toolchain"] == "gcc"):
target = patchToolArgs(target, "cc", ["-fdiagnostics-color=alaways"])
target = patchToolArgs(target, "cxx", ["-fdiagnostics-color=alaways"])
return target
def enableOptimizer(target: dict, level: str) -> dict:
target = copy.deepcopy(target)
target = patchToolArgs(target, "cc", ["-O" + level])
target = patchToolArgs(target, "cxx", ["-O" + level])
return target
def available() -> list:
return [file.removesuffix(".json") for file in utils.tryListDir("meta/targets")
if file.endswith(".json")]
2022-07-21 22:32:45 +00:00
VARIANTS = ["debug", "devel", "release", "sanatize"]
2022-06-26 08:24:13 +00:00
def load(targetId: str, props: dict) -> dict:
2022-06-26 08:24:13 +00:00
targetName = targetId
targetVariant = "devel"
if ":" in targetName:
targetName, targetVariant = targetName.split(":")
if not targetName in available():
raise utils.CliException(f"Target '{targetName}' not available")
if not targetVariant in VARIANTS:
raise utils.CliException(f"Variant '{targetVariant}' not available")
target = utils.loadJson(f"meta/targets/{targetName}.json")
target["props"]["variant"] = targetVariant
target["props"] = {**target["props"], **props}
2022-06-26 08:24:13 +00:00
defines = []
for key in target["props"]:
macroname = key.lower().replace("-", "_")
2022-06-26 08:24:13 +00:00
prop = target["props"][key]
macrovalue = str(prop).lower().replace(" ", "_").replace("-", "_")
2022-06-26 08:24:13 +00:00
if isinstance(prop, bool):
if prop:
defines += [f"-D__osdk_{macroname}__"]
2022-06-26 08:24:13 +00:00
else:
defines += [f"-D__osdk_{macroname}_{macrovalue}__"]
2022-06-26 08:24:13 +00:00
target = patchToolArgs(target, "cc", [
"-std=gnu2x",
"-Isrc",
"-Wall",
"-Wextra",
"-Werror",
*defines
])
target = patchToolArgs(target, "cxx", [
"-std=gnu++2b",
"-Isrc",
"-Wall",
"-Wextra",
"-Werror",
"-fno-exceptions",
"-fno-rtti",
*defines
])
target["hash"] = utils.objSha256(target, ["props", "tools"])
target["key"] = utils.objKey(target["props"])
target["dir"] = f".osdk/build/{target['hash'][:8]}"
2022-06-26 08:24:13 +00:00
target["bindir"] = f"{target['dir']}/bin"
target["objdir"] = f"{target['dir']}/obj"
target["ninjafile"] = target["dir"] + "/build.ninja"
target = enableColors(target)
if targetVariant == "debug":
target = enableOptimizer(target, "g")
elif targetVariant == "devel":
target = enableOptimizer(target, "2")
elif targetVariant == "release":
target = enableOptimizer(target, "3")
2022-07-23 22:46:58 +00:00
elif targetVariant == "sanitize":
2022-06-26 08:24:13 +00:00
target = enableOptimizer(target, "g")
target = enableSan(target)
return target