diff --git a/osdk/cmds.py b/osdk/cmds.py index 00c0a56..cb90aa7 100644 --- a/osdk/cmds.py +++ b/osdk/cmds.py @@ -1,5 +1,6 @@ from typing import Callable, cast import os +import json from osdk.args import Args from osdk.context import contextFor @@ -187,6 +188,147 @@ def installCmd(args: Args): cmds += [Cmd("i", "install", "Install all the external packages", installCmd)] +def initCmd(args: Args): + """ + | + | - project.json + | - src/ + | | - project_name/ + | | - main.c + | | - manifest.json + | - meta/ + | | - targets/ + | | | - host-*.json + | | - plugins/ + | | | - run.py + | - .gitignore + | - README.md + | + """ + + print("This utility will walk you through creating a new project.") + print("This only covers the most common items, and tries to give sensible defaults.") + print() + print("First, let's create a project.json file.") + + project_name = input("Project name: ") + description = input("Description: ") + + to_create = ["src", "meta", "meta/targets", "meta/plugins"] + + os.mkdir(project_name.lower()) + for directory in to_create: + os.mkdir(os.path.join(project_name.lower(), directory)) + + with open(os.path.join(project_name.lower(), "project.json"), "w") as f: + f.write(json.dumps({ + "$schema": "https://schemas.cute.engineering/latest/osdk.manifest.component", + "name": project_name, + "type": "project", + "description": description, + "extern": {}, + }, indent=4)) + + with open(os.path.join(project_name.lower(), ".gitignore"), "w") as f: + f.write(".osdk\n.ninja_log\n__pycache__\n") + + with open(os.path.join(project_name.lower(), "README.md"), "w") as f: + f.write(f"# {project_name}\n") + f.write("I was created using the OSDK!\n") + f.write( + "You can find more information about the OSDK in its [Repo](https://github.com/cute-engineering/osdk)." + ) + + with open(os.path.join(project_name.lower(), "src", "main.c"), "w") as f: + f.write("#include \n\n") + f.write("int main(void)\n{\n") + f.write(" printf(\"Hello, World!\\n\");\n") + f.write(" return 0;\n") + f.write("}") + + with open(os.path.join(project_name.lower(), "src", "manifest.json"), "w") as f: + f.write(json.dumps({ + "$schema": "https://schemas.cute.engineering/latest/osdk.manifest.component", + "id": project_name.lower(), + "type": "exe", + "description": description, + }, indent=4)) + + with open(os.path.join(project_name.lower(), "meta", "plugins", "run.py"), "w") as f: + f.write("from osdk import builder, shell\n") + f.write("from osdk.args import Args\n") + f.write("from osdk.cmds import Cmd, append\n\n") + f.write("def runCmd(args: Args) -> None:\n") + f.write( + f" {project_name.lower()} = builder.build(\"{project_name.lower()}\", \"host-{shell.uname().machine}\")\n" + ) + f.write(f" shell.exec(*[{project_name.lower()}])") + f.write("\n\nappend(Cmd(\"s\", \"start\", \"Run the project\", runCmd))") + + with open(os.path.join(project_name.lower(), "meta", "targets", f"host-{shell.uname().machine}.json"), "w") as f: + f.write(json.dumps({ + "$schema": "https://schemas.cute.engineering/latest/osdk.manifest.component", + "id": f"host-{shell.uname().machine}", + "type": "target", + "props": { + "arch": shell.uname().machine, + "toolchain": "clang", + "sys": [ + "@uname", + "sysname" + ], + "abi": "unknown", + "freestanding": False, + "host": True, + }, + "tools": { + "cc": { + "cmd": [ + "@latest", + "clang" + ], + "args": [] + }, + "cxx": { + "cmd": [ + "@latest", + "clang++" + ], + "args": [] + }, + "ld": { + "cmd": [ + "@latest", + "clang++" + ], + "args": [ + ] + }, + "ar": { + "cmd": [ + "@latest", + "llvm-ar" + ], + "args": [ + "rcs" + ] + }, + "as": { + "cmd": "clang", + "args": [ + "-c" + ] + } + } + }, indent=4)) + + shell.exec(*["git", "init", project_name.lower()]) + print("Done! Don't forget to add a LICENSE ;)") + + +cmds += [Cmd("I", "init", "Start a new project", initCmd)] + + def usage(): print(f"Usage: {const.ARGV0} [args...]")