From bf9c3f10a73996529fc4745d3de6f89426e0b606 Mon Sep 17 00:00:00 2001
From: Arthur Beck <averse.abfun@gmail.com>
Date: Thu, 13 Feb 2025 15:53:12 -0600
Subject: [PATCH] Fixed check script; added --check flag to build script; added
 argument parsing to check and build script; added documentation to
 NoneTextDisplay; renamed multiboot2 section to bootheader

---
 kernel/build                      | 69 +++++++++++++++++++----
 kernel/check                      | 92 ++++++++++++++++++++++++++++---
 kernel/link.x                     |  2 +-
 kernel/src/arch_boot_entry/x86.rs |  2 +-
 kernel/src/kernel/display.rs      |  1 +
 kernel/validate-cfg               |  3 -
 6 files changed, 144 insertions(+), 25 deletions(-)
 delete mode 100644 kernel/validate-cfg

diff --git a/kernel/build b/kernel/build
index 43974fc..02c5367 100755
--- a/kernel/build
+++ b/kernel/build
@@ -1,7 +1,50 @@
 #!/bin/bash
 
 (
-    set -e
+    set -o errexit -o pipefail -o noclobber
+
+    HAVE_GETOPT=true
+    getopt --test > /dev/null && true
+    if [[ $? -ne 4 ]]; then
+        if [[ -n "EXIT_WITHOUT_GETOPT" ]]; then
+            echo '`getopt --test` failed. Exiting.'
+            exit 1
+        else
+            echo '`getopt --test` failed. Continuing and ignoring command line flags. (note that $1 will still be used for the target)'
+            echo '(to exit instead of ignoring, set the environment variable `EXIT_WITHOUT_GETOPT` to a non-null value)'
+            HAVE_GETOPT=false
+        fi
+    fi
+
+    check=false
+
+    if [[ "$HAVE_GETOPT" = "true" ]]; then
+        LONGOPTS=check
+        OPTIONS=c
+
+        PARSED=$(getopt --options=$OPTIONS --longoptions=$LONGOPTS --name "$0" -- "$@") || (
+            echo '`getopt` failed to parse command line arguments. Check the arguments passed.'
+            exit 1
+        )
+        eval set -- "$PARSED"
+
+        while true; do
+            case "$1" in
+                -c|--check)
+                    check=true
+                    shift
+                    ;;
+                --)
+                    shift
+                    break
+                    ;;
+                *)
+                    echo "Unknown argument"
+                    exit 1
+                    ;;
+            esac
+        done
+    fi
 
     export KERNEL_DIR=$(readlink -e .)
 
@@ -38,20 +81,24 @@
         real_target=${!target}
         real_target=$(basename $real_target)
         echo "Compiling target $target(with rust target of $real_target)"
-        cargo build --target "$real_target" --release -Zbuild-std=core,alloc --bin entrypoint_$target
-        cp "target/$(echo $real_target | sed 's/\.json//')/release/entrypoint_$target" kernel-$target
+        if [[ $check = "true" ]]; then
+            cargo check --target "$real_target" --release -Zbuild-std=core,alloc --bin entrypoint_$target
+        else
+            cargo build --target "$real_target" --release -Zbuild-std=core,alloc --bin entrypoint_$target
+            cp "target/$(echo $real_target | sed 's/\.json//')/release/entrypoint_$target" kernel-$target
 
-        if [[ "$CONFIG_BUILD_GRUB" = "true" ]]; then
-            if [[ "$target" = "x86" || "$target" = "mips64" || "$target" = "mipsel" || "$target" = "mipsle" ]]; then
-                rm -rf grub aphrodite-grub-$target.iso
-                cp -r ./grub_template ./grub
+            if [[ "$CONFIG_BUILD_GRUB" = "true" ]]; then
+                if [[ "$target" = "x86" || "$target" = "mips64" || "$target" = "mipsel" || "$target" = "mipsle" ]]; then
+                    rm -rf grub aphrodite-grub-$target.iso
+                    cp -r ./grub_template ./grub
 
-                cp kernel-$target ./grub/boot/aphrodite.kernel
+                    cp kernel-$target ./grub/boot/aphrodite.kernel
 
-                sed -i "s@%{VERSION}@$VERSION@g" ./grub/boot/grub/grub.cfg
+                    sed -i "s@%{VERSION}@$VERSION@g" ./grub/boot/grub/grub.cfg
 
-                grub-mkrescue -o aphrodite-grub-$target.iso grub
-                cp aphrodite-grub-$target.iso aphrodite-$target.iso
+                    grub-mkrescue -o aphrodite-grub-$target.iso grub
+                    cp aphrodite-grub-$target.iso aphrodite-$target.iso
+                fi
             fi
         fi
     }
diff --git a/kernel/check b/kernel/check
index 2797135..9c4d6ae 100755
--- a/kernel/check
+++ b/kernel/check
@@ -1,14 +1,88 @@
 #!/bin/bash
 
