Slightly optimize uploading D3DFMT_A8R8G8B8 data to textures.
[dolphin.git] / SConstruct
blob403cf36e577fdad3000e5548cdfe195205458748
1 # -*- python -*-
3 import os
4 import sys
5 import platform
7 # Home made tests
8 sys.path.append('SconsTests')
9 import wxconfig
10 import utils
12 # Some features needs at least scons 0.98
13 EnsureSConsVersion(1, 2)
15 # TODO: how do we use it in help?
16 name="Dolphin"
17 version="SVN"
18 description="A wii/gamecube emulator"
19 license="GPL v2"
21 warnings = [
22 'all',
23 'write-strings',
24 'shadow',
25 'pointer-arith',
26 'packed',
27 'no-conversion',
29 compileFlags = [
30 '-fno-exceptions',
31 '-fno-strict-aliasing',
32 '-msse2',
35 cppDefines = [
36 ( '_FILE_OFFSET_BITS', 64),
37 '_LARGEFILE_SOURCE',
38 'GCC_HASCLASSVISIBILITY',
41 basedir = os.getcwd()+ '/'
43 include_paths = [
44 basedir + 'Source/Core/Common/Src',
45 basedir + 'Source/Core/DiscIO/Src',
46 basedir + 'Source/PluginSpecs',
47 basedir + 'Source/Core/Core/Src',
48 basedir + 'Source/Core/DebuggerWX/Src',
49 basedir + 'Externals/Bochs_disasm',
50 basedir + 'Externals/Lua',
51 basedir + 'Externals/WiiUseSrc/Src',
52 basedir + 'Source/Core/VideoCommon/Src',
53 basedir + 'Source/Core/InputCommon/Src',
54 basedir + 'Source/Plugins/InputPluginCommon/Src',
55 basedir + 'Source/Core/AudioCommon/Src',
56 basedir + 'Source/Core/DebuggerUICommon/Src',
57 basedir + 'Source/Core/DSPCore/Src',
60 dirs = [
61 'Externals/Bochs_disasm',
62 'Externals/Lua',
63 'Externals/WiiUseSrc/Src',
64 'Source/Core/Common/Src',
65 'Source/Core/Core/Src',
66 'Source/Core/DiscIO/Src',
67 'Source/Core/VideoCommon/Src',
68 'Source/Core/InputCommon/Src',
69 'Source/Core/AudioCommon/Src',
70 'Source/Core/DebuggerUICommon/Src',
71 'Source/Core/DSPCore/Src',
72 'Source/DSPTool/Src',
73 'Source/Plugins/Plugin_VideoOGL/Src',
74 'Source/Plugins/Plugin_VideoSoftware/Src',
75 'Source/Plugins/Plugin_DSP_HLE/Src',
76 'Source/Plugins/Plugin_DSP_LLE/Src',
77 'Source/Plugins/Plugin_GCPad/Src',
78 'Source/Plugins/Plugin_GCPadNew/Src',
79 'Source/Plugins/Plugin_Wiimote/Src',
80 'Source/Core/DolphinWX/Src',
81 'Source/Core/DebuggerWX/Src',
82 'Source/UnitTests/',
83 'Source/Plugins/InputPluginCommon/Src/',
84 'Source/Plugins/Plugin_WiimoteNew/Src/',
87 builders = {}
88 if sys.platform == 'darwin':
89 from plistlib import writePlist
90 def createPlist(target, source, env):
91 properties = {}
92 for srcNode in source:
93 properties.update(srcNode.value)
94 for dstNode in target:
95 writePlist(properties, str(dstNode))
96 builders['Plist'] = Builder(action = createPlist)
98 # handle command line options
99 vars = Variables('args.cache')
101 vars.AddVariables(
102 BoolVariable('verbose', 'Set for compilation line', False),
103 BoolVariable('bundle', 'Set to create bundle', False),
104 BoolVariable('lint', 'Set for lint build (extra warnings)', False),
105 BoolVariable('nowx', 'Set For Building with no WX libs (WIP)', False),
106 BoolVariable('openal', 'Build with OpenAL', False),
107 BoolVariable('noao', 'Build without AO', False),
108 BoolVariable('wxgl', 'Set For Building with WX GL libs (WIP)', False),
109 BoolVariable('opencl', 'Build with OpenCL', False),
110 BoolVariable('nojit', 'Remove entire jit cores', False),
111 BoolVariable('shared_soil', 'Use system shared libSOIL', False),
112 BoolVariable('shared_lzo', 'Use system shared liblzo2', False),
113 BoolVariable('shared_sfml', 'Use system shared libsfml-network', False),
114 PathVariable('userdir', 'Set the name of the user data directory in home', '.dolphin-emu', PathVariable.PathAccept),
115 EnumVariable('install', 'Choose a local or global installation', 'local',
116 allowed_values = ('local', 'global'),
117 ignorecase = 2
119 PathVariable('prefix', 'Installation prefix (only used for a global build)', '/usr', PathVariable.PathAccept),
120 PathVariable('destdir', 'Temporary install location (for package building)', None, PathVariable.PathAccept),
121 EnumVariable('flavor', 'Choose a build flavor', 'release',
122 allowed_values = ('release', 'devel', 'debug', 'fastlog', 'prof'),
123 ignorecase = 2
125 PathVariable('wxconfig', 'Path to the wxconfig', None),
126 EnumVariable('pgo', 'Profile-Guided Optimization (generate or use)', 'none',
127 allowed_values = ('none', 'generate', 'use'),
128 ignorecase = 2
130 ('CC', 'The c compiler', 'gcc'),
131 ('CXX', 'The c++ compiler', 'g++'),
134 if sys.platform == 'win32':
135 env = Environment(
136 CPPPATH = include_paths,
137 RPATH = [],
138 LIBS = [],
139 LIBPATH = [],
140 tools = [ 'mingw' ],
141 variables = vars,
142 ENV = os.environ,
143 BUILDERS = builders,
144 DESCRIPTION = description,
145 SUMMARY = description,
146 LICENSE = license,
147 NAME = name,
148 VERSION = version,
150 else:
151 env = Environment(
152 CPPPATH = include_paths,
153 RPATH = [],
154 LIBS = [],
155 LIBPATH = [],
156 variables = vars,
157 ENV = {
158 'PATH' : os.environ['PATH'],
159 'HOME' : os.environ['HOME']
161 BUILDERS = builders,
162 DESCRIPTION = description,
163 SUMMARY = description,
164 LICENSE = license,
165 NAME = name,
166 VERSION = version,
169 # save the given command line options
170 vars.Save('args.cache', env)
172 # verbose compile
173 if not env['verbose']:
174 env['CCCOMSTR'] = "Compiling $TARGET"
175 env['CXXCOMSTR'] = "Compiling $TARGET"
176 env['ARCOMSTR'] = "Archiving $TARGET"
177 env['LINKCOMSTR'] = "Linking $TARGET"
178 env['ASCOMSTR'] = "Assembling $TARGET"
179 env['ASPPCOMSTR'] = "Assembling $TARGET"
180 env['SHCCCOMSTR'] = "Compiling shared $TARGET"
181 env['SHCXXCOMSTR'] = "Compiling shared $TARGET"
182 env['SHLINKCOMSTR'] = "Linking shared $TARGET"
183 env['RANLIBCOMSTR'] = "Indexing $TARGET"
185 # build flavor
186 flavour = env['flavor']
187 if (flavour == 'debug'):
188 compileFlags.append('-ggdb')
189 cppDefines.append('_DEBUG') #enables LOGGING
190 # FIXME: this disable wx debugging how do we make it work?
191 cppDefines.append('NDEBUG')
192 elif (flavour == 'devel'):
193 compileFlags.append('-ggdb')
194 elif (flavour == 'fastlog'):
195 compileFlags.append('-O3')
196 cppDefines.append('DEBUGFAST')
197 elif (flavour == 'prof'):
198 compileFlags.append('-O3')
199 compileFlags.append('-ggdb')
200 elif (flavour == 'release'):
201 compileFlags.append('-O3')
202 compileFlags.append('-fomit-frame-pointer');
203 # XXX please test -Werror builds on Linux and Windows and remove this condition
204 if sys.platform == 'darwin':
205 warnings.append('error')
206 # more warnings
207 if env['lint']:
208 warnings.append('unreachable-code')
209 warnings.append('float-equal')
211 # add the warnings to the compile flags
212 compileFlags += [ ('-W' + warning) for warning in warnings ]
214 env['CCFLAGS'] = compileFlags
215 if sys.platform == 'win32':
216 env['CXXFLAGS'] = compileFlags
217 else:
218 env['CXXFLAGS'] = compileFlags + [ '-fvisibility-inlines-hidden' ]
219 env['CPPDEFINES'] = cppDefines
221 # pgo - Profile Guided Optimization
222 if env['pgo']=='generate':
223 compileFlags.append('-fprofile-generate')
224 env['LINKFLAGS']='-fprofile-generate'
225 if env['pgo']=='use':
226 compileFlags.append('-fprofile-use')
227 env['LINKFLAGS']='-fprofile-use'
230 # Configuration tests section
231 tests = {'CheckWXConfig' : wxconfig.CheckWXConfig,
232 'CheckPKGConfig' : utils.CheckPKGConfig,
233 'CheckPKG' : utils.CheckPKG,
234 'CheckSDL' : utils.CheckSDL,
235 'CheckFink' : utils.CheckFink,
236 'CheckMacports' : utils.CheckMacports,
237 'CheckPortaudio' : utils.CheckPortaudio,
240 #object files
241 env['build_dir'] = os.path.join(basedir, 'Build', platform.system() + '-' + platform.machine() + '-' + env['flavor'] + os.sep)
243 # Static libs go here
244 env['local_libs'] = env['build_dir'] + os.sep + 'libs' + os.sep
246 # Where do we run from
247 env['base_dir'] = os.getcwd()+ '/'
249 # install paths
250 extra=''
251 if flavour == 'debug':
252 extra = '-debug'
253 elif flavour == 'prof':
254 extra = '-prof'
256 # Set up the install locations
257 if (env['install'] == 'global'):
258 env['prefix'] = os.path.join(env['prefix'] + os.sep)
259 env['binary_dir'] = env['prefix'] + 'bin/'
260 env['plugin_dir'] = env['prefix'] + 'lib/dolphin-emu/'
261 env['data_dir'] = env['prefix'] + "share/dolphin-emu/"
262 else:
263 env['prefix'] = os.path.join(env['base_dir'] + 'Binary', platform.system() + '-' + platform.machine() + extra + os.sep)
264 env['binary_dir'] = env['prefix']
265 env['plugin_dir'] = env['prefix'] + 'plugins/'
266 env['data_dir'] = env['prefix']
267 if sys.platform == 'darwin':
268 env['plugin_dir'] = env['prefix'] + 'Dolphin.app/Contents/PlugIns/'
269 env['data_dir'] = env['prefix'] + 'Dolphin.app/Contents/'
271 env['LIBPATH'].append(env['local_libs'])
273 conf = env.Configure(custom_tests = tests,
274 config_h="Source/Core/Common/Src/Config.h")
276 if not conf.CheckPKGConfig('0.15.0'):
277 print "Can't find pkg-config, some tests will fail"
279 # find ports/fink for library and include path
280 if sys.platform == 'darwin':
281 #ports usually has newer versions
282 conf.CheckMacports()
283 conf.CheckFink()
285 env['HAVE_SDL'] = conf.CheckSDL('1.0.0')
287 # Bluetooth for wii support
288 env['HAVE_BLUEZ'] = conf.CheckPKG('bluez')
290 # needed for sound
291 env['HAVE_AO'] = 0
292 if not env['noao']:
293 env['HAVE_AO'] = conf.CheckPKG('ao')
295 env['HAVE_OPENAL'] = 0
296 if env['openal']:
297 env['HAVE_OPENAL'] = conf.CheckPKG('openal')
299 env['HAVE_ALSA'] = conf.CheckPKG('alsa')
301 env['HAVE_PULSEAUDIO'] = 0
302 #env['HAVE_PULSEAUDIO'] = conf.CheckPKG('libpulse')
304 # OpenCL
305 env['HAVE_OPENCL'] = 0
306 if env['opencl']:
307 env['HAVE_OPENCL'] = conf.CheckPKG('OpenCL')
309 env['HAVE_PORTAUDIO'] = 0
310 if sys.platform != 'darwin':
311 # needed for mic
312 env['HAVE_PORTAUDIO'] = conf.CheckPortaudio(1890)
314 # SOIL
315 env['SHARED_SOIL'] = 0;
316 if env['shared_soil']:
317 env['SHARED_SOIL'] = conf.CheckPKG('SOIL')
318 if not env['SHARED_SOIL']:
319 print "shared SOIL library not detected"
320 print "falling back to the static library"
321 if not env['SHARED_SOIL']:
322 env['CPPPATH'] += [ basedir + 'Externals/SOIL' ]
323 dirs += ['Externals/SOIL']
325 # LZO
326 env['SHARED_LZO'] = 0;
327 if env['shared_lzo']:
328 env['SHARED_LZO'] = conf.CheckPKG('lzo2')
329 if not env['SHARED_LZO']:
330 print "shared LZO library not detected"
331 print "falling back to the static library"
332 if not env['SHARED_LZO']:
333 env['CPPPATH'] += [ basedir + 'Externals/LZO' ]
334 dirs += ['Externals/LZO']
336 # SFML
337 env['SHARED_SFML'] = 0;
338 if env['shared_sfml']:
339 # TODO: Check the version of sfml. It should be at least version 1.5
340 env['SHARED_SFML'] = conf.CheckPKG('sfml-network') and conf.CheckCXXHeader("SFML/Network/Ftp.hpp")
341 if not env['SHARED_SFML']:
342 print "shared sfml-network library not detected"
343 print "falling back to the static library"
344 if not env['SHARED_SFML']:
345 env['CPPPATH'] += [ basedir + 'Externals/SFML/include' ]
346 dirs += ['Externals/SFML/src']
348 #osx specifics
349 if sys.platform == 'darwin':
350 compileFlags.append('-mmacosx-version-min=10.5')
351 env['HAVE_COCOA'] = 1
352 env['HAVE_XRANDR'] = 0
353 env['HAVE_X11'] = 0
354 env['CC'] = "gcc-4.2"
355 env['CXX'] = "g++-4.2"
356 env['CFLAGS'] += ['-arch' , 'x86_64' , '-arch' , 'i386']
357 env['CXXFLAGS'] += ['-arch' , 'x86_64' , '-arch' , 'i386']
358 env['LINKFLAGS'] += ['-arch' , 'x86_64' , '-arch' , 'i386']
359 conf.Define('MAP_32BIT', 0)
360 else:
361 env['HAVE_X11'] = conf.CheckPKG('x11')
362 env['HAVE_XRANDR'] = env['HAVE_X11'] and conf.CheckPKG('xrandr')
363 env['HAVE_COCOA'] = 0
365 # handling wx flags CCFLAGS should be created before
366 wxmods = ['aui', 'adv', 'core', 'base']
368 env['USE_WX'] = 0
369 if env['wxgl']:
370 wxmods.append('gl')
371 env['USE_WX'] = 1
373 if sys.platform == 'win32':
374 env['HAVE_WX'] = 1
375 env['USE_WX'] = 1
377 # Gui less build
378 if env['nowx']:
379 env['HAVE_WX'] = 0;
380 else:
381 if sys.platform == 'darwin':
382 # 2.9 is needed for 64-bit support on OS X
383 env['HAVE_WX'] = conf.CheckWXConfig('2.9', wxmods, 0)
384 else:
385 env['HAVE_WX'] = conf.CheckWXConfig('2.8', wxmods, 0)
387 # check for libgtk2.0
388 env['HAVE_GTK2'] = 0
389 if sys.platform == 'linux2':
390 env['HAVE_GTK2'] = env['HAVE_WX'] and conf.CheckPKG('gtk+-2.0')
391 if env['HAVE_WX'] and not env['HAVE_GTK2']:
392 print "gtk+-2.0 developement headers not detected"
393 print "gtk+-2.0 is required to build the WX GUI"
394 Exit(1)
396 env['NOJIT'] = 0
397 if env['nojit']:
398 env['NOJIT'] = 1
400 conf.Define('NOJIT', env['NOJIT'])
402 # Creating config.h defines
403 conf.Define('HAVE_SDL', env['HAVE_SDL'])
404 conf.Define('HAVE_BLUEZ', env['HAVE_BLUEZ'])
405 conf.Define('HAVE_AO', env['HAVE_AO'])
406 conf.Define('HAVE_OPENCL', env['HAVE_OPENCL'])
407 conf.Define('HAVE_OPENAL', env['HAVE_OPENAL'])
408 conf.Define('HAVE_ALSA', env['HAVE_ALSA'])
409 conf.Define('HAVE_WX', env['HAVE_WX'])
410 conf.Define('USE_WX', env['USE_WX'])
411 conf.Define('HAVE_X11', env['HAVE_X11'])
412 conf.Define('HAVE_XRANDR', env['HAVE_XRANDR'])
413 conf.Define('HAVE_COCOA', env['HAVE_COCOA'])
414 conf.Define('HAVE_PORTAUDIO', env['HAVE_PORTAUDIO'])
415 conf.Define('SHARED_SOIL', env['SHARED_SOIL'])
416 conf.Define('SHARED_LZO', env['SHARED_LZO'])
417 conf.Define('SHARED_SFML', env['SHARED_SFML'])
418 conf.Define('USER_DIR', "\"" + env['userdir'] + "\"")
419 if (env['install'] == 'global'):
420 conf.Define('DATA_DIR', "\"" + env['data_dir'] + "\"")
421 conf.Define('LIBS_DIR', "\"" + env['prefix'] + 'lib/' + "\"")
423 # lua
424 env['LUA_USE_MACOSX'] = 0
425 env['LUA_USE_LINUX'] = 0
426 env['LUA_USE_POSIX'] = 0
427 if sys.platform == 'darwin':
428 env['LUA_USE_MACOSX'] = 1
429 elif sys.platform == 'linux2':
430 env['LUA_USE_LINUX'] = 1
432 conf.Define('LUA_USE_MACOSX', env['LUA_USE_MACOSX'])
433 conf.Define('LUA_USE_LINUX', env['LUA_USE_LINUX'])
435 # profile
436 env['USE_OPROFILE'] = 0
437 if (flavour == 'prof'):
438 proflibs = [ '/usr/lib/oprofile', '/usr/local/lib/oprofile' ]
439 env['LIBPATH'].append(proflibs)
440 env['RPATH'].append(proflibs)
441 if conf.CheckPKG('opagent'):
442 env['USE_OPROFILE'] = 1
443 else:
444 print "Can't build prof without oprofile, disabling"
446 conf.Define('USE_OPROFILE', env['USE_OPROFILE'])
447 # After all configuration tests are done
448 conf.Finish()
450 #wx windows flags
451 if env['HAVE_WX']:
452 wxconfig.ParseWXConfig(env)
453 else:
454 print "WX not found or disabled, not building GUI"
456 # add methods from utils to env
457 env.AddMethod(utils.filterWarnings)
459 rev = utils.GenerateRevFile(env['flavor'],
460 "Source/Core/Common/Src/svnrev_template.h",
461 "Source/Core/Common/Src/svnrev.h")
462 # print a nice progress indication when not compiling
463 Progress(['-\r', '\\\r', '|\r', '/\r'], interval = 5)
465 # Setup destdir for package building
466 # Warning: The program will not run from this location. It is assumed the
467 # package will later install it to the prefix as it was defined before this.
468 if env.has_key('destdir'):
469 env['prefix'] = env['destdir'] + env['prefix']
470 env['plugin_dir'] = env['destdir'] + env['plugin_dir']
471 env['binary_dir'] = env['destdir'] + env['binary_dir']
472 env['data_dir'] = env['destdir'] + env['data_dir']
474 # die on unknown variables
475 unknown = vars.UnknownVariables()
476 if unknown:
477 print "Unknown variables:", unknown.keys()
478 Exit(1)
480 # generate help
481 Help(vars.GenerateHelpText(env))
483 Export('env')
485 for subdir in dirs:
486 SConscript(
487 subdir + os.sep + 'SConscript',
488 variant_dir = env[ 'build_dir' ] + subdir + os.sep,
489 duplicate=0
492 # Data install
493 if sys.platform == 'darwin':
494 env.Install(env['data_dir'], 'Data/Sys')
495 env.Install(env['data_dir'], 'Data/User')
496 env.Install(env['binary_dir'] + 'Dolphin.app/Contents/Resources/',
497 'Source/Core/DolphinWX/resources/Dolphin.icns')
498 else:
499 env.InstallAs(env['data_dir'] + 'sys', 'Data/Sys')
500 env.InstallAs(env['data_dir'] + 'user', 'Data/User')
502 env.Alias('install', env['prefix'])
504 if env['bundle']:
505 if sys.platform == 'linux2':
506 # Make tar ball (TODO put inside normal dir)
507 tar_env = env.Clone()
508 tarball = tar_env.Tar('dolphin-'+rev +'.tar.bz2', env['prefix'])
509 tar_env.Append(TARFLAGS='-j', TARCOMSTR="Creating release tarball")
510 elif sys.platform == 'darwin':
511 env.Command('.', env['binary_dir'] +
512 'Dolphin.app/Contents/MacOS/Dolphin', './osx_make_dmg.sh')
514 #TODO clean all bundles
515 #env.Clean(all, 'dolphin-*' + '.tar.bz2')
516 #env.Clean(all, 'Binary/Dolphin-r*' + '.dmg')