cutekit/cutekit/rules.py

54 lines
1.3 KiB
Python

import dataclasses as dt
from typing import Optional
@dt.dataclass
class Rule:
id: str
fileIn: list[str]
fileOut: str
rule: str
args: list[str] = dt.field(default_factory=list)
deps: list[str] = dt.field(default_factory=list)
rules: dict[str, Rule] = {
"cp": Rule("cp", ["*"], "*", "$in $out"),
"cc": Rule(
"cc",
["*.c"],
"*.o",
"-c -o $out $in -MD -MF $out.d $flags $cincs $cdefs",
["-std=gnu2x", "-Wall", "-Wextra", "-Werror"],
["$out.d"],
),
"cxx": Rule(
"cxx",
["*.cpp", "*.cc", "*.cxx"],
"*.o",
"-c -o $out $in -MD -MF $out.d $flags $cincs $cdefs",
["-std=gnu++2b", "-Wall", "-Wextra", "-Werror", "-fno-exceptions", "-fno-rtti"],
["$out.d"],
),
"as": Rule("as", ["*.s", "*.asm", "*.S"], "*.o", "-o $out $in $flags"),
"ar": Rule("ar", ["*.o"], "*.a", "$flags $out $in"),
"ld": Rule("ld", ["*.o", "*.a"], "*.out", "-o $out $in $flags"),
}
def append(rule: Rule):
rules[rule.id] = rule
def byFileIn(fileIn: str) -> Optional[Rule]:
for key in rules:
rule = rules[key]
for ext in rule.fileIn:
if fileIn.endswith(ext[1:]):
return rule
return None
def byId(id: str) -> Optional[Rule]:
return rules.get(id, None)