54 lines
1.6 KiB
Python

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')