WIN_CXX_FLAGS=['-mthreads','-march=pentium'];
WIN_LIBS=Split('mingw32 vorbisfile vorbis ogg OpenAL32 glu32 opengl32 SDL_image SDLmain SDL expatMT png');

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(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.Append(CXXFLAGS=WIN_CXX_FLAGS);
			env.Append(LIBS=WIN_LIBS);
			env.Append(CPPDEFINES="win32");
		else:
			print "Compiling for native linux system.";
			platform='linux';

			conf=Configure(env);

			#if(not(conf.CheckLibWithHeader('pthread','pthread.h','c++','pthread_getspecific(0);'))):
			#		print 'pthread library required.';
			#		Exit(1);

			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);

			#if(not(conf.CheckLibWithHeader('physfs','physfs.h','c++','PHYSFS_init(0);'))):
			#		print 'PhysicsFS library required.';
			#		Exit(1);

			env=conf.Finish();
	else:
		print "Compiling for native win32 system.";
		platform='win32';

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

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

	env.Append(LIBPATH='#'+BUILD_DIR+'/');
	#env.Append(LIBS='mysdl');

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

	# Build
	SConscript([BUILD_DIR+'/SConscript']);
	SConscript([BUILD_DIR+'/audio/SConscript']);
	SConscript([BUILD_DIR+'/gfx/SConscript']);
	SConscript([BUILD_DIR+'/gui/SConscript']);
	SConscript([BUILD_DIR+'/particles/SConscript']);
	SConscript([BUILD_DIR+'/sprites/SConscript']);

	# Dist
	env.Install(DIST_DIR+'/lib',BUILD_DIR+'/libmysdl.a');

	env.Install(DIST_DIR+'/include/mysdl',['src/buildinfo.h',
																				 'src/controls.h',
																				 'src/debug.h',
																				 'src/files.h',
																				 'src/framework.h',
																					#'src/glext.h',
																				 'src/highscores.h',
																				 'src/math.h',
																				 'src/mysdl.h',
																				 'src/resources.h',
																				 'src/tools.h',
																				 'src/xml.h']);

	env.Install(DIST_DIR+'/lib',BUILD_DIR+'/libmysdl_gfx.a');

	env.Install(DIST_DIR+'/include/mysdl/gfx',['src/gfx/bitmasks.h',
																						 'src/gfx/animations.h',
																						 'src/gfx/fonts.h',
																						 'src/gfx/images.h']);

	env.Install(DIST_DIR+'/lib',BUILD_DIR+'/libmysdl_audio.a');

	env.Install(DIST_DIR+'/include/mysdl/audio',['src/audio/core.h',
																							 'src/audio/loaders.h',
																							 'src/audio/music.h',
																							 'src/audio/resources.h',
																							 'src/audio/sources.h']);

	env.Install(DIST_DIR+'/lib',BUILD_DIR+'/libmysdl_gui.a');

	env.Install(DIST_DIR+'/include/mysdl/gui',['src/gui/containers.h',
													 									 'src/gui/core.h',
													 									 'src/gui/text.h',
													 									 'src/gui/lists.h',
													 									 'src/gui/slider.h',
													 									 'src/gui/standard.h',
													 									 'src/gui/styles.h',
																						 'src/gui/xml.h']);

	env.Install(DIST_DIR+'/lib',BUILD_DIR+'/libmysdl_particles.a');

	env.Install(DIST_DIR+'/include/mysdl/particles',['src/particles/explosion.h',
																									 'src/particles/starfield.h']);

	env.Install(DIST_DIR+'/lib',BUILD_DIR+'/libmysdl_sprites.a');

	env.Install(DIST_DIR+'/include/mysdl/sprites',['src/sprites/sprites.h']);

# 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);
