Import('env') kernel_env = env.Clone() kernel_env['AS'] = 'i686-elf-as' kernel_env['CC'] = 'i686-elf-gcc' kernel_env['CXX'] = 'i686-elf-g++' kernel_env['LD'] = 'i686-elf-g++' kernel_env.Append(CFLAGS = ['-ffreestanding']) kernel_env.Append(CXXFLAGS = ['-ffreestanding', '-fno-exceptions', '-fno-rtti', '-std=c++20']) kernel_env.Append(LINKFLAGS = ['-T', kernel_env.File('linker.ld').abspath, '-ffreestanding', '-nostdlib']) kernel_env.Append(CPPPATH = ['#targets/_any/include', '#targets/_any/bastl/include']) def get_crt_object(name: str) -> str: import subprocess cmd = [kernel_env['CXX']] cmd.extend(kernel_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 = kernel_env.Object('src/crt/crti.s') crtn_o = kernel_env.Object('src/crt/crtn.s') kernel_env['LINKCOM'] = env['LINKCOM'].replace('$_LIBFLAGS', f'{crti_o[0].abspath} {crtbegin_o} $_LIBFLAGS {crtend_o} {crtn_o[0].abspath}') kernel_sources = env['KERNEL_SOURCES'] + Split(''' src/kernel/boot.s src/kernel/startup.cpp ''') prog_kernel = kernel_env.Program( target = '#kernel.i686.bin', source = kernel_sources, LIBS = ['gcc'] ) kernel_env.Depends(prog_kernel, [crti_o, crtn_o]) kernel_env.Default(prog_kernel) i686_iso_files = [ { "source": kernel_env.File("boot/grub.cfg"), "target": "boot/grub/grub.cfg" }, { "source": kernel_env.File("#os.bin"), "target": "boot/os.bin" } ] env.Append(ISO_FILES = i686_iso_files) Return('env')