import subprocess 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']) 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/tty.cpp src/stdlib/assert.cpp src/stdlib/stdio.cpp src/stdlib/stdlib.cpp src/stdlib/string.cpp ''') env['LINKCOM'] = env['LINKCOM'].replace('$_LIBFLAGS', f'{crti_o[0]} {crtbegin_o} $_LIBFLAGS {crtend_o} {crtn_o[0]}') prog_os = env.Program( target = 'os.bin', source = os_sources ) env.Depends(prog_os, [crti_o, crtn_o]) env.Default(prog_os) comp_db = env.CompilationDatabase(target = '#compile_commands.json') env.Default(comp_db)