DX11:
[dolphin.git] / SConstruct
blob9725098f146122a21e78f07949a18b5321a49657
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 need at least SCons 1.2
13 EnsureSConsVersion(1, 2)
15 warnings = [
16 'all',
17 'write-strings',
18 'shadow',
19 'pointer-arith',
20 'packed',
21 'no-conversion',
24 compileFlags = [
25 '-fno-exceptions',
26 '-fno-strict-aliasing',
27 '-msse2',
28 '-fPIC',
31 cppDefines = [
32 ( '_FILE_OFFSET_BITS', 64),
33 '_LARGEFILE_SOURCE',
34 'GCC_HASCLASSVISIBILITY',
37 basedir = os.getcwd() + '/'
39 include_paths = [
40 basedir + 'Source/Core/Common/Src',
41 basedir + 'Source/Core/DiscIO/Src',
42 basedir + 'Source/PluginSpecs',
43 basedir + 'Source/Core/Core/Src',
44 basedir + 'Source/Core/DebuggerWX/Src',
45 basedir + 'Externals/Bochs_disasm',
46 basedir + 'Externals/Lua',
47 basedir + 'Externals/WiiUseSrc/Src',
48 basedir + 'Source/Core/VideoCommon/Src',
49 basedir + 'Source/Core/InputCommon/Src',
50 basedir + 'Source/Core/InputUICommon/Src',
51 basedir + 'Source/Core/AudioCommon/Src',
52 basedir + 'Source/Core/DebuggerUICommon/Src',
53 basedir + 'Source/Core/DolphinWX/Src',
54 basedir + 'Source/Core/DSPCore/Src',
57 dirs = [
58 'Externals/Bochs_disasm',
59 'Externals/Lua',
60 'Externals/MemcardManager',
61 'Externals/WiiUseSrc/Src',
62 'Source/Core/Common/Src',
63 'Source/Core/Core/Src',
64 'Source/Core/DiscIO/Src',
65 'Source/Core/VideoCommon/Src',
66 'Source/Core/InputCommon/Src',
67 'Source/Core/AudioCommon/Src',
68 'Source/Core/DebuggerUICommon/Src',
69 'Source/Core/DSPCore/Src',
70 'Source/DSPTool/Src',
71 'Source/Core/InputUICommon/Src/',
72 'Source/Plugins/Plugin_VideoOGL/Src',
73 'Source/Plugins/Plugin_VideoSoftware/Src',
74 'Source/Plugins/Plugin_DSP_HLE/Src',
75 'Source/Plugins/Plugin_DSP_LLE/Src',
76 'Source/Plugins/Plugin_Wiimote/Src',
77 'Source/Plugins/Plugin_WiimoteNew/Src/',
78 'Source/Core/DolphinWX/Src',
79 'Source/Core/DebuggerWX/Src',
80 'Source/UnitTests/',
83 builders = {}
84 if sys.platform == 'darwin':
85 from plistlib import writePlist
86 def createPlist(target, source, env):
87 properties = {}
88 for srcNode in source:
89 properties.update(srcNode.value)
90 for dstNode in target:
91 writePlist(properties, str(dstNode))
92 builders['Plist'] = Builder(action = createPlist)
94 # Handle command line options
95 vars = Variables('args.cache')
97 vars.AddVariables(
98 BoolVariable('verbose', 'Set for compilation line', False),
99 BoolVariable('bundle', 'Set to create bundle', False),
100 BoolVariable('lint', 'Set for lint build (extra warnings)', False),
101 BoolVariable('nowx', 'Set for building with no WX libs', False),
102 BoolVariable('wxgl', 'Set for building with WX GL on Linux', False),
103 BoolVariable('opencl', 'Build with OpenCL', False),
104 BoolVariable('nojit', 'Remove entire jit cores', False),
105 BoolVariable('shared_glew', 'Use system shared libGLEW', True),
106 BoolVariable('shared_lzo', 'Use system shared liblzo2', True),
107 BoolVariable('shared_sdl', 'Use system shared libSDL', True),
108 BoolVariable('shared_sfml', 'Use system shared libsfml-network', True),
109 BoolVariable('shared_soil', 'Use system shared libSOIL', True),
110 BoolVariable('shared_zlib', 'Use system shared libz', True),
111 PathVariable('userdir', 'Set the name of the user data directory in home',
112 '.dolphin-emu', PathVariable.PathAccept),
113 EnumVariable('install', 'Choose a local or global installation', 'local',
114 allowed_values = ('local', 'global'),
115 ignorecase = 2
117 PathVariable('prefix', 'Installation prefix (only used for a global build)',
118 '/usr', PathVariable.PathAccept),
119 PathVariable('destdir', 'Temporary install location (for package building)',
120 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 env = Environment(
135 CPPPATH = include_paths,
136 RPATH = [],
137 LIBS = [],
138 LIBPATH = [],
139 BUILDERS = builders,
140 variables = vars,
143 if sys.platform == 'win32':
144 env['tools'] = ['mingw']
145 env['ENV'] = os.environ
146 else:
147 env['ENV'] = {
148 'PATH' : os.environ['PATH'],
149 'HOME' : os.environ['HOME'],
150 'PKG_CONFIG_PATH' : os.environ.get('PKG_CONFIG_PATH')
153 # Save the given command line options
154 vars.Save('args.cache', env)
156 # Verbose compile
157 if not env['verbose']:
158 env['CCCOMSTR'] = "Compiling $TARGET"
159 env['CXXCOMSTR'] = "Compiling $TARGET"
160 env['ARCOMSTR'] = "Archiving $TARGET"
161 env['LINKCOMSTR'] = "Linking $TARGET"
162 env['ASCOMSTR'] = "Assembling $TARGET"
163 env['ASPPCOMSTR'] = "Assembling $TARGET"
164 env['SHCCCOMSTR'] = "Compiling shared $TARGET"
165 env['SHCXXCOMSTR'] = "Compiling shared $TARGET"
166 env['SHLINKCOMSTR'] = "Linking shared $TARGET"
167 env['RANLIBCOMSTR'] = "Indexing $TARGET"
169 # Build flavor
170 flavour = env['flavor']
171 if (flavour == 'debug'):
172 compileFlags.append('-ggdb')
173 cppDefines.append('_DEBUG') #enables LOGGING
174 # FIXME: this disable wx debugging how do we make it work?
175 cppDefines.append('NDEBUG')
176 elif (flavour == 'devel'):
177 compileFlags.append('-ggdb')
178 elif (flavour == 'fastlog'):
179 compileFlags.append('-O3')
180 cppDefines.append('DEBUGFAST')
181 elif (flavour == 'prof'):
182 compileFlags.append('-O3')
183 compileFlags.append('-ggdb')
184 elif (flavour == 'release'):
185 compileFlags.append('-O3')
186 compileFlags.append('-fomit-frame-pointer');
187 # More warnings
188 if env['lint']:
189 warnings.append('error')
190 # Should check for the availability of these (in GCC 4.3 or newer)
191 if sys.platform != 'darwin':
192 warnings.append('no-array-bounds')
193 warnings.append('no-unused-result')
194 # wxWidgets causes too many warnings with these
195 #warnings.append('unreachable-code')
196 #warnings.append('float-equal')
198 # Add the warnings to the compile flags
199 compileFlags += [ ('-W' + warning) for warning in warnings ]
201 env['CCFLAGS'] = compileFlags
202 if sys.platform == 'win32':
203 env['CXXFLAGS'] = compileFlags
204 else:
205 env['CXXFLAGS'] = compileFlags + [ '-fvisibility-inlines-hidden' ]
206 env['CPPDEFINES'] = cppDefines
208 # PGO - Profile Guided Optimization
209 if env['pgo']=='generate':
210 compileFlags.append('-fprofile-generate')
211 env['LINKFLAGS']='-fprofile-generate'
212 if env['pgo']=='use':
213 compileFlags.append('-fprofile-use')
214 env['LINKFLAGS']='-fprofile-use'
216 # Configuration tests section
217 tests = {'CheckWXConfig' : wxconfig.CheckWXConfig,
218 'CheckPKGConfig' : utils.CheckPKGConfig,
219 'CheckPKG' : utils.CheckPKG,
220 'CheckSDL' : utils.CheckSDL,
221 'CheckPortaudio' : utils.CheckPortaudio,
224 # Object files
225 env['build_dir'] = os.path.join(basedir, 'Build',
226 platform.system() + '-' + platform.machine() + '-' + env['flavor'] + os.sep)
228 # Static libs go here
229 env['local_libs'] = env['build_dir'] + os.sep + 'libs' + os.sep
231 # Where do we run from
232 env['base_dir'] = os.getcwd()+ '/'
234 # Install paths
235 extra=''
236 if flavour == 'debug':
237 extra = '-debug'
238 elif flavour == 'prof':
239 extra = '-prof'
241 # Set up the install locations
242 if (env['install'] == 'global'):
243 env['prefix'] = os.path.join(env['prefix'] + os.sep)
244 env['binary_dir'] = env['prefix'] + 'bin/'
245 env['plugin_dir'] = env['prefix'] + 'lib/dolphin-emu/'
246 env['data_dir'] = env['prefix'] + "share/dolphin-emu/"
247 else:
248 env['prefix'] = os.path.join(env['base_dir'] + 'Binary',
249 platform.system() + '-' + platform.machine() + extra + os.sep)
250 env['binary_dir'] = env['prefix']
251 env['plugin_dir'] = env['prefix'] + 'plugins/'
252 env['data_dir'] = env['prefix']
253 if sys.platform == 'darwin':
254 env['plugin_dir'] = env['prefix'] + 'Dolphin.app/Contents/PlugIns/'
255 env['data_dir'] = env['prefix'] + 'Dolphin.app/Contents/'
257 conf = env.Configure(custom_tests = tests,
258 config_h="Source/Core/Common/Src/Config.h")
260 env['HAVE_OPENCL'] = 0
261 if env['opencl']:
262 env['HAVE_OPENCL'] = conf.CheckPKG('OpenCL')
264 # OS X specifics
265 if sys.platform == 'darwin':
266 # OpenCL is new in OS X 10.6. Other than OpenCL,
267 # we try to maintain 10.5 compatibility, however.
268 if not env['HAVE_OPENCL']:
269 compileFlags += ['-isysroot', '/Developer/SDKs/MacOSX10.5.sdk']
270 compileFlags += ['-mmacosx-version-min=10.5']
271 conf.Define('MAP_32BIT', 0)
272 env['CC'] = "gcc-4.2"
273 env['CFLAGS'] = ['-x', 'objective-c']
274 env['CXX'] = "g++-4.2"
275 env['CXXFLAGS'] = ['-x', 'objective-c++']
276 env['CCFLAGS'] += ['-arch' , 'x86_64' , '-arch' , 'i386']
277 env['LINKFLAGS'] += ['-arch', 'x86_64' , '-arch' , 'i386']
278 env['FRAMEWORKS'] += ['CoreFoundation', 'CoreServices']
279 env['FRAMEWORKS'] += ['IOBluetooth', 'IOKit', 'OpenGL']
280 env['FRAMEWORKS'] += ['AudioUnit', 'CoreAudio']
281 else:
282 if not conf.CheckPKGConfig('0.15.0'):
283 print "Can't find pkg-config, some tests will fail"
285 shared = {}
286 shared['glew'] = shared['lzo'] = shared['sdl'] = \
287 shared['soil'] = shared['sfml'] = shared['zlib'] = 0
288 if not sys.platform == 'darwin':
289 if env['shared_glew']:
290 shared['glew'] = conf.CheckPKG('GLEW')
291 if env['shared_sdl']:
292 shared['sdl'] = conf.CheckPKG('SDL')
293 if env['shared_zlib']:
294 shared['zlib'] = conf.CheckPKG('z')
295 if env['shared_lzo']:
296 shared['lzo'] = conf.CheckPKG('lzo2')
297 # TODO: Check the version of sfml. It should be at least version 1.5
298 if env['shared_sfml']:
299 shared['sfml'] = conf.CheckPKG('sfml-network') and \
300 conf.CheckCXXHeader("SFML/Network/Ftp.hpp")
301 if env['shared_soil']:
302 shared['soil'] = conf.CheckPKG('SOIL')
303 for lib in shared:
304 if not shared[lib]:
305 print "Shared library " + lib + " not detected, " \
306 "falling back to the static library"
308 if shared['glew'] == 0:
309 env['CPPPATH'] += [basedir + 'Externals/GLew/include']
310 dirs += ['Externals/GLew']
311 if shared['lzo'] == 0:
312 env['CPPPATH'] += [basedir + 'Externals/LZO']
313 dirs += ['Externals/LZO']
314 if shared['sdl'] == 0:
315 env['CPPPATH'] += [basedir + 'Externals/SDL']
316 env['CPPPATH'] += [basedir + 'Externals/SDL/include']
317 dirs += ['Externals/SDL']
318 if shared['soil'] == 0:
319 env['CPPPATH'] += [basedir + 'Externals/SOIL']
320 dirs += ['Externals/SOIL']
321 if shared['sfml'] == 0:
322 env['CPPPATH'] += [basedir + 'Externals/SFML/include']
323 dirs += ['Externals/SFML/src']
324 if shared['zlib'] == 0:
325 env['CPPPATH'] += [basedir + 'Externals/zlib']
326 dirs += ['Externals/zlib']
328 wxmods = ['aui', 'adv', 'core', 'base']
329 if env['wxgl'] or sys.platform == 'win32' or sys.platform == 'darwin':
330 env['USE_WX'] = 1
331 wxmods.append('gl')
332 else:
333 env['USE_WX'] = 0;
334 if env['nowx']:
335 env['USE_WX'] = 0;
337 if sys.platform == 'darwin':
338 wxver = '2.9' # 64-bit on OS X
339 else:
340 wxver = '2.8'
342 if env['nowx']:
343 env['HAVE_WX'] = 0;
344 else:
345 env['HAVE_WX'] = conf.CheckWXConfig(wxver, wxmods, 0)
346 wxconfig.ParseWXConfig(env)
347 # wx-config wants us to link with the OS X QuickTime framework
348 # which is not available for x86_64 and we don't use it anyway.
349 # Strip it out to silence some harmless linker warnings.
350 if env['FRAMEWORKS'].count('QuickTime'):
351 env['FRAMEWORKS'].remove('QuickTime')
352 # Make sure that the libraries claimed by wx-config are valid
353 env['HAVE_WX'] = conf.CheckPKG('c')
355 if not env['HAVE_WX'] and not env['nowx']:
356 print "WX libraries not found - see config.log"
357 Exit(1)
359 if not sys.platform == 'win32':
360 if not conf.CheckPKG('Cg'):
361 print "Must have Cg framework from NVidia to build"
362 Exit(1)
364 env['HAVE_BLUEZ'] = 0
365 env['HAVE_ALSA'] = env['HAVE_AO'] = env['HAVE_OPENAL'] = \
366 env['HAVE_PORTAUDIO'] = env['HAVE_PULSEAUDIO'] = 0
367 env['HAVE_X11'] = env['HAVE_XRANDR'] = 0
368 if not sys.platform == 'win32' and not sys.platform == 'darwin':
369 env['LINKFLAGS'] += ['-pthread']
371 env['HAVE_BLUEZ'] = conf.CheckPKG('bluez')
373 env['HAVE_ALSA'] = conf.CheckPKG('alsa')
374 env['HAVE_AO'] = conf.CheckPKG('ao')
375 env['HAVE_OPENAL'] = conf.CheckPKG('openal')
376 env['HAVE_PORTAUDIO'] = conf.CheckPortaudio(1890)
377 env['HAVE_PULSEAUDIO'] = conf.CheckPKG('libpulse-simple')
379 env['HAVE_X11'] = conf.CheckPKG('x11')
380 env['HAVE_XRANDR'] = env['HAVE_X11'] and conf.CheckPKG('xrandr')
381 if not conf.CheckPKG('GL'):
382 print "Must have OpenGL to build"
383 Exit(1)
384 if not conf.CheckPKG('GLU'):
385 print "Must have GLU to build"
386 Exit(1)
387 if not conf.CheckPKG('CgGL'):
388 print "Must have CgGl to build"
389 Exit(1)
391 # Check for GTK 2.0 or newer
392 if sys.platform == 'linux2':
393 if env['HAVE_WX'] and not conf.CheckPKG('gtk+-2.0'):
394 print "gtk+-2.0 developement headers not detected"
395 print "gtk+-2.0 is required to build the WX GUI"
396 Exit(1)
398 env['NOJIT'] = 0
399 if env['nojit']:
400 env['NOJIT'] = 1
402 conf.Define('NOJIT', env['NOJIT'])
404 # Creating config.h defines
405 conf.Define('HAVE_BLUEZ', env['HAVE_BLUEZ'])
406 conf.Define('HAVE_AO', env['HAVE_AO'])
407 conf.Define('HAVE_OPENCL', env['HAVE_OPENCL'])
408 conf.Define('HAVE_OPENAL', env['HAVE_OPENAL'])
409 conf.Define('HAVE_ALSA', env['HAVE_ALSA'])
410 conf.Define('HAVE_PULSEAUDIO', env['HAVE_PULSEAUDIO'])
411 conf.Define('HAVE_WX', env['HAVE_WX'])
412 conf.Define('USE_WX', env['USE_WX'])
413 conf.Define('HAVE_X11', env['HAVE_X11'])
414 conf.Define('HAVE_XRANDR', env['HAVE_XRANDR'])
415 conf.Define('HAVE_PORTAUDIO', env['HAVE_PORTAUDIO'])
416 conf.Define('USER_DIR', "\"" + env['userdir'] + "\"")
417 if (env['install'] == 'global'):
418 conf.Define('DATA_DIR', "\"" + env['data_dir'] + "\"")
419 conf.Define('LIBS_DIR', "\"" + env['prefix'] + 'lib/' + "\"")
421 # Lua
422 env['LUA_USE_MACOSX'] = env['LUA_USE_LINUX'] = env['LUA_USE_POSIX'] = 0
423 if sys.platform == 'darwin':
424 env['LUA_USE_MACOSX'] = 1
425 elif sys.platform == 'linux2':
426 env['LUA_USE_LINUX'] = 1
428 conf.Define('LUA_USE_MACOSX', env['LUA_USE_MACOSX'])
429 conf.Define('LUA_USE_LINUX', env['LUA_USE_LINUX'])
431 # Profiling
432 env['USE_OPROFILE'] = 0
433 if (flavour == 'prof'):
434 proflibs = [ '/usr/lib/oprofile', '/usr/local/lib/oprofile' ]
435 env['LIBPATH'].append(proflibs)
436 env['RPATH'].append(proflibs)
437 if conf.CheckPKG('opagent'):
438 env['USE_OPROFILE'] = 1
439 else:
440 print "Can't build prof without oprofile, disabling"
442 conf.Define('USE_OPROFILE', env['USE_OPROFILE'])
443 # After all configuration tests are done
444 conf.Finish()
446 env['LIBPATH'].append(env['local_libs'])
448 rev = utils.GenerateRevFile(env['flavor'],
449 "Source/Core/Common/Src/svnrev_template.h",
450 "Source/Core/Common/Src/svnrev.h")
451 # Print a nice progress indication when not compiling
452 Progress(['-\r', '\\\r', '|\r', '/\r'], interval=5)
454 # Setup destdir for package building
455 # Warning: The program will not run from this location. It is assumed the
456 # package will later install it to the prefix as it was defined before this.
457 if env.has_key('destdir'):
458 env['prefix'] = env['destdir'] + env['prefix']
459 env['plugin_dir'] = env['destdir'] + env['plugin_dir']
460 env['binary_dir'] = env['destdir'] + env['binary_dir']
461 env['data_dir'] = env['destdir'] + env['data_dir']
463 # Die on unknown variables
464 unknown = vars.UnknownVariables()
465 if unknown:
466 print "Unknown variables:", unknown.keys()
467 Exit(1)
469 # Generate help
470 Help(vars.GenerateHelpText(env))
472 Export('env')
474 for subdir in dirs:
475 SConscript(
476 subdir + os.sep + 'SConscript',
477 variant_dir = env[ 'build_dir' ] + subdir + os.sep,
478 duplicate=0
481 # Data install
482 if sys.platform == 'darwin':
483 env.Install(env['data_dir'], 'Data/Sys')
484 env.Install(env['data_dir'], 'Data/User')
485 env.Install(env['binary_dir'] + 'Dolphin.app/Contents/Resources/',
486 'Source/Core/DolphinWX/resources/Dolphin.icns')
487 else:
488 env.InstallAs(env['data_dir'] + 'sys', 'Data/Sys')
489 env.InstallAs(env['data_dir'] + 'user', 'Data/User')
491 env.Alias('install', env['prefix'])
493 if env['bundle']:
494 if sys.platform == 'linux2':
495 # Make tar ball (TODO put inside normal dir)
496 tar_env = env.Clone()
497 tarball = tar_env.Tar('dolphin-'+rev +'.tar.bz2', env['prefix'])
498 tar_env.Append(TARFLAGS='-j', TARCOMSTR="Creating release tarball")
499 elif sys.platform == 'darwin':
500 env.Command('.', env['binary_dir'] +
501 'Dolphin.app/Contents/MacOS/Dolphin', './osx_make_dmg.sh')
503 #TODO clean all bundles
504 #env.Clean(all, 'dolphin-*' + '.tar.bz2')
505 #env.Clean(all, 'Binary/Dolphin-r*' + '.dmg')