58 lines
1.6 KiB
Python
58 lines
1.6 KiB
Python
Import('env')
|
|
|
|
env['AS'] = 'x86_64-elf-as'
|
|
env['CC'] = 'x86_64-elf-gcc'
|
|
env['CXX'] = 'x86_64-elf-g++'
|
|
env['LD'] = 'x86_64-elf-g++'
|
|
|
|
def get_crt_object(name: str) -> str:
|
|
import subprocess
|
|
|
|
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')
|
|
|
|
x86_64_sources = Split('''
|
|
src/kernel/startup.cpp
|
|
''')
|
|
|
|
env['KERNEL_LINKCOM'] = env['LINKCOM'].replace('$_LIBFLAGS', f'{crti_o[0].abspath} {crtbegin_o} $_LIBFLAGS {crtend_o} {crtn_o[0].abspath}')
|
|
|
|
x86_64_iso_files = [
|
|
{
|
|
"source": env.File("boot/grub.cfg"),
|
|
"target": "boot/grub/grub.cfg"
|
|
},
|
|
{
|
|
"source": env.File("#os.bin"),
|
|
"target": "boot/os.bin"
|
|
},
|
|
{
|
|
"source": env.File("#loader.bin"),
|
|
"target": "boot/loader.bin"
|
|
}
|
|
]
|
|
|
|
# also compile the loader (as i686-elf)
|
|
loader_sources = Split('''
|
|
src/loader/boot.asm
|
|
''')
|
|
nasm_include_dir = env.Dir('src/loader')
|
|
prog_loader = env.Command(
|
|
'#loader.bin', 'src/loader/boot.asm', f'nasm -I"{nasm_include_dir.abspath}" "$SOURCE" -f bin -o "$TARGET"'
|
|
)
|
|
|
|
# finally update the environment
|
|
env.Append(KERNEL_SOURCES = [env.File(f) for f in x86_64_sources])
|
|
env.Append(KERNEL_DEPENDENCIES = [crti_o, crtn_o, prog_loader])
|
|
env.Append(LINKFLAGS = ['-mcmodel=large', '-mno-red-zone', '-mno-mmx', '-mno-sse', '-mno-sse2'])
|
|
env.Append(ISO_FILES = x86_64_iso_files)
|
|
|
|
Return('env')
|