cutekit/osdk/__init__.py

155 lines
3.7 KiB
Python
Raw Normal View History

2022-06-26 07:02:15 +00:00
import importlib
2022-06-25 22:22:53 +00:00
import shutil
import sys
import os
import random
2022-06-26 07:02:15 +00:00
from types import ModuleType
2022-06-25 22:22:53 +00:00
2022-06-26 06:31:43 +00:00
import osdk.build as build
import osdk.utils as utils
import osdk.environments as environments
2022-06-25 22:22:53 +00:00
CMDS = {}
def parseOptions(args: list[str]) -> dict:
result = {
'opts': {},
'args': []
}
for arg in args:
if arg.startswith("--"):
if "=" in arg:
key, value = arg[2:].split("=", 1)
result['opts'][key] = value
else:
result['opts'][arg[2:]] = True
else:
result['args'].append(arg)
return result
def runCmd(opts: dict, args: list[str]) -> None:
if len(args) == 0:
2022-06-26 06:31:43 +00:00
print(f"Usage: {args[0]} run <component>")
2022-06-25 22:22:53 +00:00
sys.exit(1)
out = build.buildOne(opts.get('env', 'host-clang'), args[0])
2022-06-26 06:31:43 +00:00
print(f"{utils.Colors.BOLD}Running: {args[0]}{utils.Colors.RESET}")
2022-06-25 22:22:53 +00:00
utils.runCmd(out, *args[1:])
def buildCmd(opts: dict, args: list[str]) -> None:
env = opts.get('env', 'host-clang')
2022-06-26 06:31:43 +00:00
2022-06-25 22:22:53 +00:00
if len(args) == 0:
build.buildAll(env)
else:
for component in args:
build.buildOne(env, component)
def cleanCmd(opts: dict, args: list[str]) -> None:
shutil.rmtree(".build", ignore_errors=True)
def nukeCmd(opts: dict, args: list[str]) -> None:
shutil.rmtree(".build", ignore_errors=True)
shutil.rmtree(".cache", ignore_errors=True)
def idCmd(opts: dict, args: list[str]) -> None:
i = hex(random.randint(0, 2**64))
print("64bit: " + i)
print("32bit: " + i[:10])
def helpCmd(opts: dict, args: list[str]) -> None:
2022-06-26 06:31:43 +00:00
print(f"Usage: osdk <command> [options...] [<args...>]")
2022-06-25 22:22:53 +00:00
print("")
print("Description:")
2022-06-26 06:31:43 +00:00
print(" Operating System Development Kit.")
2022-06-25 22:22:53 +00:00
print("")
print("Commands:")
for cmd in CMDS:
print(" " + cmd + " - " + CMDS[cmd]["desc"])
print("")
print("Enviroments:")
2022-06-26 06:31:43 +00:00
availableToolchains = environments.available()
if len(availableToolchains) == 0:
print(" No environments available")
else:
for env in environments.available():
print(" " + env)
2022-06-25 22:22:53 +00:00
print("")
print("Variants:")
for var in environments.VARIANTS:
print(" " + var)
print("")
CMDS = {
"run": {
"func": runCmd,
"desc": "Run a component on the host",
},
"build": {
"func": buildCmd,
"desc": "Build one or more components",
},
"clean": {
"func": cleanCmd,
"desc": "Clean the build directory",
},
"nuke": {
"func": nukeCmd,
"desc": "Clean the build directory and cache",
},
"help": {
"func": helpCmd,
"desc": "Show this help message",
},
}
2022-06-26 06:31:43 +00:00
2022-06-26 07:02:15 +00:00
def loadPlugin(path: str) -> ModuleType:
"""Load a plugin from a path"""
spec = importlib.util.spec_from_file_location("plugin", path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module
for files in utils.tryListDir("meta/plugins"):
if files.endswith(".py"):
plugin = loadPlugin(f"meta/plugins/{files}")
CMDS[plugin.__plugin__["name"]] = plugin.__plugin__
2022-06-26 06:31:43 +00:00
def main():
argv = sys.argv
2022-06-25 22:22:53 +00:00
try:
2022-06-26 06:31:43 +00:00
if len(argv) < 2:
2022-06-25 22:22:53 +00:00
helpCmd({}, [])
else:
2022-06-26 06:31:43 +00:00
o = parseOptions(argv[2:])
if not argv[1] in CMDS:
print(f"Unknown command: {argv[1]}")
2022-06-25 22:22:53 +00:00
print("")
2022-06-26 06:31:43 +00:00
print(f"Use '{argv[0]} help' for a list of commands")
return 1
CMDS[argv[1]]["func"](o['opts'], o['args'])
return 0
2022-06-25 22:22:53 +00:00
except utils.CliException as e:
print()
2022-06-26 06:31:43 +00:00
print(f"{utils.Colors.RED}{e.msg}{utils.Colors.RESET}")
return 1