# @file   wscript
# @brief  x86_64固有カーネルコード
#
# (C) 2011-2012 KATO Takeshi
#


kern_linkflags = [
    '-nostartfiles',
    '-static',
]

kern_source = [
    'apic.cc',
    'global_vars.cc',
    'cpu_idte.cc',
    'hpet_timer.cc',
    'interrupt_native.S',
    'ioapic.cc',
    'irq_ctl.cc',
    'kerninit.cc',
#   'kernel_memory.cc',
    'page_ctl.cc',
    'page_ctl_init.cc',
    'serial.cc',
    'serialh.S',
    'string.cc',
    'bootinfo.cc',
    'spinlock_ops.cc',
    'start.S',
    'cpu_ctl.cc',

    # for g++
    'gnuc.c',

    # for test
    'test.cc',
]


def configure(x):
	x.find_program('lzma', var='LZMA')

def build(x):
	x.env.append_value('DEFINES_KERNEL', 'ARCH_ADR_BITS=64')

	kern_target = x.path.find_or_declare('kernel.bin')

	linker_script = x.path.find_node('kernel.lds')
	kern_linkflags.append('-Wl,-T' + linker_script.abspath())
	x.add_manual_dependency(kern_target, linker_script)

	mapfile = x.path.find_or_declare('kernel.map')
	kern_linkflags.append('-Wl,-Map,' + mapfile.abspath())

	ap_target = x.path.find_or_declare('ap_boot.bin')
	ap_ld = x.path.find_node('ap_boot.lds')
	ap_ldflags = ['-nostdlib']
	ap_ldflags.append('-Wl,-T' + ap_ld.abspath())
	x.add_manual_dependency(ap_target, ap_ld)
	x(  features  = 'asm c cprogram',
	    target    = ap_target,
	    source    = 'ap_boot.S',
	    linkflags = ap_ldflags)
	ap_obj = x.path.find_or_declare('ap_boot_obj.o')
	x(  rule = '${OBJCOPY} -I binary -O elf64-x86-64 -B i386 '
	           '${SRC} ${TGT}',
	    target = ap_obj,
	    source = ap_target)
	kern_source.append(ap_obj)

	x.program(
	    features  = 'asm c cxx',
	    target    = kern_target,
	    source    = kern_source,
	    use       = ['kernel_libs', 'kernel_objs', 'acpi_objs', 'acpica_objs', 'KERNEL'],
	    linkflags = kern_linkflags)

	x(  target   = 'kernel.bin.lzma',
	    source   = 'kernel.bin',
	    rule     = '${LZMA} -c ${SRC} > ${TGT}')

