From 71de0c20b854fe4d148a8f00bced602cabbbe1a2 Mon Sep 17 00:00:00 2001 From: "Chloe M." Date: Sun, 21 Jun 2026 23:29:51 +0000 Subject: [PATCH] build: Implement build pipeline Signed-off-by: Chloe M. --- build.sh | 76 ++++++++++++++++++++++++++++++ paw/base/boot/limine.conf | 12 +++++ paw/base/boot/splash.rgba | Bin 0 -> 478772 bytes paw/boot/Makefile | 15 ++++++ paw/boot/host/deps.sh | 10 ++++ paw/boot/host/iso.sh | 30 ++++++++++++ paw/devel/build.env | 25 ++++++++++ paw/devel/vars.env | 11 +++++ paw/mk/stos.mk | 52 ++++++++++++++++++++ paw/stos/Makefile | 17 +++++++ paw/stos/arch/amd64/Makefile | 30 ++++++++++++ paw/stos/arch/amd64/cpu/locore.S | 17 +++++++ paw/stos/arch/amd64/devel/link.ld | 66 ++++++++++++++++++++++++++ 13 files changed, 361 insertions(+) create mode 100755 build.sh create mode 100644 paw/base/boot/limine.conf create mode 100644 paw/base/boot/splash.rgba create mode 100644 paw/boot/Makefile create mode 100755 paw/boot/host/deps.sh create mode 100755 paw/boot/host/iso.sh create mode 100644 paw/devel/build.env create mode 100644 paw/devel/vars.env create mode 100644 paw/mk/stos.mk create mode 100644 paw/stos/Makefile create mode 100644 paw/stos/arch/amd64/Makefile create mode 100644 paw/stos/arch/amd64/cpu/locore.S create mode 100644 paw/stos/arch/amd64/devel/link.ld diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..e265cca --- /dev/null +++ b/build.sh @@ -0,0 +1,76 @@ +# +# Copyright (c) 2026, Chloe M. +# Provided under the BSD-3 clause +# +# Description: Top-level build driver +# Author: Chloe M. +# + +# Globals +MAKE=make + +# +# Check if a list of programs are installed on the system +# +# <@>: List of programs to check +# +check_deps() { + for dep in $@; do + printf "\033[33;40mChecking if $dep is installed... " + which $dep &>/dev/null + if [ $? -ne 0 ]; then + echo -e "\033[31;40mno" + echo -e "fatal: Please install '$dep'!\033[0m" + exit 1 + fi + + echo -e "\033[32;40myes\033[0m" + done +} + +# +# Verify that the build environment is sane before we actually +# start. +# +build_verify() { + check_deps \ + clang \ + rsync \ + xorriso + + # We need build envs !! + if [ -z "${ST_BUILD_SOURCED}" ] + then + echo -e "\033[31;40mfatal\033[0m: Please run '. paw/devel/build.env' first!" + exit 1 + fi +} + +# +# <$1>: Build target +# <$2>: Build message +# +make_build() { + echo -e "\033[37m[\033[35m*\033[37m] \033[32;40m$2\033[0m" + pushd $1; \ + $MAKE + popd +} + +# +# Kick off the actual build process +# +build() { + mkdir -p artifacts/ + + make_build \ + paw/stos \ + "Building system kernel..." + + make_build \ + paw/boot \ + "Building bootloader..." +} + +build_verify +build diff --git a/paw/base/boot/limine.conf b/paw/base/boot/limine.conf new file mode 100644 index 0000000..f1ccef8 --- /dev/null +++ b/paw/base/boot/limine.conf @@ -0,0 +1,12 @@ +timeout: 16 +interface_branding_color: 7 + +interface_branding: -- Yiff! -- + +editor_enabled: no +interface_help_hidden: yes +randomize_hhdm_base: yes + +/SystemPaw 3 + protocol: limine + kernel_path: boot():/boot/stoskrnl.sys diff --git a/paw/base/boot/splash.rgba b/paw/base/boot/splash.rgba new file mode 100644 index 0000000000000000000000000000000000000000..820295196e293a1027f6dc504570342245435bc5 GIT binary patch literal 478772 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/dev/null + +stand/limine/limine bios-install $ISO 2>/dev/null +rm -rf iso_root diff --git a/paw/devel/build.env b/paw/devel/build.env new file mode 100644 index 0000000..ef69c50 --- /dev/null +++ b/paw/devel/build.env @@ -0,0 +1,25 @@ +#!/bin/sh +# +# Copyright (c) 2026, Chloe M. +# Provided under the BSD-3 clause +# +# Description: Build envs +# Author: Chloe M. +# + +# Source build variables +. paw/devel/vars.env + +# Export envs +export ST_PROJECT_ROOT=$ST_PROJECT_ROOT +export ST_TARGET_ARCH=$ST_TARGET_ARCH +export ST_BOOT_PROTOCOL=$ST_BOOT_PROTOCOL + +if [ "$ST_BUILD_SOURCED" != "1" ] +then + echo "[*] build env ok" + export PS1="~ $PS1" +fi + +# Indicate that we have been sourced +export ST_BUILD_SOURCED=1 diff --git a/paw/devel/vars.env b/paw/devel/vars.env new file mode 100644 index 0000000..6727220 --- /dev/null +++ b/paw/devel/vars.env @@ -0,0 +1,11 @@ +# +# Copyright (c) 2026, Chloe M. +# Provided under the BSD-3 clause +# +# Description: Build variables +# Author: Chloe M. +# + +ST_PROJECT_ROOT=$(pwd) +ST_TARGET_ARCH=amd64 +ST_BOOT_PROTOCOL=limine diff --git a/paw/mk/stos.mk b/paw/mk/stos.mk new file mode 100644 index 0000000..94e6467 --- /dev/null +++ b/paw/mk/stos.mk @@ -0,0 +1,52 @@ +# +# Copyright (c) 2026, Chloe M. +# Provided under the BSD-3 clause +# +# Description: Build flags and such +# Author: Chloe M. +# + +PROMPT := printf "%s\t\t%s\n" +CC_PREFIX = + +ifeq ($(ST_TARGET_ARCH), amd64) + CC_TARGET = x86_64-unknown-elf +else + CC_TARGET = +endif + +CC = \ + clang +LD = \ + ld + +SYS_CFLAGS = \ + -nostdlib \ + -nostdinc \ + -ffreestanding \ + -fexceptions \ + -target $(CC_TARGET)\ + -mcmodel=kernel \ + -Wno-attributes \ + -Wno-multichar \ + -fno-stack-protector\ + -D_ST_MULTICORE \ + +ifeq ($(ST_TARGET_ARCH),amd64) + SYS_CFLAGS += \ + -mno-sse \ + -mno-sse2 \ + -mno-sse3 \ + -mno-avx \ + -mno-avx2 \ + -mno-80387 \ + -mno-3dnow \ + -mno-mmx +endif + +PASSDOWN_ARGS = \ + ARCH=$(ST_TARGET_ARCH) \ + SYS_CC=$(CC) \ + SYS_LD=$(LD) \ + SYS_CFLAGS="$(SYS_CFLAGS)"\ + ARCH_TARGET=$(ARCH_TARGET) diff --git a/paw/stos/Makefile b/paw/stos/Makefile new file mode 100644 index 0000000..b47037f --- /dev/null +++ b/paw/stos/Makefile @@ -0,0 +1,17 @@ +# +# Copyright (c) 2026, Chloe M. +# Provided under the BSD-3 clause +# +# Description: OS core build script +# Author: Chloe M. +# + +.SILENT: +include ../mk/stos.mk + +.PHONY: all +all: machine + +.PHONY: machine +machine: + cd arch/$(ST_TARGET_ARCH)/; $(MAKE) $(PASSDOWN_ARGS) diff --git a/paw/stos/arch/amd64/Makefile b/paw/stos/arch/amd64/Makefile new file mode 100644 index 0000000..182de7c --- /dev/null +++ b/paw/stos/arch/amd64/Makefile @@ -0,0 +1,30 @@ +# +# Copyright (c) 2026, Chloe M. +# Provided under the BSD-3 clause +# +# Description: AMD64 port build script +# Author: Chloe M. +# + +.SILENT: +include ../../../mk/stos.mk + +ASMFILES = $(shell find . -name "*.S") +ASMOFILES = $(ASMFILES:.S=.S.o) + +KERNEL_PATH = \ + $(ST_PROJECT_ROOT)/artifacts/stoskrnl.sys +CFLAGS = \ + $(SYS_CFLAGS) + +.PHONY: all +all: bin + +.PHONY: bin +bin: $(ASMOFILES) + $(PROMPT) "LD" $(KERNEL_PATH) + $(SYS_LD) -Tdevel/link.ld $(ASMOFILES) -o $(KERNEL_PATH) + +%.S.o: %.S + $(PROMPT) "AS" $< + $(SYS_CC) -c $< $(CFLAGS) -o $@ diff --git a/paw/stos/arch/amd64/cpu/locore.S b/paw/stos/arch/amd64/cpu/locore.S new file mode 100644 index 0000000..b4871ad --- /dev/null +++ b/paw/stos/arch/amd64/cpu/locore.S @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2026, Chloe M. + * Provided under the BSD-3 clause. + * + * Description: Low-level processor init + * Author: Chloe M. + */ + + .text + .globl _start +_start: + cli /* Just in case */ + xor %rbp, %rbp /* Terminate callstack */ + + mfence /* Flush caches */ +1: cli /* Disable interrupts */ + hlt /* Suspend processor */ diff --git a/paw/stos/arch/amd64/devel/link.ld b/paw/stos/arch/amd64/devel/link.ld new file mode 100644 index 0000000..a2732ec --- /dev/null +++ b/paw/stos/arch/amd64/devel/link.ld @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2026, Chloe M. + * Provided under the BSD-3 clause. + * + * Description: Kernel linker script + * Author: Chloe M. + */ + +OUTPUT_FORMAT(elf64-x86-64) +OUTPUT_ARCH(i386:x86-64) +ENTRY(_start) + +PHDRS { + text PT_LOAD FLAGS((1 << 0) | (1 << 2)) ; + rodata PT_LOAD FLAGS((1 << 2)) ; + data PT_LOAD FLAGS((1 << 1) | (1 << 2)) ; +} + +SECTIONS +{ + . = 0xFFFFFFFF80000000; + __KernelStart = .; + + .text : { + *(.text .text.*) + } :text + + . += CONSTANT(MAXPAGESIZE); + + .rodata : { + *(.rodata .rodata.*) + } :rodata + + . += CONSTANT(MAXPAGESIZE); + + .driver : { + __driver_start = .; + KEEP(*(.driver .driver)); + __driver_end = .; + } + + . += CONSTANT(MAXPAGESIZE); + + .font : { + KEEP(*(.font .font)); + } + + . += CONSTANT(MAXPAGESIZE); + + .data : { + *(.data) + } :data + + .bss : { + *(COMMON) + *(.bss .bss.*) + } :data + + __KernelEnd = .; + . += CONSTANT(MAXPAGESIZE); + + /DISCARD/ : { + *(.eh_frame .eh_frame.*) + *(.note .note.*) + } +}