-# Build the file
-./build
+(
+    set -o errexit -o pipefail -o noclobber
 
-if grub-file --is-x86-multiboot2 kernel.flat; then
-    echo "Multiboot2 header valid" > ./check_results
-else
-    echo "Multiboot2 header INVALID!" > ./check_results
-fi
+    HAVE_GETOPT=true
+    getopt --test > /dev/null && true
+    if [[ $? -ne 4 ]]; then
+        if [[ -n "EXIT_WITHOUT_GETOPT" ]]; then
+            echo '`getopt --test` failed. Exiting.'
+            exit 1
+        else
+            echo '`getopt --test` failed. Continuing and ignoring command line flags. (note that $1 will still be used for the target)'
+            echo '(to exit instead of ignoring, set the environment variable `EXIT_WITHOUT_GETOPT` to a non-null value)'
+            HAVE_GETOPT=false
+        fi
+    fi
 
-echo
+    real_check=false
 
-cat check_results
\ No newline at end of file
+    if [[ "$HAVE_GETOPT" = "true" ]]; then
+        LONGOPTS=real_check
+        OPTIONS=c
+
+        PARSED=$(getopt --options=$OPTIONS --longoptions=$LONGOPTS --name "$0" -- "$@") || (
+            echo '`getopt` failed to parse command line arguments. Check the arguments passed.'
+            exit 1
+        )
+        eval set -- "$PARSED"
+
+        while true; do
+            case "$1" in
+                -c|--real_check)
+                    real_check=true
+                    shift
+                    ;;
+                --)
+                    shift
+                    break
+                    ;;
+                *)
+                    echo "Unknown argument"
+                    exit 1
+                    ;;
+            esac
+        done
+    fi
+
+    if [[ $real_check = "true" ]]; then
+        ./build --check $!
+    else
+        ./build $!
+    fi
+
+    rm ./check_results
+
+    target="$1"
+
+    if [[ -z "$target" || "$target" = "x86" || "$target" = "mips64" || "$target" = "mipsel" || "$target" = "mipsle" ]]; then
+        if [[ -z "$target" ]]; then
+            # -f makes it so it won't error out if the file doesn't exist
+            rm -f targets.tmp
+            envsubst < "targets" > "targets.tmp"
+
+            export $(grep -Ev '^#' targets.tmp | xargs)
+            
+            for target in $TARGETS; do
+                if grub-file --is-x86-multiboot2 kernel-$target; then
+                    echo "Multiboot2 header valid" > ./check_results
+                else
+                    echo "Multiboot2 header INVALID!" > ./check_results
+                fi
+            done
+        else
+            if grub-file --is-x86-multiboot2 kernel-$target; then
+                echo "Multiboot2 header valid" > ./check_results
+            else
+                echo "Multiboot2 header INVALID!" > ./check_results
+            fi
+        fi
+    else
+        echo "Multiboot2 header not checked as neither x86 nor mips is being built" > ./check_results
+    fi
+
+    echo
+
+    cat check_results
+)
\ No newline at end of file
diff --git a/kernel/link.x b/kernel/link.x
index feeb333..69b3e44 100644
--- a/kernel/link.x
+++ b/kernel/link.x
@@ -4,7 +4,7 @@ OUTPUT_FORMAT(elf32-i386)
 SECTIONS {
     .text : {
         . = ALIGN(8);
-        KEEP(*(.multiboot2))
+        KEEP(*(.bootheader))
         KEEP(*(.start))
         KEEP(*(.text))
         KEEP(*(.panic))
diff --git a/kernel/src/arch_boot_entry/x86.rs b/kernel/src/arch_boot_entry/x86.rs
index d9b1b95..316b4dc 100644
--- a/kernel/src/arch_boot_entry/x86.rs
+++ b/kernel/src/arch_boot_entry/x86.rs
@@ -20,7 +20,7 @@ use aphrodite::output::*;
 use aphrodite::display::COLOR_DEFAULT;
 
 #[cfg(not(CONFIG_DISABLE_MULTIBOOT2_SUPPORT))]
-#[unsafe(link_section = ".multiboot2")]
+#[unsafe(link_section = ".bootheader")]
 #[unsafe(no_mangle)]
 static MULTIBOOT2_HEADER: [u8; 24] = [
 	0xd6, 0x50, 0x52, 0xe8, // Magic number
diff --git a/kernel/src/kernel/display.rs b/kernel/src/kernel/display.rs
index b3e7028..c405736 100644
--- a/kernel/src/kernel/display.rs
+++ b/kernel/src/kernel/display.rs
@@ -71,6 +71,7 @@ impl dyn TextDisplay + '_ {
     }
 }
 
+/// An implementation of [TextDisplay]. Returns (1,1) for the size and always returns Ok(()) for all functions.
 pub struct NoneTextDisplay {}
 
 impl TextDisplay for NoneTextDisplay {
diff --git a/kernel/validate-cfg b/kernel/validate-cfg
deleted file mode 100644
index 1e92c83..0000000
--- a/kernel/validate-cfg
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-
-set -e
\ No newline at end of file