# x86_64 固有のコードをビルドする
#
# (C) 2011-2014 KATO Takeshi
#


def options(x):
	conf_opt = x.get_option_group('configure options')
	conf_opt.add_option('--boot-fd',
	    action  = 'store_true',
	    default = False,
	    help    = 'create boot floppy image.')


def configure(x):
	x.env.boot_fd = x.options.boot_fd

	if x.env.boot_fd:
		x.find_program('mcopy', var='MCOPY')

	if x.options.compiler == 'clang':
		x.env.append_value('CFLAGS_KERNEL', '-mcmodel=large')
		x.env.append_value('CXXFLAGS_KERNEL', '-mcmodel=large')
		x.env.append_value('CFLAGS_MB', '-mno-sse')
		x.env.append_value('CXXFLAGS_MB', '-mno-sse')
		#x.env.append_value('LINKFLAGS_MB', '-mno-sse')
		x.env.append_value('ASFLAGS', '-c')
		x.env.append_value('STLIB', 'gcc')
		# '.code16' was not supported by clang yet
		x.env.append_value('ASFLAGS', '-no-integrated-as')
	elif x.options.compiler == 'gnu':
		x.env.append_value('CFLAGS_KERNEL', '-mcmodel=large')
		x.env.append_value('CXXFLAGS_KERNEL', '-mcmodel=large')
		x.env.append_value('ASFLAGS','-c')
		x.env.append_value('STLIB', 'gcc')
	else:
		x.fatal('unknown compiler : ' + x.options.compiler)

	x.env.append_value('CFLAGS_KERNEL', '-mno-sse')
	x.env.append_value('CFLAGS_KERNEL', '-fomit-frame-pointer')
	x.env.append_value('CFLAGS_KERNEL', '-O2')
	x.env.append_value('CXXFLAGS_KERNEL', '-fno-exceptions')
	x.env.append_value('CXXFLAGS_KERNEL', '-fno-rtti')
	x.env.append_value('CXXFLAGS_KERNEL', '-mno-sse')
	x.env.append_value('CXXFLAGS_KERNEL', '-fomit-frame-pointer')
	x.env.append_value('CXXFLAGS_KERNEL', '-O2')

	x.env.append_value('DEFINES_KERNEL', 'ARCH_ADR_BITS=64')
	x.env.append_value('DEFINES_KERNEL', 'ARCH_LE')

	x.env.append_unique('CFLAGS_KERNEL', x.env.COMMON_CFLAGS)
	x.env.append_unique('CXXFLAGS_KERNEL', x.env.COMMON_CXXFLAGS)

	x.recurse('boot')
	x.recurse('kernel')


def build(x):
	x.recurse('lib')
	x.recurse('kernel')
	x.recurse('boot')

