From 1837fe58266c6bfb783817053cf512ca11f3f922 Mon Sep 17 00:00:00 2001 From: Able <abl3theabove@gmail.com> Date: Tue, 18 Feb 2025 00:58:35 -0600 Subject: [PATCH] rlbuild: Init commit --- .gitignore | 1 + Cargo.lock | 15 +++ Cargo.toml | 2 +- rlbuild/Cargo.toml | 7 + rlbuild/src/main.rs | 255 +++++++++++++++++++++++++++++++++++++ sysdata/system.lisp | 163 +++++++++--------------- sysdata/system_config.toml | 11 +- 7 files changed, 344 insertions(+), 110 deletions(-) create mode 100644 rlbuild/Cargo.toml create mode 100644 rlbuild/src/main.rs diff --git a/.gitignore b/.gitignore index 2f7896d..73701c2 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ target/ +out/ \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 87da907..bec506e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -582,6 +582,21 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "rlbuild" +version = "0.1.0" +dependencies = [ + "rlisp_library", +] + +[[package]] +name = "rlisp_library" +version = "0.1.0" +source = "git+https://git.ablecorp.us/able/rlisp.git#e349916bb67ad74ca5f868da57c733d00d97397f" +dependencies = [ + "hashbrown", +] + [[package]] name = "rustc_version" version = "0.4.1" diff --git a/Cargo.toml b/Cargo.toml index 8559ccc..7337524 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = ["dev", "kernel", "repbuild"] +members = ["dev", "kernel", "repbuild", "rlbuild"] # [profile.release] # strip = "symbols" diff --git a/rlbuild/Cargo.toml b/rlbuild/Cargo.toml new file mode 100644 index 0000000..6de2e02 --- /dev/null +++ b/rlbuild/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "rlbuild" +version = "0.1.0" +edition = "2024" + +[dependencies] +rlisp_library = { git="https://git.ablecorp.us/able/rlisp.git"} \ No newline at end of file diff --git a/rlbuild/src/main.rs b/rlbuild/src/main.rs new file mode 100644 index 0000000..3ee5098 --- /dev/null +++ b/rlbuild/src/main.rs @@ -0,0 +1,255 @@ +#![feature(slice_take)] +#![allow(special_module_name)] + +use std::{fs::{self, File}, io::Write}; + +use rlisp_library::{ + Environ, + Expr::{self, Bool}, + RispError, default_env, parse_eval, +}; + +fn extend_environ<'a>(mut env: Environ<'a>) -> Environ<'a> { + env.data.insert( + "quit".to_string(), + Expr::Func(|_args: &[Expr]| -> Result<Expr, RispError> { + // TODO: let this function take in arguments + println!("Exiting."); + std::process::exit(0); + #[allow(unreachable_code)] + Err(RispError::Reason("Cannot exit process".to_string())) + }), + ); + + env.data.insert( + "print".to_string(), + Expr::Func(|args: &[Expr]| -> Result<Expr, RispError> { + let mut stri = String::new(); + for arg in args { + let fmted = match arg { + Expr::Str(string) => { + let string = string.clone(); + // string.pop(); + // string.remove(0); + + format!("{}", string) + } + _ => { + format!("{}", arg) + } + }; + + stri.push_str(&fmted); + if args.len() > 1 { + stri.push_str(" ") + } + } + print!("{}", stri); + + Ok(Expr::Bool(true)) + }), + ); + + env.data.insert( + "println".to_string(), + Expr::Func(|args: &[Expr]| -> Result<Expr, RispError> { + let mut stri = String::new(); + for arg in args { + let fmted = match arg { + Expr::Str(string) => { + let string = string.clone(); + // string.pop(); + // string.remove(0); + + format!("{}", string) + } + _ => { + format!("{}", arg) + } + }; + + stri.push_str(&fmted); + if args.len() > 1 { + stri.push_str(" ") + } + } + println!("{}", stri); + + Ok(Expr::Bool(true)) + }), + ); + + env.data.insert( + "use-repo".to_string(), + Expr::Func(|args: &[Expr]| -> Result<Expr, RispError> { + let repo_name = &args[0].clone(); + let repo_url = &args[1].clone(); + let use_sources = &args[2].clone(); + + let msg = match use_sources { + Bool(b) => match b { + true => "building from sources.", + false => "downloading binaries.", + }, + _ => { + panic!("AHHH"); + } + }; + + println!("repo name {} repo url {} {}", repo_name, repo_url, msg); + + Ok(Expr::Bool(true)) + }), + ); + + env.data.insert( + "pkg-install".to_string(), + Expr::Func(|args: &[Expr]| -> Result<Expr, RispError> { + let repo_name = &args[0].clone(); + let pkg_name = &args[1].clone(); + // let root_package_path = env.data.get("system-path").unwrap(); + + println!("installing package {} from repo {}", pkg_name, repo_name); + let path = format!("out/programs/{}", pkg_name); + fs::create_dir_all(path).unwrap(); + + // TODO: build the code with the hblang compiler. + // TODO: use the meta.rli to map dependencies. + + Ok(Expr::Bool(true)) + }), + ); + + env.data.insert( + "pkg-configure".to_string(), + Expr::Func(|args: &[Expr]| -> Result<Expr, RispError> { + let pkg_name = &args[0].clone(); + let repo_name = &args[1].clone(); + println!("{}", repo_name); + + println!("configuring package {}", pkg_name); + // TODO: build the code with the hblang compiler. + // TODO: use the meta.rli to map dependencies. + let path = format!("out/programs/{}/config.rl", pkg_name); + let mut file = File::create(path).unwrap(); + + let _ = file.write_all(b"()"); + + + Ok(Expr::Bool(true)) + }), + ); + + env.data.insert( + "drivers".to_string(), + Expr::Func(|args: &[Expr]| -> Result<Expr, RispError> { + let mut stri = String::new(); + for arg in args { + let fmted = match arg { + Expr::Str(string) => { + let string = string.clone(); + format!("{}", string) + } + _ => { + format!("{}", arg) + } + }; + + stri.push_str(&fmted); + if args.len() > 1 { + stri.push_str(" ") + } + } + println!("Drivers {}", stri); + + Ok(Expr::Bool(true)) + }), + ); + env.data.insert( + "services".to_string(), + Expr::Func(|args: &[Expr]| -> Result<Expr, RispError> { + let mut stri = String::new(); + for arg in args { + let fmted = match arg { + Expr::Str(string) => { + let string = string.clone(); + // string.pop(); + // string.remove(0); + + format!("{}", string) + } + _ => { + format!("{}", arg) + } + }; + + stri.push_str(&fmted); + if args.len() > 1 { + stri.push_str(" ") + } + } + println!("Services {}", stri); + + Ok(Expr::Bool(true)) + }), + ); + + env.data.insert( + "reincarnation-server".to_string(), + Expr::Func(|args: &[Expr]| -> Result<Expr, RispError> { + let reinc = &args[0].clone(); + println!("Reincarnation Server {}", reinc); + + Ok(Expr::Bool(true)) + }), + ); + + env +} + +fn main() { + let env = &mut default_env(); + let env = &mut extend_environ(env.clone()); + + let cfg = include_str!("../../sysdata/system.lisp"); + + let mut complete_exprs: Vec<String> = vec![]; + let mut left_parens = 0; + let mut idx_of_first_left_paran = 0; + + for (i, character) in cfg.chars().enumerate() { + if character == '(' { + if left_parens == 0 { + idx_of_first_left_paran = i; + } + left_parens += 1 + } + + if character == ')' { + left_parens -= 1; + if left_parens == 0 { + let idx_of_last_right_paran = i + 1; + + complete_exprs + .push(cfg[idx_of_first_left_paran..idx_of_last_right_paran].to_string()); + } + } + } + + if left_parens != 0 { + panic!("unmatched parens. Good luck finding them!"); + } + + // TODO: Mount the disk image here. + + for expr in complete_exprs { + match parse_eval(expr, env) { + Ok(_res) => {} + Err(e) => { + panic!("{:?}", e) + } + } + } + + // TODO: unmount the disk image here. +} diff --git a/sysdata/system.lisp b/sysdata/system.lisp index 892f6cb..2f5142d 100644 --- a/sysdata/system.lisp +++ b/sysdata/system.lisp @@ -1,114 +1,67 @@ -;;;;;;;;;;; -;; Repos ;; -;;;;;;;;;;; +;; If passed into a use-repo function this will +;; download source code and build it. +(def use-sources true) +;; Set to false so that binaries are downloaded. +(def use-binaries false) -;; This is the core repo that is used for core things like networking ;; -(use-repo core "https://repo.ablecorp.us/core") -;; Add a secondary repo ;; -;; (use-repo able "https://repo.ablecorp.us/able") +(def system-path "sample") +;;;;;;;;;;;;;;;;;; +;; REPOSITORIES ;; +;;;;;;;;;;;;;;;;;; -;; Set the default pkg-install to be binary ;; -(pkg-defaults binary:true) - -;; Install compilers ;; -;; pkg-install <repo> <pkg-name> -;; pkg-name : A string or atom to search. -(pkg-install core hblang2) -;; Install the rust compiler ;; -(pkg-install core rustc) -(pkg-install core clang) - -;;;;;;;;;;;;;;; -;; Compilers ;; -;;;;;;;;;;;;;;; - -;; Set default compilers to use ;; -;; the dev tool pulls from this ;; -(compilers - hblang: 'hblang2 - rust: 'rustc - ;; Clang is not supported :thumbsup: - ;; c: 'clang -) - -;;;;;;;;;;;;;;;;; -;; Boot Loader ;; -;;;;;;;;;;;;;;;;; -(pkg-install core limine) - -(def limine_res (resolution 1024 768 24)) -(boot-loader - default-entry:1 - timeout:0 - interface_resolution: 'limine_res) - -(boot-loader-entry "ableos" - comment: "Default AbleOS boot entry." - protocol: "limine" - kernel_path: "boot:///kernel_${ARCH}" - kernel_cmdline: "" - resolution: 'limine_res) - -(boot-loader-entry "ableos-no-cluster" - comment: "Default AbleOS boot entry." - protocol: "limine" - kernel_path: "boot:///kernel_${ARCH}" - kernel_cmdline: "cluster=false" - resolution: 'limine_res) - -;;;;;;;;;;;;;;;;;;;; -;; Kernel Options ;; -;;;;;;;;;;;;;;;;;;;; - -;; A kernel package is required -(pkg-install core kernel-rust) - -;; Set the kernel to be used by ableOS ;; -;; Maybe set a default if this isn't set? ;; -;; Must be installed already ;; -(kernel 'kernel-rust) - -;;;;;;;;;;;; -;; Config ;; -;;;;;;;;;;;; - -;; Install packages ;; -(pkg-install core sunset) -(pkg-install core ps2-driver) - -;; A list of programs to run on startup ;; -(start '()) - -;; A list of programs to add to the driver supervisor ;; -(start-driver '(ps2-driver)) - -;; Set the window system to be used by ableOS ;; -;; Must be installed already ;; -;; adds the window system to the driver supervisor ;; -;; (def window-system (fn (a) (start-driver a))) -(window-system 'sunset) +(use-repo 'core "https://repo.ablecorp.us/core" use-sources) +;; another repo example. +(use-repo 'games "https://repo.ablecorp.us/games" use-binaries) +(use-repo 'personal "https://repo.ablecorp.us/able-personal" use-sources) ;;;;;;;;;;;;;;;; -;; Networking ;; +;; BOOTLOADER ;; ;;;;;;;;;;;;;;;; -(networking - ;; set the network hostname - ;; TODO Namespace this somehow ;; - (hostname "ableOS") - ;; use dhcp to find an ip ;; - (ipv4 dhcp) - (ipv6 dhcp) - ;; Set the time server ;; - (ntp "time.nist.gov") - (dns 'router-dns-steal)) +(def resolution (fn (x y fps) (println x "x" y "@" fps))) -;;;;;;;;;;;;;;;;;;;;;; -;; Cluster Software ;; -;;;;;;;;;;;;;;;;;;;;;; +(pkg-install 'core 'bootloader-limine) +(pkg-configure 'bootloader-limine + 'comment "Default" + 'kernel 'kernel-rust + 'boot-protocol "limine" + 'verbose true + 'resolution 1024 768 24 + 'timeout 10) -;; Install the cluster software ;; -(pkg-install core cluster) -;; Defaults to false ;; -(cluster enabled:false) \ No newline at end of file +;;;;;;;;;;;;; +;; DRIVERS ;; +;;;;;;;;;;;;; + +(pkg-install 'core 'ps2-driver) +(pkg-install 'core 'ata-pio) + +;;;;;;;;;;;;;; +;; SERVICES ;; +;;;;;;;;;;;;;; +(pkg-install 'core 'vfsaur) + +(pkg-install 'core 'angels-halo) + +(pkg-install 'core 'sunset) +(pkg-install 'core 'cluster) + + +;; Init System +(pkg-install 'core 'genesis) + +;; Typically drivers should not have dependencies. Thus simplifing dependency solving. +;; Services might have dependencies on drivers or other services that can be auto-started even if you don't specify them +(pkg-configure 'genesis + (reincarnation-server 'angels-halo) + (drivers 'ata-pio 'serial) + (services 'sunset 'vfsaur 'fat32)) + +;;;;;;;;;;;; +;; KERNEL ;; +;;;;;;;;;;;; +(pkg-install 'core 'kernel-rust) +;; Set the program to be launched to init the system. +(pkg-configure 'kernel-rust + 'init-system 'genesis) diff --git a/sysdata/system_config.toml b/sysdata/system_config.toml index 37b1cf7..dc58cb9 100644 --- a/sysdata/system_config.toml +++ b/sysdata/system_config.toml @@ -38,14 +38,17 @@ path = "boot:///ps2_mouse_driver.hbf" # [boot.limine.ableos.modules.ps2_driver] # path = "boot:///ps2_driver.hbf" -# [boot.limine.ableos.modules.sunset_client] -# path = "boot:///sunset_client.hbf" +[boot.limine.ableos.modules.sunset_client] +path = "boot:///sunset_client.hbf" [boot.limine.ableos.modules.adit] path = "boot:///adit.hbf" -# [boot.limine.ableos.modules.sketchpad] -# path = "boot:///sketchpad.hbf" +[boot.limine.ableos.modules.ablefetch] +path = "boot:///ablefetch.hbf" + +[boot.limine.ableos.modules.sketchpad] +path = "boot:///sketchpad.hbf" # [boot.limine.ableos.modules.angels_halo] # path = "boot:///angels_halo.hbf"