From 0ec08d74601f6dee7b244c59b1855406ea22c6aa Mon Sep 17 00:00:00 2001 From: TheOddGarlic Date: Wed, 3 Aug 2022 10:11:51 +0300 Subject: [PATCH] feat: repbuild2 minimum viable product --- Cargo.lock | 78 +++++++++++-- Cargo.toml | 1 + ableos/src/rhai_shell/mod.rs | 2 +- ext2-rs/src/lib.rs | 6 +- repbuild/Cargo.toml | 9 ++ repbuild/README.md | 10 ++ repbuild/src/main.rs | 213 +++++++++++++++++++++++++++++++++++ 7 files changed, 304 insertions(+), 15 deletions(-) create mode 100644 repbuild/Cargo.toml create mode 100644 repbuild/README.md create mode 100644 repbuild/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 08bb43d8..568608fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -97,6 +97,17 @@ dependencies = [ "logos", ] +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -150,6 +161,17 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "colored" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" +dependencies = [ + "atty", + "lazy_static", + "winapi", +] + [[package]] name = "conquer-once" version = "0.3.2" @@ -249,6 +271,15 @@ dependencies = [ "ahash", ] +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + [[package]] name = "kernel" version = "0.1.2" @@ -282,7 +313,7 @@ checksum = "da83a57f3f5ba3680950aa3cbc806fc297bc0b289d42e8942ed528ace71b8145" [[package]] name = "libwasm" version = "0.1.0" -source = "git+https://git.ablecorp.us/able/libwasm.git#e50b7beb8a2087f5a9e527c3ebac31fd3ff42aff" +source = "git+https://git.ablecorp.us/able/libwasm.git#4ffcd290f8bc918ca4adf5e23ce2097968e4a8b2" [[package]] name = "linked_list_allocator" @@ -450,9 +481,9 @@ checksum = "bc5c99d529f0d30937f6f4b8a86d988047327bb88d04d2c4afc356de74722131" [[package]] name = "proc-macro2" -version = "1.0.42" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c278e965f1d8cf32d6e0e96de3d3e79712178ae67986d9cf9151f51e95aac89b" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" dependencies = [ "unicode-ident", ] @@ -483,9 +514,9 @@ version = "0.12.0" [[package]] name = "quote" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ "proc-macro2", ] @@ -511,6 +542,13 @@ version = "0.6.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" +[[package]] +name = "repbuild" +version = "0.1.0" +dependencies = [ + "colored", +] + [[package]] name = "riscv" version = "0.8.0" @@ -562,9 +600,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24c8ad4f0c00e1eb5bc7614d236a7f1300e3dbd76b68cac8e06fb00b015ad8d8" +checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" [[package]] name = "scopeguard" @@ -624,9 +662,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" dependencies = [ "proc-macro2", "quote", @@ -762,6 +800,28 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d1a10e1dedffff9cfcbdd33c289c65b87da634259a460a3f23d513649fa7a8c" +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "x86_64" version = "0.14.10" diff --git a/Cargo.toml b/Cargo.toml index fe72b0f0..2384b5d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,4 +5,5 @@ members = [ "ext2-rs", "kernel", "facepalm", + "repbuild" ] diff --git a/ableos/src/rhai_shell/mod.rs b/ableos/src/rhai_shell/mod.rs index 3d3d5928..2e1f20b9 100644 --- a/ableos/src/rhai_shell/mod.rs +++ b/ableos/src/rhai_shell/mod.rs @@ -1,4 +1,4 @@ -use crate::arch::{drivers::sysinfo::master}; +use crate::arch::drivers::sysinfo::master; use crate::systeminfo::{KERNEL_VERSION, RELEASE_TYPE}; use crate::{filesystem::FILE_SYSTEM, time::fetch_time, KERNEL_STATE}; use genfs::{Fs, OpenOptions}; diff --git a/ext2-rs/src/lib.rs b/ext2-rs/src/lib.rs index dab5858e..506163a4 100644 --- a/ext2-rs/src/lib.rs +++ b/ext2-rs/src/lib.rs @@ -1,11 +1,7 @@ //! Ext2 crate for ableOS #![deny(missing_docs)] -#![feature( - min_specialization, - step_trait, - associated_type_defaults -)] +#![feature(min_specialization, step_trait, associated_type_defaults)] #![cfg_attr(all(not(test), feature = "no_std"), no_std)] extern crate alloc; diff --git a/repbuild/Cargo.toml b/repbuild/Cargo.toml new file mode 100644 index 00000000..400f6b7c --- /dev/null +++ b/repbuild/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "repbuild" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +colored = "2.0" diff --git a/repbuild/README.md b/repbuild/README.md new file mode 100644 index 00000000..f1f62e4c --- /dev/null +++ b/repbuild/README.md @@ -0,0 +1,10 @@ +# Repbuild +Repbuild is the AbleOS build system. + +# Usage +TODO + +## Why is it named Repbuild? +The first Repbuild was originally ripped from repnop's xtask build system in +the risc-v kernel (hence the name). However Repbuild has since been rewritten +but the name has been kept. diff --git a/repbuild/src/main.rs b/repbuild/src/main.rs new file mode 100644 index 00000000..9a455324 --- /dev/null +++ b/repbuild/src/main.rs @@ -0,0 +1,213 @@ +/* + * Copyright (c) 2022, Umut İnan Erdoğan + * + * SPDX-License-Identifier: MPL-2.0 + */ + +use std::{fs, process::Command}; + +use colored::*; + +struct Options { + pub subcommand: Subcommand, + pub arguments: Vec, +} + +enum Subcommand { + Doc, + Help, + Run, + Empty, + Unknown(String), +} + +impl Subcommand { + fn from_str>(str: S) -> Subcommand { + match str.as_ref() { + "doc" => Subcommand::Doc, + "help" => Subcommand::Help, + "run" => Subcommand::Run, + "" => Subcommand::Empty, + unknown => Subcommand::Unknown(unknown.to_string()), + } + } +} + +enum MachineType { + X86_64, + RiscV64, + AArch64, + Unknown(String), +} + +fn main() { + let options = options(); + + match options.subcommand { + Subcommand::Doc => { + let machine_text = options + .arguments + .get(0) + .cloned() + .unwrap_or_else(|| String::new()); + + match machine(machine_text) { + MachineType::X86_64 => { + Command::new("cargo") + .args(["doc", "--open"]) + .current_dir(fs::canonicalize("./ableos").unwrap()) + .status() + .unwrap(); + } + MachineType::RiscV64 => { + Command::new("cargo") + .args(["doc", "--open", "--target=riscv64gc-unknown-none-elf"]) + .current_dir(fs::canonicalize("./ableos").unwrap()) + .status() + .unwrap(); + } + MachineType::AArch64 => { + Command::new("cargo") + .args(["doc", "--open", "--target=json_targets/aarch64-ableos.json"]) + .current_dir(fs::canonicalize("./ableos").unwrap()) + .status() + .unwrap(); + } + MachineType::Unknown(unknown) => { + eprintln!( + "{}: unknown machine type `{}`", + "error".red().bold(), + unknown.bold(), + ); + eprintln!("expected one of x86_64, riscv64 or aarch64"); + } + } + } + Subcommand::Help => help(), + Subcommand::Run => { + let machine_text = options.arguments.get(0).cloned().unwrap_or_default(); + let debug = options.arguments.get(1).cloned().unwrap_or_default(); + let debug = matches!(debug.as_str(), "--debug" | "--dbg" | "-d"); + + match machine(machine_text) { + MachineType::X86_64 if debug => { + Command::new("cargo") + .args(["run", "--", "-S", "-gdb", "tcp:9000"]) + .current_dir(fs::canonicalize("./ableos").unwrap()) + .status() + .unwrap(); + } + MachineType::X86_64 => { + Command::new("cargo") + .args(["run", "--release"]) + .current_dir(fs::canonicalize("./ableos").unwrap()) + .status() + .unwrap(); + } + MachineType::RiscV64 if debug => { + eprintln!( + "{}: debug is not implemented for riscv64", + "error".red().bold() + ); + } + MachineType::RiscV64 => { + Command::new("cargo") + .args(["build", "--release", "--target=riscv64gc-unknown-none-elf"]) + .current_dir(fs::canonicalize("./ableos").unwrap()) + .status() + .unwrap(); + + Command::new("qemu-system-riscv64") + .args(["-machine", "virt"]) + .args(["-cpu", "rv64"]) + .args(["-smp", "8"]) + .args(["-m", "128M"]) + .arg("-bios") + .arg("src/arch/riscv/firmwear/opensbi-riscv64-generic-fw_jump.bin") + .arg("-kernel") + .arg("target/riscv64gc-unknown-none-elf/release/ableos") + .current_dir(fs::canonicalize("./ableos").unwrap()) + .status() + .unwrap(); + } + MachineType::AArch64 if debug => { + eprintln!( + "{}: debug is not implemented for aarch64", + "error".red().bold() + ); + } + MachineType::AArch64 => { + Command::new("cargo") + .args([ + "build", + "--release", + "--target=json_targets/aarch64-ableos.json", + ]) + .current_dir(fs::canonicalize("./ableos").unwrap()) + .status() + .unwrap(); + + Command::new("qemu-system-aarch64") + .args(["-machine", "virt"]) + .args(["-m", "1024M"]) + .args(["-cpu", "cortex-a53"]) + .args(["-kernel", "target/aarch64-ableos/release/ableos"]) + .args(["-device", "virtio-keyboard"]) + .current_dir(fs::canonicalize("./ableos").unwrap()) + .status() + .unwrap(); + } + MachineType::Unknown(unknown) => { + eprintln!( + "{}: unknown machine type `{}`", + "error".red().bold(), + unknown.bold(), + ); + eprintln!("expected one of x86_64, riscv64 or aarch64"); + } + } + } + Subcommand::Empty => { + eprintln!("{}: no subcommand passed", "error".red().bold()); + help(); + } + Subcommand::Unknown(unknown) => { + eprintln!( + "{}: unknown subcommand `{}`", + "error".red().bold(), + unknown.bold() + ); + help(); + } + } +} + +fn options() -> Options { + let subcommand = std::env::args().nth(1).unwrap_or_default(); + let arguments = std::env::args().skip(2).collect(); + + Options { + subcommand: Subcommand::from_str(subcommand), + arguments, + } +} + +fn machine>(text: S) -> MachineType { + match text.as_ref() { + "x86" | "x86_64" => MachineType::X86_64, + "riscv" | "riscv64" => MachineType::RiscV64, + "arm" | "arm64" | "aarch64" => MachineType::AArch64, + "" => { + eprintln!( + "{}: no machine type passed, defaulting to x86_64", + "warning".yellow().bold() + ); + MachineType::X86_64 + } + unknown => MachineType::Unknown(unknown.to_string()), + } +} + +fn help() { + todo!("`help`") +}