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


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

kern_source = [
    'apic.cc',
    'global_vars.cc',
    'cpu_idte.cc',
    'hpet_timer.cc',
    'interrupt_native.S',
    'ioapic.cc',
    'irq_ctl.cc',
    'kerninit.cc',
    'native_cpu_node.cc',
    'on_syscall.S',
    'page_ctl.cc',
    'page_ctl_init.cc',
    'serial.cc',
    'string.cc',
    'bootinfo.cc',
    'spinlock_ops.cc',
    'start.S',
    'syscall_entry.cc',
    'thread_ctl.cc',
    'cpu_ctl.cc',

    # for g++
    'gnuc.c',

    # for test
    'test.cc',
]


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


def build(x):

	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)

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

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

	fp_target = x.path.find_or_declare('first_process')
	fp_linkerscript = x.path.find_node('first_process.lds')
	x.add_manual_dependency(fp_target, fp_linkerscript)
	fp_linkflags = ['-nostdlib', '-Wl,-T'+fp_linkerscript.abspath()]
	x.program(
	    features  = 'asm cprogram',
	    target    = fp_target,
	    source    = 'first_process.S',
	    linkflags = fp_linkflags)
