Split up source and added basic support for different targets.

This commit is contained in:
2024-01-12 17:19:27 +01:00
parent 219a48c616
commit 408e06b2e0
29 changed files with 559 additions and 36 deletions

View File

@@ -1,52 +1,36 @@
import subprocess
AddOption(
'--target',
dest = 'target',
type = 'choice',
choices = ('i686', 'x86_64'),
nargs = 1,
action = 'store',
default = 'i686'
)
target = GetOption('target')
env = Environment(tools = ['default', 'compilation_db'])
env['AS'] = 'i686-elf-as'
env['CC'] = 'i686-elf-gcc'
env['CXX'] = 'i686-elf-g++'
env['LD'] = 'i686-elf-g++'
env.Append(CXXFLAGS = ['-ffreestanding', '-fno-exceptions', '-fno-rtti', '-std=c++20'])
env.Append(LINKFLAGS = ['-T', 'linker.ld', '-ffreestanding', '-nostdlib'])
env.Append(CPPPATH = ['#include', '#bastl/include'])
env.Append(CPPPATH = ['#targets/_any/include', '#bastl/include'])
env.Append(CCFLAGS = ['-g', '-O0'])
def get_crt_object(name: str) -> str:
cmd = [env['CXX']]
cmd.extend(env['CXXFLAGS'])
cmd.append(f'-print-file-name={name}')
result = subprocess.run(cmd, stdout=subprocess.PIPE)
return result.stdout.decode('utf-8').strip()
crtbegin_o = get_crt_object('crtbegin.o')
crtend_o = get_crt_object('crtend.o')
crti_o = env.Object('src/crt/crti.s')
crtn_o = env.Object('src/crt/crtn.s')
os_sources = Split('''
src/app/main.cpp
src/kernel/boot.s
src/kernel/startup.cpp
src/os/panic.cpp
src/os/tty.cpp
src/cstdlib/assert.cpp
src/cstdlib/stdio.cpp
src/cstdlib/stdlib.cpp
src/cstdlib/string.cpp
bastl/src/exception.cpp
bastl/src/new.cpp
''')
env['LINKCOM'] = env['LINKCOM'].replace('$_LIBFLAGS', f'{crti_o[0]} {crtbegin_o} $_LIBFLAGS {crtend_o} {crtn_o[0]}')
env['KERNEL_SOURCES'] = []
env['KERNEL_DEPENDENCIES'] = []
env = SConscript('bastl/SConscript', exports = 'env')
env = SConscript('targets/_any/SConscript', exports = 'env')
env = SConscript(f'targets/{target}/SConscript', exports = 'env')
prog_os = env.Program(
target = 'os.bin',
source = os_sources,
source = env['KERNEL_SOURCES'],
LIBS = ['gcc']
)
env.Depends(prog_os, [crti_o, crtn_o])
env.Depends(prog_os, env['KERNEL_DEPENDENCIES'])
env.Default(prog_os)
comp_db = env.CompilationDatabase(target = '#compile_commands.json')
env.Default(comp_db)