From b560d2456e5d96335e7bb530054ead7c9b2f5eef Mon Sep 17 00:00:00 2001 From: Soren Jorvang Date: Mon, 14 Jun 2010 18:07:29 +0000 Subject: [PATCH] Integrate the standalone memcard manager into the main build. Use 10.5 SDK header files in an attempt to keep us honest and 10.5 compatible. I'd do the same with system libraries, but the linker gives strange errors when I try that. We also link against third party libraries from Macports that haven't had any magic 10.5 compat dust sprinkled over them, so maybe it isn't very important anyway. Move the OS X variable section in SConstruct upwards a bit to have the settings apply to more of the config tests. SCons' ParseConfig causes problems for the -arch tuples, though, so the SDL check still isn't quite as comprehensive as it should be. Put the XCode project out of its misery. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5693 8ced0084-cf51-0410-be5f-012b33b47a6e --- Externals/MemcardManager/SConscript | 12 +- Externals/MemcardManager/SConstruct | 248 - Externals/MemcardManager/build | 10 - Externals/MemcardManager/clean | 10 - SConstruct | 84 +- SconsTests/utils.py | 4 +- Source/Core/DolphinWX/Src/SConscript | 15 +- Source/Dolphin.xcodeproj/TemplateIcon.icns | Bin 37234 -> 0 bytes Source/Dolphin.xcodeproj/project.pbxproj | 7439 -------------------- 9 files changed, 59 insertions(+), 7763 deletions(-) delete mode 100644 Externals/MemcardManager/SConstruct delete mode 100755 Externals/MemcardManager/build delete mode 100755 Externals/MemcardManager/clean delete mode 100644 Source/Dolphin.xcodeproj/TemplateIcon.icns delete mode 100644 Source/Dolphin.xcodeproj/project.pbxproj diff --git a/Externals/MemcardManager/SConscript b/Externals/MemcardManager/SConscript index aeb866d8e7..4299c1d0d8 100644 --- a/Externals/MemcardManager/SConscript +++ b/Externals/MemcardManager/SConscript @@ -2,22 +2,24 @@ Import('env') import sys + +if not env['HAVE_WX']: + Return() + wxenv = env.Clone() files = [ ] libs = [ + 'memcard', 'common', ] if wxenv['HAVE_WX']: files += [ - 'Externals/MemcardManager/src/mcmMain.cpp', - 'Externals/MemcardManager/src/MCMdebug.cpp', - 'Source/Core/DolphinWX/Src/MemcardManager.cpp', - 'Source/Core/DolphinWX/Src/MemoryCards/GCMemcard.cpp', - 'Source/Core/DolphinWX/Src/WxUtils.cpp', + 'src/mcmMain.cpp', + 'src/MCMdebug.cpp', ] LIBS = libs diff --git a/Externals/MemcardManager/SConstruct b/Externals/MemcardManager/SConstruct deleted file mode 100644 index 50508126f4..0000000000 --- a/Externals/MemcardManager/SConstruct +++ /dev/null @@ -1,248 +0,0 @@ -# -*- python -*- - -import os -import sys -import platform - -# Home made tests -sys.path.append('SconsTests') -import wxconfig -import utils - -# Some features need at least SCons 1.2 -EnsureSConsVersion(1, 2) - -warnings = [ - 'all', - 'write-strings', - 'shadow', - 'pointer-arith', - 'packed', - 'no-conversion', - ] -compileFlags = [ - '-fno-exceptions', - '-fno-strict-aliasing', - '-msse2', - ] -if sys.platform != 'win32': - compileFlags += [ '-fvisibility=hidden' ] - -cppDefines = [ - ( '_FILE_OFFSET_BITS', 64), - '_LARGEFILE_SOURCE', - 'GCC_HASCLASSVISIBILITY', - ] - -basedir = os.getcwd()+ '/' - -include_paths = [ - basedir + 'Source/Core/Common/Src', - basedir + 'Source/PluginSpecs', - basedir + 'Source/Core/DolphinWX/Src', - basedir + 'Externals/MemcardManager/src', - ] - -dirs = [ - basedir + 'Source/Core/Common/Src', - basedir + '.' - ] - -builders = {} -if sys.platform == 'darwin': - from plistlib import writePlist - def createPlist(target, source, env): - properties = {} - for srcNode in source: - properties.update(srcNode.value) - for dstNode in target: - writePlist(properties, str(dstNode)) - builders['Plist'] = Builder(action = createPlist) - -# Handle command line options -vars = Variables('args.cache') - -vars.AddVariables( - BoolVariable('verbose', 'Set for compilation line', False), - BoolVariable('lint', 'Set for lint build (extra warnings)', False), - EnumVariable('flavor', 'Choose a build flavor', 'release', - allowed_values = ('release','devel','debug','fastlog','prof'), - ignorecase = 2 - ), - PathVariable('wxconfig', 'Path to the wxconfig', None), - ('CC', 'The c compiler', 'gcc'), - ('CXX', 'The c++ compiler', 'g++'), - ) - -if sys.platform == 'win32': - env = Environment( - CPPPATH = include_paths, - RPATH = [], - LIBS = [], - LIBPATH = [], - tools = [ 'mingw' ], - variables = vars, - ENV = os.environ, - BUILDERS = builders, - ) -else: - env = Environment( - CPPPATH = include_paths, - RPATH = [], - LIBS = [], - LIBPATH = [], - variables = vars, - ENV = { - 'PATH' : os.environ['PATH'], - 'HOME' : os.environ['HOME'] - }, - BUILDERS = builders, - ) - -# Save the given command line options -vars.Save('args.cache', env) - -# Verbose compile -if not env['verbose']: - env['CCCOMSTR'] = "Compiling $TARGET" - env['CXXCOMSTR'] = "Compiling $TARGET" - env['ARCOMSTR'] = "Archiving $TARGET" - env['LINKCOMSTR'] = "Linking $TARGET" - env['ASCOMSTR'] = "Assembling $TARGET" - env['ASPPCOMSTR'] = "Assembling $TARGET" - env['SHCCCOMSTR'] = "Compiling shared $TARGET" - env['SHCXXCOMSTR'] = "Compiling shared $TARGET" - env['SHLINKCOMSTR'] = "Linking shared $TARGET" - env['RANLIBCOMSTR'] = "Indexing $TARGET" - -# Build flavour -flavour = env['flavor'] -if (flavour == 'debug'): - compileFlags.append('-ggdb') - cppDefines.append('_DEBUG') #enables LOGGING - # FIXME: this disable wx debugging how do we make it work? - cppDefines.append('NDEBUG') -elif (flavour == 'devel'): - compileFlags.append('-ggdb') -elif (flavour == 'fastlog'): - compileFlags.append('-O3') - cppDefines.append('DEBUGFAST') -elif (flavour == 'prof'): - compileFlags.append('-O3') - compileFlags.append('-ggdb') -elif (flavour == 'release'): - compileFlags.append('-O3') - -# More warnings -if env['lint']: - warnings.append('error') - # Should check for the availability of these (in GCC 4.3 or newer) - if sys.platform != 'darwin': - warnings.append('no-array-bounds') - warnings.append('no-unused-result') - # wxWidgets causes too many warnings with these - #warnings.append('unreachable-code') - #warnings.append('float-equal') - -# Add the warnings to the compile flags -compileFlags += [ '-W' + warning for warning in warnings ] - -env['CCFLAGS'] = compileFlags -if sys.platform == 'win32': - env['CXXFLAGS'] = compileFlags -else: - env['CXXFLAGS'] = compileFlags + [ '-fvisibility-inlines-hidden' ] -env['CPPDEFINES'] = cppDefines - -# Configuration tests section -tests = {'CheckWXConfig' : wxconfig.CheckWXConfig, - 'CheckPKGConfig' : utils.CheckPKGConfig, - 'CheckPKG' : utils.CheckPKG, - } - -# Object files -env['build_dir'] = os.path.join(basedir, 'Build', - platform.system() + '-' + 'MemCardManager' + os.sep) - -conf = env.Configure(custom_tests = tests, - config_h="Source/Core/Common/Src/Config.h") - -if not conf.CheckPKGConfig('0.15.0'): - print "Can't find pkg-config, some tests will fail" - -# OS X specifics -if sys.platform == 'darwin': - env['HAVE_X11'] = 0 - compileFlags.append('-mmacosx-version-min=10.5') - conf.Define('MAP_32BIT', 0) -else: - env['HAVE_X11'] = conf.CheckPKG('x11') - -# Handling wx flags CCFLAGS should be created before -wxmods = ['adv', 'core', 'base'] -env['USE_WX'] = 0 - -env['HAVE_WX'] = conf.CheckWXConfig('2.8', wxmods, 0) - -conf.Define('HAVE_WX', env['HAVE_WX']) -conf.Define('USE_WX', env['USE_WX']) -conf.Define('HAVE_X11', env['HAVE_X11']) - -# Profile -env['USE_OPROFILE'] = 0 -if (flavour == 'prof'): - proflibs = [ '/usr/lib/oprofile', '/usr/local/lib/oprofile' ] - env['LIBPATH'].append(proflibs) - env['RPATH'].append(proflibs) - if conf.CheckPKG('opagent'): - env['USE_OPROFILE'] = 1 - else: - print "Can't build prof without oprofile, disabling" - -conf.Define('USE_OPROFILE', env['USE_OPROFILE']) -# After all configuration tests are done -conf.Finish() - -if env['HAVE_WX']: - wxconfig.ParseWXConfig(env) -else: - print "WX not found or disabled, not building GUI" - -# Install paths -extra='' -if flavour == 'debug': - extra = '-debug' -elif flavour == 'prof': - extra = '-prof' - -# TODO: support global install -env['prefix'] = os.path.join(env['base_dir'] + 'Binary', - 'MemCardManager' + extra + os.sep) -# TODO: add bin -env['binary_dir'] = env['prefix'] - -# Static libs goes here -env['local_libs'] = env['build_dir'] + os.sep + 'libs' + os.sep - -env['LIBPATH'].append(env['local_libs']) - -# Print a nice progress indication when not compiling -Progress(['-\r', '\\\r', '|\r', '/\r'], interval = 5) - -# Die on unknown variables -unknown = vars.UnknownVariables() -if unknown: - print "Unknown variables:", unknown.keys() - Exit(1) - -# Generate help -Help(vars.GenerateHelpText(env)) - -Export('env') - -for subdir in dirs: - SConscript( - subdir + os.sep + 'SConscript', - variant_dir = env[ 'build_dir' ] + subdir + os.sep, - duplicate=0 - ) diff --git a/Externals/MemcardManager/build b/Externals/MemcardManager/build deleted file mode 100755 index 5296b59f1f..0000000000 --- a/Externals/MemcardManager/build +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# lazy way to build linux memcard manager -mv ../../SConstruct ../../dolphin_SConstruct -cp SConstruct ../../SConstruct -cp SConscript ../../SConscript -cd ../../ -scons -rm SConstruct -rm SConscript -mv dolphin_SConstruct SConstruct diff --git a/Externals/MemcardManager/clean b/Externals/MemcardManager/clean deleted file mode 100755 index 438432a9ab..0000000000 --- a/Externals/MemcardManager/clean +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# lazy way to clean linux memcard manager -mv ../../SConstruct ../../dolphin_SConstruct -cp SConstruct ../../SConstruct -cp SConscript ../../SConscript -cd ../../ -scons -c -rm SConstruct -rm SConscript -mv dolphin_SConstruct SConstruct diff --git a/SConstruct b/SConstruct index ac316a4664..d3ea9801fb 100644 --- a/SConstruct +++ b/SConstruct @@ -34,7 +34,7 @@ cppDefines = [ 'GCC_HASCLASSVISIBILITY', ] -basedir = os.getcwd()+ '/' +basedir = os.getcwd() + '/' include_paths = [ basedir + 'Source/Core/Common/Src', @@ -50,12 +50,14 @@ include_paths = [ basedir + 'Source/Core/InputUICommon/Src', basedir + 'Source/Core/AudioCommon/Src', basedir + 'Source/Core/DebuggerUICommon/Src', + basedir + 'Source/Core/DolphinWX/Src', basedir + 'Source/Core/DSPCore/Src', ] dirs = [ 'Externals/Bochs_disasm', 'Externals/Lua', + 'Externals/MemcardManager', 'Externals/WiiUseSrc/Src', 'Source/Core/Common/Src', 'Source/Core/Core/Src', @@ -126,31 +128,24 @@ vars.AddVariables( ('CXX', 'The c++ compiler', 'g++'), ) +env = Environment( + CPPPATH = include_paths, + RPATH = [], + LIBS = [], + LIBPATH = [], + BUILDERS = builders, + variables = vars, + ) + if sys.platform == 'win32': - env = Environment( - CPPPATH = include_paths, - RPATH = [], - LIBS = [], - LIBPATH = [], - tools = [ 'mingw' ], - variables = vars, - ENV = os.environ, - BUILDERS = builders, - ) + env['tools'] = ['mingw'] + env['ENV'] = os.environ else: - env = Environment( - CPPPATH = include_paths, - RPATH = [], - LIBS = [], - LIBPATH = [], - variables = vars, - ENV = { - 'PATH' : os.environ['PATH'], - 'HOME' : os.environ['HOME'], - 'PKG_CONFIG_PATH' : os.environ.get('PKG_CONFIG_PATH') - }, - BUILDERS = builders, - ) + env['ENV'] = { + 'PATH' : os.environ['PATH'], + 'HOME' : os.environ['HOME'], + 'PKG_CONFIG_PATH' : os.environ.get('PKG_CONFIG_PATH') + } # Save the given command line options vars.Save('args.cache', env) @@ -215,7 +210,6 @@ if env['pgo']=='use': compileFlags.append('-fprofile-use') env['LINKFLAGS']='-fprofile-use' - # Configuration tests section tests = {'CheckWXConfig' : wxconfig.CheckWXConfig, 'CheckPKGConfig' : utils.CheckPKGConfig, @@ -277,6 +271,21 @@ if not conf.CheckSDL('1.0.0'): print "SDL is required" Exit(1) +# OS X specifics +if sys.platform == 'darwin': + compileFlags += ['-mmacosx-version-min=10.5'] + #compileFlags += ['-isysroot', '/Developer/SDKs/MacOSX10.5.sdk'] + conf.Define('MAP_32BIT', 0) + env['CC'] = "gcc-4.2" + env['CFLAGS'] = ['-x', 'objective-c'] + env['CXX'] = "g++-4.2" + env['CXXFLAGS'] = ['-x', 'objective-c++'] + env['CCFLAGS'] += ['-arch' , 'x86_64' , '-arch' , 'i386'] + env['LINKFLAGS'] += ['-arch', 'x86_64' , '-arch' , 'i386'] + env['FRAMEWORKS'] += ['CoreFoundation', 'CoreServices'] + env['FRAMEWORKS'] += ['IOBluetooth', 'IOKit', 'OpenGL'] + env['FRAMEWORKS'] += ['AudioUnit', 'CoreAudio'] + # Bluetooth for wiimote support env['HAVE_BLUEZ'] = conf.CheckPKG('bluez') @@ -332,26 +341,6 @@ if not env['SHARED_SFML']: env['CPPPATH'] += [ basedir + 'Externals/SFML/include' ] dirs += ['Externals/SFML/src'] -# OS X specifics -if sys.platform == 'darwin': - compileFlags.append('-mmacosx-version-min=10.5') - env['HAVE_XRANDR'] = 0 - env['HAVE_X11'] = 0 - env['CC'] = "gcc-4.2" - env['CFLAGS'] = ['-x', 'objective-c'] - env['CXX'] = "g++-4.2" - env['CXXFLAGS'] = ['-x', 'objective-c++'] - env['CCFLAGS'] += ['-arch' , 'x86_64' , '-arch' , 'i386'] - env['LINKFLAGS'] += ['-arch' , 'x86_64' , '-arch' , 'i386'] - conf.Define('MAP_32BIT', 0) - env['FRAMEWORKS'] += ['CoreFoundation', 'CoreServices'] - env['FRAMEWORKS'] += ['IOBluetooth', 'IOKit', 'OpenGL'] - env['FRAMEWORKS'] += ['AudioUnit', 'CoreAudio'] -else: - env['HAVE_X11'] = conf.CheckPKG('x11') - env['HAVE_XRANDR'] = env['HAVE_X11'] and conf.CheckPKG('xrandr') - env['LINKFLAGS'] += ['-pthread'] - wxmods = ['aui', 'adv', 'core', 'base'] if env['wxgl'] or sys.platform == 'win32' or sys.platform == 'darwin': env['USE_WX'] = 1 @@ -391,7 +380,12 @@ if not sys.platform == 'win32': print "Must have GLEW to build" Exit(1) +env['HAVE_X11'] = 0 +env['HAVE_XRANDR'] = 0 if not sys.platform == 'win32' and not sys.platform == 'darwin': + env['HAVE_X11'] = conf.CheckPKG('x11') + env['HAVE_XRANDR'] = env['HAVE_X11'] and conf.CheckPKG('xrandr') + env['LINKFLAGS'] += ['-pthread'] if not conf.CheckPKG('GL'): print "Must have OpenGL to build" Exit(1) diff --git a/SconsTests/utils.py b/SconsTests/utils.py index 49ecc80326..e3afe79147 100644 --- a/SconsTests/utils.py +++ b/SconsTests/utils.py @@ -32,7 +32,7 @@ def CheckFink(context): prefix = prog.rsplit(os.sep, 2)[0] context.env.Append(LIBPATH = [prefix + os.sep +'lib'], CPPPATH = [prefix + os.sep +'include']) - context.Message( 'Adding fink lib and include path') + context.Message( 'Adding fink lib and include path ') else: ret = 0 @@ -47,7 +47,7 @@ def CheckMacports(context): prefix = prog.rsplit(os.sep, 2)[0] context.env.Append(LIBPATH = [prefix + os.sep + 'lib'], CPPPATH = [prefix + os.sep + 'include']) - context.Message( 'Adding port lib and include path') + context.Message( 'Adding port lib and include path ') else: ret = 0 diff --git a/Source/Core/DolphinWX/Src/SConscript b/Source/Core/DolphinWX/Src/SConscript index f8d52c3af6..759746aa5f 100644 --- a/Source/Core/DolphinWX/Src/SConscript +++ b/Source/Core/DolphinWX/Src/SConscript @@ -16,6 +16,13 @@ libs = [ ] if wxenv['HAVE_WX']: + memcardfiles = [ + 'MemcardManager.cpp', + 'MemoryCards/GCMemcard.cpp', + 'WxUtils.cpp', + ] + + files += memcardfiles files += [ 'AboutDolphin.cpp', 'ARCodeAddEdit.cpp', @@ -30,12 +37,8 @@ if wxenv['HAVE_WX']: 'HotkeyDlg.cpp', 'ISOFile.cpp', 'ISOProperties.cpp', - 'MemcardManager.cpp', - 'MemoryCards/GCMemcard.cpp', 'PatchAddEdit.cpp', 'CheatsWindow.cpp', - 'stdafx.cpp', - 'WxUtils.cpp', 'MemoryCards/WiiSaveCrypted.cpp', 'NetPlay.cpp', 'NetPlayClient.cpp', @@ -53,6 +56,9 @@ else: 'cmdline.c', ] +if sys.platform == 'win32': + files += [ "stdafx.cpp" ] + if sys.platform == 'darwin': files += [ 'cocoaApp.m', ] @@ -86,5 +92,6 @@ if wxenv['HAVE_X11']: if wxenv['HAVE_WX']: wxenv.Program(exeGUI, files + [ 'Main.cpp' ]) + wxenv.StaticLibrary(env['local_libs'] + 'memcard', memcardfiles) else: wxenv.Program(exeNoGUI, files + [ 'MainNoGUI.cpp' ]) diff --git a/Source/Dolphin.xcodeproj/TemplateIcon.icns b/Source/Dolphin.xcodeproj/TemplateIcon.icns deleted file mode 100644 index 3b9719aa4d2393f82e8324ddb81d8aef513477e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37234 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Ν5dvs)boS*jwMsYA(H!xeG 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 by&SE;Xaz