#
# (C) 2011 KATO Takeshi
#

VERSION = '0.0.1.0'
APPNAME = 'uniqos'

top = '.'
out = 'build'

arch_name = 'x86_64'

import os.path

def configure_x86_64(x):
	x.env.arch_name = arch_name

	x.recurse('arch')

	x.env.CFLAGS = [
	    '-pipe', '-Wall', '-Wextra',
	]
	x.env.CXXFLAGS = [
	    '-pipe', '-Wall', '-Wextra',
	]

	x.env.DEFINES_SETUP = [
	    'ARCH_LE',
	]
	x.env.CFLAGS_SETUP = [
	    '-mno-sse',
	    '-fomit-frame-pointer', '-Os',
	]
	x.env.CXXFLAGS_SETUP = [
	    '-fno-exceptions', '-fno-rtti',
	    '-mno-sse',
	    '-fomit-frame-pointer',
	    '-Os',
	]

	x.env.DEFINES_KERNEL = [
	    'ARCH_LE',
	]
	x.env.CFLAGS_KERNEL = [
	    '-mno-sse',
	    '-fomit-frame-pointer', '-O2',
	]
	x.env.CXXFLAGS_KERNEL = [
	    '-fno-exceptions', '-fno-rtti',
	    '-mno-sse',
#	    '-fomit-frame-pointer',
	    '-O2',
	]

	conf = x
	if conf.options.compiler == 'clang':
		conf.env.append_value('CFLAGS_KERNEL', '-mcmodel=large')
		conf.env.append_value('CXXFLAGS_KERNEL', '-mcmodel=large')
		conf.env.append_value('LINKFLAGS_KERNEL', '-native')
		conf.find_program('clang', var='CC')
		conf.find_program('clang++', var='CXX')
		conf.find_program('clang', var='AS')
		conf.env.append_value('ASFLAGS', '-c')
		conf.env.LINK_PASS = ''

	elif conf.options.compiler == 'llvm':
		conf.env.CFLAGS_KERNEL.append('-emit-llvm')
		conf.env.CXXFLAGS_KERNEL.append('-emit-llvm')
		#conf.env.CFLAGS_KERNEL.append('-code-model=large')
		#conf.env.CXXFLAGS_KERNEL.append('-code-model=large')
		conf.find_program('llvm-gcc', var='CC')
		conf.find_program('llvm-g++', var='CXX')
		conf.find_program('llvm-ld', var='LINK_CC')
		conf.env.LINK_CXX = conf.env.LINK_CC
		conf.env.LINKFLAGS = ['-code-model=large', '-native']
		conf.env.LINK_PASS = '-Xlinker='

	elif conf.options.compiler == 'gnu':
		conf.env.append_value('CFLAGS_KERNEL', '-mcmodel=large')
		conf.env.append_value('CXXFLAGS_KERNEL', '-mcmodel=large')
		conf.env.append_value('LINKFLAGS_MB', '-lgcc')
		conf.find_program('gcc', var='CC')
		conf.find_program('g++', var='CXX')
		conf.find_program('gcc', var='AS')
		conf.env.append_value('ASFLAGS','-c')
		conf.env.LINK_PASS = ''

	else:
		conf.fatal('unknown compiler : ' + conf.options.compiler)

def options(x):
	x.load('compiler_c')
	x.load('compiler_cxx')
	x.load('gcc gas')

	conf_opt = x.get_option_group('configure options')
	conf_opt.add_option('--compiler',
	    default = 'clang',
	    action  = 'store',
	    help    = 'compiler family (clang, llvm, gnu)')

	debug_opt = x.add_option_group('debug options')
	debug_opt.add_option('--debug',
	    dest    = 'debug_all',
	    default = False,
	    action  = 'store_true',
	    help    = 'enable all debug options')

	x.recurse('arch')

def def_config(x, config, name, default_val):
	if name in config:
		x.define('CONFIG_'+name, config[name])
	elif default_val != None:
		x.define('CONFIG_'+name, default_val)

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

	configure_x86_64(x)

	x.load('compiler_c')
	x.load('compiler_cxx')
	x.load('gcc gas')

	config = dict()
	if os.path.isfile('config'):
		execfile('config', config)

	def_config(x, config, 'DEBUG', 0)
	def_config(x, config, 'MAX_CPUS', 1)
	def_config(x, config, 'PREEMPT', 1)

	x.write_config_header('include/config.h')


def build(x):
	x.env.append_value('INCLUDES', '#include')
	x.env.append_value('INCLUDES', '#arch/'+arch_name+'/include')

	x.recurse('kernel')
	x.recurse('arch')

