From 3cd4fe9537e97ff92da70883c1a88d5d800387a6 Mon Sep 17 00:00:00 2001 From: Patrick Wuttke Date: Fri, 2 Feb 2024 22:16:02 +0100 Subject: [PATCH] Improved SCons script for building the userspace stdlib. --- SConstruct | 1 + targets/_any/stdlib/SConscript | 27 ++++++++++--------- .../_any/stdlib/src/{crt0.s => crt0.x86_64.s} | 0 .../crti.s => _any/stdlib/src/crti.x86_64.s} | 2 +- .../crtn.s => _any/stdlib/src/crtn.x86_64.s} | 0 .../stdlib/src/memory.x86_64.s} | 0 targets/x86_64/SConscript | 6 ++--- 7 files changed, 18 insertions(+), 18 deletions(-) rename targets/_any/stdlib/src/{crt0.s => crt0.x86_64.s} (100%) rename targets/{x86_64/src/crt/crti.s => _any/stdlib/src/crti.x86_64.s} (96%) rename targets/{x86_64/src/crt/crtn.s => _any/stdlib/src/crtn.x86_64.s} (100%) rename targets/{x86_64/src/cstdlib/memory.s => _any/stdlib/src/memory.x86_64.s} (100%) diff --git a/SConstruct b/SConstruct index 50ffa68..2b3791a 100644 --- a/SConstruct +++ b/SConstruct @@ -23,6 +23,7 @@ stdlib = GetOption('stdlib') env = Environment(tools = ['default', 'compilation_db'], ENV = os.environ) # TODO inheriting the environment is not a best practice env.Append(CCFLAGS = ['-g', '-O0', '-fno-stack-protector']) env.Append(CPPDEFINES = ['BASTL_EXTENSIONS=1']) +env['TARGET_ARCH'] = target # env.Append(CCFLAGS = ['-O2']) env['ISO_FILES'] = [] diff --git a/targets/_any/stdlib/SConscript b/targets/_any/stdlib/SConscript index 655a806..f06e07d 100644 --- a/targets/_any/stdlib/SConscript +++ b/targets/_any/stdlib/SConscript @@ -1,16 +1,20 @@ Import('env') -shared_sources = Split(''' +env['CRTI_PATH'] = env.File(f'src/crti.{env["TARGET_ARCH"]}.s').abspath +env['CRTN_PATH'] = env.File(f'src/crtn.{env["TARGET_ARCH"]}.s').abspath +env['CRT0_PATH'] = env.File(f'src/crt0.{env["TARGET_ARCH"]}.s').abspath + +stdlib_sources = Split(f''' src/assert.cpp src/stdio.cpp src/stdlib.cpp src/string.cpp + + src/memory.{env['TARGET_ARCH']}.s ''') -kernel_sources = shared_sources - -env.Append(KERNEL_SOURCES = [env.File(f) for f in kernel_sources]) +env.Append(KERNEL_SOURCES = [env.File(f) for f in stdlib_sources]) ### Stdlib stdlib_env = env.Clone() @@ -18,20 +22,17 @@ stdlib_env['AS'] = 'x86_64-baos-elf-as' stdlib_env['CC'] = 'x86_64-baos-elf-gcc' stdlib_env['CXX'] = 'x86_64-baos-elf-g++' stdlib_env['LD'] = 'x86_64-baos-elf-g++' +stdlib_env['OBJSUFFIX'] = f'.baos{stdlib_env["OBJSUFFIX"]}' stdlib_env.Append(CXXFLAGS = ['-fno-exceptions', '-fno-rtti', '-std=c++20']) stdlib_env.Append(CPPPATH = ['#targets/_any/bastl/include', '#targets/_any/stdlib/include', '#targets/_any/kernel/include']) -stdlib_sources = Split(''' - src/crt0.s -''') -for src in shared_sources: - new_src = stdlib_env.File(f'#.stdlib_variant/{stdlib_env.File(src).name}').abspath - stdlib_env.Command(new_src, src, Copy("$TARGET", "$SOURCE")) - stdlib_sources.append(new_src) lib_stdlib = stdlib_env.StaticLibrary( - target = stdlib_env.File('#stdlib.a'), + target = stdlib_env.File('#stdlib/stdlib.a'), source = stdlib_sources ) -stdlib_env.Default(lib_stdlib) +crti_o = stdlib_env.Object(target = '#stdlib/crti.o', source = stdlib_env['CRTI_PATH']) +crtn_o = stdlib_env.Object(target = '#stdlib/crtn.o', source = stdlib_env['CRTN_PATH']) +crt0_o = stdlib_env.Object(target = '#stdlib/crt0.o', source = stdlib_env['CRT0_PATH']) +stdlib_env.Default([lib_stdlib, crti_o, crtn_o, crt0_o]) Return('env') diff --git a/targets/_any/stdlib/src/crt0.s b/targets/_any/stdlib/src/crt0.x86_64.s similarity index 100% rename from targets/_any/stdlib/src/crt0.s rename to targets/_any/stdlib/src/crt0.x86_64.s diff --git a/targets/x86_64/src/crt/crti.s b/targets/_any/stdlib/src/crti.x86_64.s similarity index 96% rename from targets/x86_64/src/crt/crti.s rename to targets/_any/stdlib/src/crti.x86_64.s index a110e59..a85782e 100644 --- a/targets/x86_64/src/crt/crti.s +++ b/targets/_any/stdlib/src/crti.x86_64.s @@ -13,4 +13,4 @@ _init: _fini: push %rbp movq %rsp, %rbp - /* gcc will nicely put the contents of crtbegin.o's .fini section here. */ \ No newline at end of file + /* gcc will nicely put the contents of crtbegin.o's .fini section here. */ diff --git a/targets/x86_64/src/crt/crtn.s b/targets/_any/stdlib/src/crtn.x86_64.s similarity index 100% rename from targets/x86_64/src/crt/crtn.s rename to targets/_any/stdlib/src/crtn.x86_64.s diff --git a/targets/x86_64/src/cstdlib/memory.s b/targets/_any/stdlib/src/memory.x86_64.s similarity index 100% rename from targets/x86_64/src/cstdlib/memory.s rename to targets/_any/stdlib/src/memory.x86_64.s diff --git a/targets/x86_64/SConscript b/targets/x86_64/SConscript index f1e0cf2..dc4f633 100644 --- a/targets/x86_64/SConscript +++ b/targets/x86_64/SConscript @@ -24,16 +24,14 @@ def get_crt_object(name: str) -> str: crtbegin_o = get_crt_object('crtbegin.o') crtend_o = get_crt_object('crtend.o') -crti_o = kernel_env.Object('src/crt/crti.s') -crtn_o = kernel_env.Object('src/crt/crtn.s') +crti_o = kernel_env.Object(kernel_env['CRTI_PATH']) +crtn_o = kernel_env.Object(kernel_env['CRTN_PATH']) kernel_env['LINKCOM'] = env['LINKCOM'].replace('$_LIBFLAGS', f'{crti_o[0].abspath} {crtbegin_o} -Wl,--start-group $_LIBFLAGS -Wl,--end-group -lgcc {crtend_o} {crtn_o[0].abspath}') kernel_isr_sources = env['KERNEL_ISR_SOURCES'] + Split(''' ''') kernel_sources = env['KERNEL_SOURCES'] + Split(''' - src/cstdlib/memory.s - src/kernel/boot.s src/kernel/startup.cpp ''') + [kernel_env.Object(f, CCFLAGS = kernel_env['CCFLAGS'] + ['-mgeneral-regs-only']) for f in kernel_isr_sources]