From 9d4cc53314b8e2a236401733ac6c7093c97d4351 Mon Sep 17 00:00:00 2001 From: Lunaixsky Date: Sun, 11 May 2025 00:50:02 +0100 Subject: [PATCH] migrate stock user space build to new build system * fix corner cases in luna_build.py when no LConfig is used * add back the missing arch_bits_* flags * fix sometimes the shconfig being triggered multiple times --- lunaix-os/arch/LConfig | 16 ++++-- lunaix-os/install_headers.mk | 2 + lunaix-os/makefile | 1 - lunaix-os/makeinc/lunabuild.mkinc | 2 +- .../scripts/build-tools/lcfg2/builder.py | 5 ++ lunaix-os/scripts/build-tools/lcfg2/config.py | 8 ++- lunaix-os/scripts/build-tools/luna_build.py | 11 +++- .../scripts/build-tools/shared/scopes.py | 14 ++++- lunaix-os/usr/LBuild | 53 +++++++++++-------- lunaix-os/usr/LConfig | 8 --- lunaix-os/usr/libc/LBuild | 19 ++++--- lunaix-os/usr/libc/arch/i386/LBuild | 8 +-- lunaix-os/usr/libc/arch/x86_64/LBuild | 8 +-- lunaix-os/usr/libc/makefile | 4 +- lunaix-os/usr/makefile | 9 ++-- 15 files changed, 104 insertions(+), 64 deletions(-) delete mode 100644 lunaix-os/usr/LConfig diff --git a/lunaix-os/arch/LConfig b/lunaix-os/arch/LConfig index a78038f..e9eacee 100644 --- a/lunaix-os/arch/LConfig +++ b/lunaix-os/arch/LConfig @@ -8,16 +8,24 @@ def architecture_support(): @flag def arch_x86_32() -> bool: - when(arch is "i386") + when (arch is "i386") @flag def arch_x86_64() -> bool: - when(arch is "x86_64") + when (arch is "x86_64") @flag def arch_x86() -> bool: - when(arch is "i386") - when(arch is "x86_64") + when (arch is "i386") + when (arch is "x86_64") + + @flag + def arch_bits_64() -> bool: + when (arch_bits is 64) + + @flag + def arch_bits_32() -> bool: + when (arch_bits is 32) @"Architecture" def arch() -> "i386" | "x86_64": diff --git a/lunaix-os/install_headers.mk b/lunaix-os/install_headers.mk index d636375..fee40f0 100644 --- a/lunaix-os/install_headers.mk +++ b/lunaix-os/install_headers.mk @@ -4,6 +4,8 @@ ifndef PREFIX $(error "Must specify PREFIX to header install location") endif +CFLAGS += $(kcflags) + USR_HEADER := includes/usr HEADERS := $(shell cat $(USR_HEADER)/headers) diff --git a/lunaix-os/makefile b/lunaix-os/makefile index 5d6d2af..ce65d67 100644 --- a/lunaix-os/makefile +++ b/lunaix-os/makefile @@ -76,7 +76,6 @@ clean: @$(MAKE) -f kernel.mk clean -I $(mkinc_dir) @rm -rf $(kbuild_dir) || exit 1 - @rm -rf .builder || exit 1 # --- begin misc --- # diff --git a/lunaix-os/makeinc/lunabuild.mkinc b/lunaix-os/makeinc/lunabuild.mkinc index f4cd270..2e08b38 100644 --- a/lunaix-os/makeinc/lunabuild.mkinc +++ b/lunaix-os/makeinc/lunabuild.mkinc @@ -16,7 +16,7 @@ endef define __gen_build @echo restarting configuration... - @$(LBUILD) --gen-config $(lbuild_dir) + @$(LBUILD) --gen-build $(lbuild_dir) endef define __gen_both diff --git a/lunaix-os/scripts/build-tools/lcfg2/builder.py b/lunaix-os/scripts/build-tools/lcfg2/builder.py index 235126c..832807a 100644 --- a/lunaix-os/scripts/build-tools/lcfg2/builder.py +++ b/lunaix-os/scripts/build-tools/lcfg2/builder.py @@ -1,5 +1,6 @@ import ast import textwrap +import os from lib.utils import ConfigAST, ConfigASTVisitor from .common import NodeProperty, ConfigNodeError, ValueTypeConstrain @@ -99,6 +100,10 @@ class NodeBuilder(ConfigASTVisitor): @staticmethod def build(env, rootfile): + if not os.path.exists(rootfile): + print(f"warning: config file '{rootfile}' not detected, skipped") + return + build = NodeBuilder(env) ast = ConfigAST(rootfile) diff --git a/lunaix-os/scripts/build-tools/lcfg2/config.py b/lunaix-os/scripts/build-tools/lcfg2/config.py index 9eda9e0..7ca1942 100644 --- a/lunaix-os/scripts/build-tools/lcfg2/config.py +++ b/lunaix-os/scripts/build-tools/lcfg2/config.py @@ -85,6 +85,9 @@ class ConfigEnvironment: return self.__globals def refresh(self): + if not self.__exec: + return + self.__update_globals() for name, node in self.__node_table.items(): @@ -109,4 +112,7 @@ class ConfigEnvironment: def terms(self): for node in self.__node_table.values(): if isinstance(node, TermNode): - yield node \ No newline at end of file + yield node + + def loaded(self): + return self.__exec is not None \ No newline at end of file diff --git a/lunaix-os/scripts/build-tools/luna_build.py b/lunaix-os/scripts/build-tools/luna_build.py index aafdb0a..0f96e3e 100755 --- a/lunaix-os/scripts/build-tools/luna_build.py +++ b/lunaix-os/scripts/build-tools/luna_build.py @@ -12,7 +12,7 @@ from shared.export import ExportJsonFile from shared.export import ExportHeaderFile from shared.export import ExportMakefileRules from shared.export import restore_config_value -from shared.scopes import ConfigScope +from shared.scopes import ConfigScope, EnvScope from shared.build_gen import BuildScriptGenerator from shared.shconfig import shconfig @@ -35,6 +35,8 @@ class LunaBuild: scope.subscope("ld") self.__lbuilder.register_scope(scope) + self.__lbuilder.register_scope(EnvScope()) + self.__json = ExportJsonFile(self.__lconfig) self.__make = ExportMakefileRules(self.__lconfig) self.__headr = ExportHeaderFile(self.__lconfig) @@ -76,6 +78,13 @@ class LunaBuild: self.__headr.export(outdir / "config.h") def visual_config(self): + if not self.__lconfig.loaded(): + print("no config file loaded, skipped interactive config") + return + + if not self.__opt.gen_config: + return + if not shconfig(self.__lconfig): print("configuration process aborted") exit(1) diff --git a/lunaix-os/scripts/build-tools/shared/scopes.py b/lunaix-os/scripts/build-tools/shared/scopes.py index a56c342..507280b 100644 --- a/lunaix-os/scripts/build-tools/shared/scopes.py +++ b/lunaix-os/scripts/build-tools/shared/scopes.py @@ -1,3 +1,5 @@ +import os + from lbuild.scope import ScopeProvider from lcfg2.common import NodeProperty @@ -11,4 +13,14 @@ class ConfigScope(ScopeProvider): if node is None: raise Exception(f"config '{name}' not exists") - return NodeProperty.Value[node] \ No newline at end of file + if not NodeProperty.Enabled[node]: + return None + + return NodeProperty.Value[node] + +class EnvScope(ScopeProvider): + def __init__(self): + super().__init__("env") + + def __getitem__(self, name): + return os.environ.get(name) \ No newline at end of file diff --git a/lunaix-os/usr/LBuild b/lunaix-os/usr/LBuild index 0561206..05a1246 100644 --- a/lunaix-os/usr/LBuild +++ b/lunaix-os/usr/LBuild @@ -1,4 +1,4 @@ -sources([ +src.c += ( "testp", "ls", "signal_demo", @@ -10,36 +10,43 @@ sources([ "mkdir", "rm", "fragfile", -]) +) -compile_opts([ +flag.cc += ( "-ffreestanding", - "-fno-pie" -]) + "-fno-pie", + "-Werror" +) -linking_opts([ +flag.ld += ( "-nostdlib", "-nolibc", "-z noexecstack", "-no-pie", -]) +) -linking_opts([ +flag.ld += ( "-Wl,--build-id=none" -]) +) -if config("arch") == "x86_64": - compile_opts([ - "-m64", - "-fno-unwind-tables", - "-fno-asynchronous-unwind-tables", - "-mcmodel=large" - ]) - linking_opts([ - "-m64", - ]) -else: - compile_opts("-m32") - linking_opts("-m32") +match env.ARCH: + case "x86_64": + flag.cc += ( + "-m64", + "-fno-unwind-tables", + "-fno-asynchronous-unwind-tables", + "-mcmodel=large", + "-DCONFIG_ARCH_X86_64" + ) + flag.ld += ( + "-m64", + ) + case "i386": + flag.cc += "-m32", "-DCONFIG_ARCH_X86_32" + flag.ld += "-m32" -compile_opts("-mno-sse") \ No newline at end of file +flag.cc += "-mno-sse" + +flag.cc += ( + "-Wno-discarded-qualifiers" +) \ No newline at end of file diff --git a/lunaix-os/usr/LConfig b/lunaix-os/usr/LConfig deleted file mode 100644 index ad2709c..0000000 --- a/lunaix-os/usr/LConfig +++ /dev/null @@ -1,8 +0,0 @@ -@"Architecture" -def arch() -> "i386" | "x86_64" | "aarch64" | "rv64": - """ - set the ISA target - """ - - _arch = env("ARCH") - return _arch if _arch else "x86_64" diff --git a/lunaix-os/usr/libc/LBuild b/lunaix-os/usr/libc/LBuild index 5c77fe2..148835f 100644 --- a/lunaix-os/usr/libc/LBuild +++ b/lunaix-os/usr/libc/LBuild @@ -1,4 +1,4 @@ -sources([ +src.c += ( "src/string.c", "src/termios.c", "src/itoa.c", @@ -6,9 +6,9 @@ sources([ "src/readdir.c", "src/pthread.c", "src/printf.c" -]) +) -sources([ +src.c += ( "src/posix/signal.c", "src/posix/mount.c", "src/posix/errno.c", @@ -18,11 +18,10 @@ sources([ "src/posix/unistd.c", "src/posix/mann.c", "src/posix/lunaix.c" -]) +) -use({ - env("ARCH"): { - "i386": "arch/i386", - "x86_64": "arch/x86_64", - } -}) \ No newline at end of file +match env.ARCH: + case "i386": + from .arch import i386 + case "x86_64": + from .arch import x86_64 diff --git a/lunaix-os/usr/libc/arch/i386/LBuild b/lunaix-os/usr/libc/arch/i386/LBuild index be547c8..6dfebc1 100644 --- a/lunaix-os/usr/libc/arch/i386/LBuild +++ b/lunaix-os/usr/libc/arch/i386/LBuild @@ -1,8 +1,8 @@ -sources([ +src.c += ( "crt0.S", "syscall.S", "trampoline.S", -]) +) -compile_opts("-m32") -linking_opts("-m32") \ No newline at end of file +flag.cc += "-m32" +flag.ld += "-m32" \ No newline at end of file diff --git a/lunaix-os/usr/libc/arch/x86_64/LBuild b/lunaix-os/usr/libc/arch/x86_64/LBuild index 8e0ed54..e13a4be 100644 --- a/lunaix-os/usr/libc/arch/x86_64/LBuild +++ b/lunaix-os/usr/libc/arch/x86_64/LBuild @@ -1,8 +1,8 @@ -sources([ +src.c += ( "crt0.S", "syscall.S", "trampoline.S", -]) +) -compile_opts("-m64") -linking_opts("-m64") \ No newline at end of file +flag.cc += "-m64" +flag.ld += "-m64" \ No newline at end of file diff --git a/lunaix-os/usr/libc/makefile b/lunaix-os/usr/libc/makefile index 0c03770..223ce40 100644 --- a/lunaix-os/usr/libc/makefile +++ b/lunaix-os/usr/libc/makefile @@ -10,12 +10,12 @@ BUILD_NAME ?= liblunac src_dirs := src src_dirs += arch/$(ARCH) -obj_files := $(addsuffix .o, $(_LBUILD_SRCS)) +obj_files := $(addsuffix .o, $(BUILD_SRCS)) build_lib := $(BUILD_DIR)/lib libc_include_opt = $(addprefix -I, $(libc_include)) -global_include_opt = $(addprefix -I, $(INCLUDES) $(_LBUILD_INCS)) +global_include_opt = $(addprefix -I, $(INCLUDES) $(BUILD_INC)) check_folders := $(src_dirs) check_folders += $(build_lib) $(LIBC_INCLUDE) diff --git a/lunaix-os/usr/makefile b/lunaix-os/usr/makefile index 49036fc..8fa1c31 100644 --- a/lunaix-os/usr/makefile +++ b/lunaix-os/usr/makefile @@ -1,8 +1,6 @@ include utils.mkinc include toolchain.mkinc -LCONFIG_FLAGS := --quiet - include lunabuild.mkinc include $(lbuild_mkinc) @@ -11,6 +9,9 @@ ifndef ARCH $(error ARCH is not set) endif +CFLAGS += $(BUILD_CFLAGS) +LDFLAGS += $(BUILD_LDFLAGS) + task := all sys_include := $(CURDIR)/includes @@ -29,7 +30,7 @@ BUILD_NAME := $(libc_name).a LIBC_INCLUDE := $(build_dir)/usr/includes mkapp-list := $(addprefix app-, $(shell cat apps.list)) -mkexec-list := $(addprefix $(build_dir)/bin/, $(_LBUILD_SRCS)) +mkexec-list := $(addprefix $(build_dir)/bin/, $(BUILD_SRCS)) uexec_ld := $(CURDIR)/uexec.ld @@ -51,7 +52,7 @@ $(build_dir)/$(libc_name).a: $(build_dir)/bin \ @$(MAKE) $(MKFLAGS) -C libc/ $(task) $(uexec_ld): $(uexec_ld)x - @$(CC) -include $(lbuild_config_h) -x c -P -E $< -o $@ + @$(CC) $(CFLAGS) -x c -P -E $< -o $@ # Application (with standalone makefile) export LD_SCRIPT := $(uexec_ld) -- 2.27.0