# wscript for the multiboot image.
#
# (C) 2011-2013 KATO Takeshi
#

source = (
    'cheap_alloc_use.cc',
    'entry.S',
    'log_access.cc',
    'load.cc',
    'global.cc',
    'memlog.cc',
    'postload.cc',
)

source_mb = (
    'header_mb.S',
    'preload_mb.cc',
)
source_mb2 = (
    'header_mb2.S',
    'preload_mb2.cc',
)

def configure(x):
	x.env.append_value('CXXFLAGS_MB', '-m32')
	x.env.append_value('CFLAGS_MB', x.env.COMMON_CFLAGS)
	x.env.append_value('CXXFLAGS_MB', x.env.COMMON_CXXFLAGS)
	x.env.append_value('DEFINES_MB', 'ARCH_LE')
	x.env.append_value('DEFINES_MB', 'ARCH_ADR_BITS=32')

	if x.options.compiler == 'clang':
		x.env.append_value('CXXFLAGS_MB', '-Wc++11-compat')
		x.env.append_value('CXXFLAGS_MB', '-Wc++11-extensions')

	elif x.options.compiler == 'gnu':
		x.env.append_unique('CXXFLAGS_MB', '-std=c++0x')

def build(x):
	sources = list(source)
	if x.env.CONFIG_MULTIBOOT:
		sources.extend(source_mb)
	if x.env.CONFIG_MULTIBOOT2:
		sources.extend(source_mb2)

	target = x.path.find_or_declare('us')

	linker_script = x.path.find_node('multiboot.ld')

	ls_opt = '-Wl,-T' + linker_script.abspath()

	x.add_manual_dependency(target, linker_script)

	# kernel
	k_obj = x.path.find_or_declare('kernel.o')
	x(
	    rule = '${OBJCOPY} -I binary -O elf32-i386 -B i386 '
	           '${SRC} ${TGT}',
	    target = k_obj,
	    source = '../../kernel/kernel.bin',
	)
	sources.append(k_obj)

	# first_process
	fp_obj = x.path.find_or_declare('first_process.o')
	x(
	    rule = '${OBJCOPY} -I binary -O elf32-i386 -B i386 '
	           '${SRC} ${TGT}',
	    target = fp_obj,
	    source = '../../kernel/first_process',
	)
	sources.append(fp_obj)

	env32 = x.env.derive()
	env32.append_value('ASFLAGS', '-m32')

	mapfile = x.path.find_or_declare('multiboot.map')
	map_opt = '-Wl,-Map,' + mapfile.abspath()

	x.program(
	    target = target,
	    source = sources,
	    includes = '#external/multiboot/include',
	    cxxflags = ['-fno-exceptions', '-fno-rtti', '-mno-sse'],
	    linkflags = ['-m32', '-nostdlib', '-static', ls_opt, map_opt],
	    env = env32,
	    use = ['MB', 'mb_archlibs', 'mb_libs'],
	)

