
ldr_defines = [
    'ARCH_LE',
    'ARCH_IA32',  # means 32bit mode in x86_64
]

ldr_includes = ['.', '../include']

ldr_asflags = [
    '-fno-exceptions', '-m32',
    '-fomit-frame-pointer', '-Os',
]

ldr_cxxflags = [
    '-fno-exceptions', '-fno-rtti', '-m32',
    '-fomit-frame-pointer', '-Os',
]

ldr_linkflags = [
    '-nostdlib', '-static',
    '-m32',
    #'-Wl,-Ttext=0x7e00',
]

ldr_sources = [
    'loadfat.cc',
    'loadkern.cc',
]

ldr_asm_source = [
    'entry.S',
    'transport.S',
]


def build(x):
	ldr_target = x.path.find_or_declare('bootldr.bin')

	ldr_asflags.append('-I' + x.path.find_dir('../include').abspath())

	for i in ldr_defines:
		ldr_asflags.append('-D' + i)

	linker_script = x.path.find_node('bootldr.ld')
	ldr_linkflags.append('-T' + linker_script.abspath())
	x.add_manual_dependency(ldr_target, linker_script)

	ldr_linkflags2 = [x.env.LINK_PASS + f for f in ldr_linkflags]
	ldr_linkflags2.append('-Wl,-Ttext=0x0400')

	# assemble-->
	rule_asm = '${CC} -c ${SRC} -o ${TGT} ' + ' '.join(ldr_asflags)

	for asm_src in ldr_asm_source:
		srcnode = x.path.find_node(asm_src)
		objnode = srcnode.change_ext('.o')

		x(target=objnode, source=srcnode, rule=rule_asm)

		# .o を ldr_source に入れられないためリンクフラグに入れる。
		ldr_linkflags2.append(objnode.abspath())
		x.add_manual_dependency(ldr_target, objnode)
	# <--assemble

	x.program(features='cxx cxxprogram',
	    target   = ldr_target,
	    source   = ldr_sources,
	    defines  = ldr_defines,
	    includes = ldr_includes,
	    cxxflags = ldr_cxxflags,
	    linkflags= ldr_linkflags2)

