import glob

WIN_CXX_FLAGS='-mthreads';
WIN_LIBS=Split('mingw32 mysdl_gui mysdl_audio mysdl_particles mysdl_sprites mysdl_gfx mysdl vorbisfile vorbis ogg OpenAL32 glu32 opengl32 SDL_image SDLmain SDL expatMT png');

import os;

def BuildForPlatform(platform,dist):
	env=Environment(tools=['mingw'],
									CXXFLAGS=['-march=pentium']);

	if(platform==''):
		if(env['PLATFORM']=='posix'):
			platform='linux';
		else:
			platform='win32';

	env.Clean(BUILD_TARGETS,'build/'+platform);
	env.Clean(BUILD_TARGETS,'dist/'+platform);

	if(dist=='1'):
		env.Append(CXXFLAGS=['-O3']);
		env.Append(CPPDEFINES=['MYSDL_DEBUG_INFO']);
	else:
		env.Append(CXXFLAGS=['-ggdb']);
		env.Append(CPPDEFINES=['MYSDL_DEBUG_ALL']);

	env.Append(CXXFLAGS=['-Wall']);

	if(os.access('../mysdl',os.F_OK)):
		print 'MySDL developer files found: '+platform;
		env.Append(CPPPATH='#../mysdl/dist/'+platform+'/include/');
		env.Append(LIBPATH='#../mysdl/dist/'+platform+'/lib/');

	if(env['PLATFORM']=='posix'):
		env.Append(CXXFLAGS='-ansi');

		if(platform=='win32'):
			print "Cross-compiling on posix for win32.";

			env['CC']='i586-mingw32msvc-gcc';
			env['CXX']='i586-mingw32msvc-g++';
			env['LINK']='i586-mingw32msvc-g++';
			env['AR']='i586-mingw32msvc-ar';
			env['RANLIB']='i586-mingw32msvc-ranlib';
			env['RC']='i586-mingw32msvc-windres';

			env.Append(CXXFLAGS=WIN_CXX_FLAGS);
			env.Append(LIBS=WIN_LIBS);
			env.Append(CPPDEFINES="win32");

			env.Append(CPPDEFINES='RESOURCEDIR=\\"resources/\\"');
		
			resFile=env.RES('maxfighter_res.rc');
		else:
			print "Compiling for native linux system.";
			platform='linux';

			if(dist=='0'):
				env.Append(CPPDEFINES='RESOURCEDIR=\\"resources/\\"');

			conf=Configure(env);

			if(not(conf.CheckLibWithHeader('SDL','SDL/SDL.h','c++','SDL_Init(0);'))):
					print 'SDL library required.';
					Exit(1);

			if(not(conf.CheckLibWithHeader('GL','GL/gl.h','c++','glLoadIdentity();'))):
					print 'OpenGL library required.';
					Exit(1);

			if(not(conf.CheckLibWithHeader('GLU','GL/glu.h','c++','gluPerspective(0,0,0,0);'))):
					print 'OpenGL library required.';
					Exit(1);

			if(not(conf.CheckLibWithHeader('SDL_image','SDL/SDL_image.h','c++','IMG_Load(0);'))):
					print 'SDL_image library required.';
					Exit(1);

			if(not(conf.CheckLibWithHeader('expat','expat.h','c++','XML_ParserCreate(0);'))):
					print 'eXpat library required.';
					Exit(1);

			if(not(conf.CheckLibWithHeader('openal','AL/al.h','c++','alGenBuffers(1,0);'))):
					print 'OpenAL library required.';
					Exit(1);

			env.Append(LIBS='vorbisfile');
			env.Append(LIBS='vorbis');
			env.Append(LIBS='ogg');
			
			if(not(conf.CheckLibWithHeader('mysdl','mysdl/mysdl.h','c++','mysdl::init(mysdl::ssVideo);'))):
					print 'mysdl library required.';
					Exit(1);

			env=conf.Finish();
			env.Append(LIBS='mysdl_audio');
			env.Append(LIBS='mysdl_gfx');
			env.Append(LIBS='mysdl_gui');
			env.Append(LIBS='mysdl_particles');
			env.Append(LIBS='mysdl_sprites');

			env.Append(CPPDEFINES="linux");
			resFile='';
	else:
		print "Compiling for native win32 system.";
		platform='win32';

		env.Append(CXXFLAGS=WIN_CXX_FLAGS);
		env.Append(LIBS=WIN_LIBS);
		env.Append(CPPDEFINES="win32");
		env.Append(CPPDEFINES='RESOURCEDIR=\\"resources/\\"');
		resFile=env.RES('maxfighter_res.rc');

	if(platform=='win32'):
		EXE_EXTENSION='.exe';
		DIST_DIR='dist/'+platform;
	else:
		EXE_EXTENSION='';
		DIST_DIR='dist/'+platform+"/maxfighter";

	BUILD_DIR='build/'+platform;
	LIB_DIR='lib/'+platform;

	# Prepare build
	env.BuildDir(BUILD_DIR,'src',duplicate=0);
	Export('env');
	Export('EXE_EXTENSION');
	Export('resFile');

	# Build
	SConscript([BUILD_DIR+'/SConscript']);

	# Dist
	if(dist=='1'):
		#env.Install(DIST_DIR,"def_settings.xml");
		env.Install(DIST_DIR+"/docs",glob.glob("docs/*.html"));
		env.Install(DIST_DIR+"/docs",glob.glob("docs/*.css"));
		env.Install(DIST_DIR+"/docs",glob.glob("docs/*.txt"));
		env.Install(DIST_DIR+"/docs/img",glob.glob("docs/img/*.*"));
		#env.Install(DIST_DIR+"/docs","docs/gpl.txt");
		env.Install(DIST_DIR+"/resources","resources/resources.xml");
		env.Install(DIST_DIR+"/resources/fonts/standard",glob.glob("resources/fonts/standard/*.*"));
		env.Install(DIST_DIR+"/resources/images",glob.glob("resources/images/*.png"));
		env.Install(DIST_DIR+"/resources/images",glob.glob("resources/images/*.txt"));
		env.Install(DIST_DIR+"/resources/images_hud",glob.glob("resources/images_hud/*.png"));
		env.Install(DIST_DIR+"/resources/images_hud",glob.glob("resources/images_hud/*.txt"));
		env.Install(DIST_DIR+"/resources/images_gui",glob.glob("resources/images_gui/*.png"));
		env.Install(DIST_DIR+"/resources/images_gui",glob.glob("resources/images_gui/*.txt"));
		env.Install(DIST_DIR+"/resources/music",glob.glob("resources/music/*.ogg"));
		env.Install(DIST_DIR+"/resources/music",glob.glob("resources/music/*.txt"));
		env.Install(DIST_DIR+"/resources/sounds",glob.glob("resources/sounds/*.ogg"));
		env.Install(DIST_DIR+"/resources/sounds",glob.glob("resources/sounds/*.txt"));

		if(platform=='linux'):
			env.Install(DIST_DIR,[BUILD_DIR+'/maxfighter']);
			env.Install(DIST_DIR,['packaging/linux/install.sh','packaging/linux/uninstall.sh','packaging/linux/README']);
			#env.Install(DIST_DIR,['packaging/readme.txt']);
		else:
			env.Install(DIST_DIR,[BUILD_DIR+'/maxfighter.exe']);
			env.Install(DIST_DIR,['packaging/win32/installer.nsi']);
			#env.Install(DIST_DIR,['packaging/readme.txt']);
			env.Install(DIST_DIR,['lib/win32/SDL.dll','lib/win32/SDL_image.dll','lib/win32/libpng.dll','lib/win32/zlib1.dll']);	

# Main part
SConsignFile()
dist=ARGUMENTS.get('dist','0');

if(dist=='1'):
	print "Building distribution version.";
else:
	print "Building development version.";

built=0;
if(ARGUMENTS.get('linux','0')=='1'):
	BuildForPlatform('linux',dist);
	built=built+1;

if(ARGUMENTS.get('win32','0')=='1'):
	BuildForPlatform('win32',dist);
	built=built+1;

if(built==0):
	BuildForPlatform('',dist);
