From e67e9d66557356ef1c3211d46fbda9cfb46f9cab Mon Sep 17 00:00:00 2001 From: jdolan Date: Sun, 2 Jun 2013 10:12:14 -0400 Subject: [PATCH 01/14] #165 Add prefix_win32 support to game packs. --- radiant/preferences.cpp | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/radiant/preferences.cpp b/radiant/preferences.cpp index 1af3d6c8..c6bb69c2 100644 --- a/radiant/preferences.cpp +++ b/radiant/preferences.cpp @@ -851,13 +851,15 @@ CGameDescription::CGameDescription( xmlDocPtr pDoc, const Str &GameFile ){ } #if defined ( __linux__ ) || defined ( __APPLE__ ) - // *nix specific prop = (char*)xmlGetProp( pNode, (const xmlChar *)"prefix" ); +#elif defined ( __WIN32 ) + prop = (char*)xmlGetProp( pNode, (const xmlChar *)"prefix_win32" ); +#endif if ( prop != NULL ) { mUserPathPrefix = prop; xmlFree( prop ); } -#endif + mShaderPath = xmlGetProp( pNode, (const xmlChar *)"shaderpath" ); if ( !mShaderPath.GetLength() ) { mShaderPath = "scripts/"; @@ -916,10 +918,8 @@ void CGameDescription::Dump(){ Sys_Printf( "engine path : '%s'\n", mEnginePath.GetBuffer() ); Sys_Printf( "engine : '%s'\n", mEngine.GetBuffer() ); Sys_Printf( "shaderlist : '%s'\n", mShaderlist.GetBuffer() ); - Sys_Printf( "caulk shader: '%s'\n", mCaulkShader.GetBuffer() ); -#if defined ( __linux__ ) || defined ( __APPLE__ ) + Sys_Printf( "caulk shader : '%s'\n", mCaulkShader.GetBuffer() ); Sys_Printf( "prefix : '%s'\n", mUserPathPrefix.GetBuffer() ); -#endif Sys_Printf( "default texture scale: %g\n", mTextureDefaultScale ); Sys_Printf( "single eclass load : %s\n", mEClassSingleLoad ? "Yes" : "No" ); Sys_Printf( "patches supported : %s\n", mNoPatch ? "No" : "Yes" ); @@ -1299,17 +1299,22 @@ void CGameDialog::Init(){ g_strGameToolsPath = g_pGameDescription->mGameToolsPath; - // NOTE TTimo: this is moved from QE_LoadProject in 1.2 - // (probably broken) - // NOTE Hydra: was broken for win32, we don't use m_strHomeGame or m_strFSBasePath + // Add the per-user game path on all platforms + if (m_pCurrentGameDescription->mUserPathPrefix.GetLength()) { #if defined ( __linux__ ) || defined ( __APPLE__ ) - g_qeglobals.m_strHomeGame = g_get_home_dir(); - g_qeglobals.m_strHomeGame += "/"; - g_qeglobals.m_strHomeGame += m_pCurrentGameDescription->mUserPathPrefix.GetBuffer(); - g_qeglobals.m_strHomeGame += "/"; -#else - g_qeglobals.m_strHomeGame = g_pGameDescription->mEnginePath.GetBuffer(); + g_qeglobals.m_strHomeGame = g_get_home_dir(); + g_qeglobals.m_strHomeGame += "/"; + g_qeglobals.m_strHomeGame += m_pCurrentGameDescription->mUserPathPrefix.GetBuffer(); + g_qeglobals.m_strHomeGame += "/"; +#elif defined ( _WIN32 ) + g_qeglobals.m_strHomeGame = g_get_home_dir(); + g_qeglobals.m_strHomeGame += "\\My Games\\"; + g_qeglobals.m_strHomeGame += m_pCurrentGameDescription->mUserPathPrefix.GetBuffer(); + g_qeglobals.m_strHomeGame += "\\"; #endif + } else { + g_qeglobals.m_strHomeGame = g_pGameDescription->mEnginePath.GetBuffer(); + } g_pGameDescription->Dump(); } From 246085906e9ac16de287335dfebd9d04f09d0292 Mon Sep 17 00:00:00 2001 From: jdolan Date: Sun, 2 Jun 2013 10:35:21 -0400 Subject: [PATCH 02/14] Add prefix_win32 to generated Q2W.game file. --- radiant/preferences.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radiant/preferences.cpp b/radiant/preferences.cpp index c6bb69c2..f07ef3c9 100644 --- a/radiant/preferences.cpp +++ b/radiant/preferences.cpp @@ -3531,6 +3531,7 @@ void CGameInstall::Run() { case GAME_Q2W: { fprintf( fg, " "TOOLS_ATTRIBUTE "=\"%sinstalls/Q2WPack/game\"\n", g_strAppPath.GetBuffer() ); fprintf( fg, " prefix=\".quake2world\"\n" ); + fprintf( fg, " prefix_win32=\"Quake2World\"\n"); Str source = g_strAppPath.GetBuffer(); source += "installs/"; source += Q2W_PACK; From c72536f4b3e1b92a14a9642bb40ec5d48505386e Mon Sep 17 00:00:00 2001 From: jdolan Date: Sun, 2 Jun 2013 22:12:42 -0400 Subject: [PATCH 03/14] Initial Apple packaging. Needs Gtk / Pango crap. --- .gitignore | 2 + apple/GtkRadiant.app/Contents/Info.plist | 28 ++++++++++ .../Contents/MacOS/modules/.turd | 0 .../Contents/Resources/bitmaps/.turd | 0 .../Contents/Resources/games/.turd | 0 .../Contents/Resources/installs/.turd | 0 .../Contents/Resources/modules/bitmaps/.turd | 0 .../Contents/Resources/radiant.icns | Bin 0 -> 61187 bytes apple/GtkRadiant.app/Contents/lib/.turd | 0 apple/Makefile | 49 ++++++++++++++++++ 10 files changed, 79 insertions(+) create mode 100644 apple/GtkRadiant.app/Contents/Info.plist create mode 100644 apple/GtkRadiant.app/Contents/MacOS/modules/.turd create mode 100644 apple/GtkRadiant.app/Contents/Resources/bitmaps/.turd create mode 100644 apple/GtkRadiant.app/Contents/Resources/games/.turd create mode 100644 apple/GtkRadiant.app/Contents/Resources/installs/.turd create mode 100644 apple/GtkRadiant.app/Contents/Resources/modules/bitmaps/.turd create mode 100644 apple/GtkRadiant.app/Contents/Resources/radiant.icns create mode 100644 apple/GtkRadiant.app/Contents/lib/.turd create mode 100644 apple/Makefile diff --git a/.gitignore b/.gitignore index 5d7e074c..f982b2e2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/apple/target/* /install/q3map2 /install/radiant.bin /.sconsign.dblite @@ -6,3 +7,4 @@ *.pyc *.so .settings +.DS_Store diff --git a/apple/GtkRadiant.app/Contents/Info.plist b/apple/GtkRadiant.app/Contents/Info.plist new file mode 100644 index 00000000..d346cd0b --- /dev/null +++ b/apple/GtkRadiant.app/Contents/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleDisplayName + GtkRadiant + CFBundleExecutable + radiant.bin + CFBundleIconFile + radiant.icns + CFBundleIdentifier + org.icculus.gtkradiant + CFBundleName + GtkRadiant + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.6.4 + CFBundleSignature + ???? + CFBundleVersion + 1.6.4 + LSMinimumSystemVersion + 10.6 + + diff --git a/apple/GtkRadiant.app/Contents/MacOS/modules/.turd b/apple/GtkRadiant.app/Contents/MacOS/modules/.turd new file mode 100644 index 00000000..e69de29b diff --git a/apple/GtkRadiant.app/Contents/Resources/bitmaps/.turd b/apple/GtkRadiant.app/Contents/Resources/bitmaps/.turd new file mode 100644 index 00000000..e69de29b diff --git a/apple/GtkRadiant.app/Contents/Resources/games/.turd b/apple/GtkRadiant.app/Contents/Resources/games/.turd new file mode 100644 index 00000000..e69de29b diff --git a/apple/GtkRadiant.app/Contents/Resources/installs/.turd b/apple/GtkRadiant.app/Contents/Resources/installs/.turd new file mode 100644 index 00000000..e69de29b diff --git a/apple/GtkRadiant.app/Contents/Resources/modules/bitmaps/.turd b/apple/GtkRadiant.app/Contents/Resources/modules/bitmaps/.turd new file mode 100644 index 00000000..e69de29b diff --git a/apple/GtkRadiant.app/Contents/Resources/radiant.icns b/apple/GtkRadiant.app/Contents/Resources/radiant.icns new file mode 100644 index 0000000000000000000000000000000000000000..4f1db4e497029175fbe49f5db0c121da9a850da4 GIT binary patch literal 61187 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 literal 0 HcmV?d00001 diff --git a/apple/GtkRadiant.app/Contents/lib/.turd b/apple/GtkRadiant.app/Contents/lib/.turd new file mode 100644 index 00000000..e69de29b diff --git a/apple/Makefile b/apple/Makefile new file mode 100644 index 00000000..7760d795 --- /dev/null +++ b/apple/Makefile @@ -0,0 +1,49 @@ +# Makefile for GtkRadiant, requires http://macdylibbundler.sourceforge.net/ + +INSTALL = ../install +TARGET = target +GTKRADIANT = $(TARGET)/GtkRadiant.app +LIBRARIES = $(GTKRADIANT)/Contents/lib +BINARIES = $(GTKRADIANT)/Contents/MacOS +RESOURCES = $(GTKRADIANT)/Contents/Resources +VERSION = 1.6.4 +DMG = $(TARGET)/GtkRadiant-$(VERSION).dmg +VOLUME_NAME = "GtkRadiant $(VERSION)" + +all: install + +pre-install: + install -d $(TARGET) + cp -r GtkRadiant.app $(TARGET) + find $(TARGET) -name .turd -delete + +install: pre-install + install $(INSTALL)/radiant.bin $(BINARIES)/radiant.bin + install $(INSTALL)/q3map2 $(BINARIES)/q3map2 + install $(INSTALL)/q3map2_urt $(BINARIES)/q3map2_urt + install $(INSTALL)/q3data $(BINARIES)/q3data + install $(INSTALL)/modules/*.so $(BINARIES)/modules + + install $(INSTALL)/bitmaps/*.* $(RESOURCES)/bitmaps + install $(INSTALL)/modules/bitmaps/*.* $(RESOURCES)/modules/bitmaps + + @for i in $(INSTALL)/installs/*; do \ + if [ -d $$i/.svn ]; then \ + svn export --force $$i $(RESOURCES)/installs/`basename $$i` ; \ + else \ + cp -r $$i $(RESOURCES)/installs ; \ + fi \ + done + +bundle: + dylibbundler -b \ + `find $(BINARIES) -type f | xargs -I {} echo -x {}` \ + -d $(LIBRARIES) -of -p @executable_path/../lib + +image: + ln -f -s /Applications $(TARGET)/Applications + hdiutil create $(DMG) -srcfolder $(TARGET) -volname $(VOLUME_NAME) + rm $(TARGET)/Applications + +clean: + rm -rf $(TARGET)/* From 2d6a36ac81ccc7316bbe9173c6f4dae1572b70e8 Mon Sep 17 00:00:00 2001 From: jdolan Date: Wed, 26 Jun 2013 21:36:32 -0400 Subject: [PATCH 04/14] Apple packaging somewhat working. The resulting binary runs but crashes. Need some getenv help to load resources and whatnot. --- .cproject | 4 +- .project | 6 +++ .pydevproject | 7 +++ apple/GtkRadiant.app/Contents/Info.plist | 2 +- .../Contents/MacOS/{modules => lib}/.turd | 0 apple/GtkRadiant.app/Contents/MacOS/radiant | 23 ++++++++++ .../gtk-runtime/etc/gtk-2.0/gtk.immodules} | 0 .../Resources/gtk-runtime/etc/gtk-2.0/gtkrc | 0 .../Resources/gtk-runtime/etc/pango/pangorc | 1 + .../Contents/Resources/gtk-runtime/lib/.turd | 0 .../gtk-runtime/share/gtk-2.0/icons/.turd | 0 .../gtk-runtime/share/gtk-2.0/themes/.turd | 0 apple/Makefile | 45 ++++++++++++++++--- 13 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 .pydevproject rename apple/GtkRadiant.app/Contents/MacOS/{modules => lib}/.turd (100%) create mode 100755 apple/GtkRadiant.app/Contents/MacOS/radiant rename apple/GtkRadiant.app/Contents/{lib/.turd => Resources/gtk-runtime/etc/gtk-2.0/gtk.immodules} (100%) create mode 100644 apple/GtkRadiant.app/Contents/Resources/gtk-runtime/etc/gtk-2.0/gtkrc create mode 100644 apple/GtkRadiant.app/Contents/Resources/gtk-runtime/etc/pango/pangorc create mode 100644 apple/GtkRadiant.app/Contents/Resources/gtk-runtime/lib/.turd create mode 100644 apple/GtkRadiant.app/Contents/Resources/gtk-runtime/share/gtk-2.0/icons/.turd create mode 100644 apple/GtkRadiant.app/Contents/Resources/gtk-runtime/share/gtk-2.0/themes/.turd diff --git a/.cproject b/.cproject index 2d63c2af..fa0c4e87 100644 --- a/.cproject +++ b/.cproject @@ -29,7 +29,7 @@ - @@ -504,7 +504,7 @@ diff --git a/.project b/.project index 73e7fc82..8e0c1001 100644 --- a/.project +++ b/.project @@ -5,6 +5,11 @@ + + org.python.pydev.PyDevBuilder + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder clean,full,incremental, @@ -79,5 +84,6 @@ org.eclipse.cdt.core.ccnature org.eclipse.cdt.managedbuilder.core.managedBuildNature org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.python.pydev.pythonNature diff --git a/.pydevproject b/.pydevproject new file mode 100644 index 00000000..a9cca037 --- /dev/null +++ b/.pydevproject @@ -0,0 +1,7 @@ + + + + +Default +python 2.7 + diff --git a/apple/GtkRadiant.app/Contents/Info.plist b/apple/GtkRadiant.app/Contents/Info.plist index d346cd0b..9f049a4d 100644 --- a/apple/GtkRadiant.app/Contents/Info.plist +++ b/apple/GtkRadiant.app/Contents/Info.plist @@ -7,7 +7,7 @@ CFBundleDisplayName GtkRadiant CFBundleExecutable - radiant.bin + radiant CFBundleIconFile radiant.icns CFBundleIdentifier diff --git a/apple/GtkRadiant.app/Contents/MacOS/modules/.turd b/apple/GtkRadiant.app/Contents/MacOS/lib/.turd similarity index 100% rename from apple/GtkRadiant.app/Contents/MacOS/modules/.turd rename to apple/GtkRadiant.app/Contents/MacOS/lib/.turd diff --git a/apple/GtkRadiant.app/Contents/MacOS/radiant b/apple/GtkRadiant.app/Contents/MacOS/radiant new file mode 100755 index 00000000..8ff4de42 --- /dev/null +++ b/apple/GtkRadiant.app/Contents/MacOS/radiant @@ -0,0 +1,23 @@ +#!/bin/bash + +RADIANT_HOME=$(dirname "$0") +RADIANT_HOME=${RADIANT_HOME/GtkRadiant.app*/GtkRadiant.app} + +echo +echo "Starting GtkRadiant in ${RADIANT_HOME}" +echo + +set -x + +GTK_RUNTIME="${RADIANT_HOME}/Contents/Resources/gtk-runtime" + +export GDK_PIXBUF_MODULE_FILE="${GTK_RUNTIME}/etc/gtk-2.0/gdk-pixbuf.loaders" + +export GTK_DATA_PREFIX="${GTK_RUNTIME}" +export GTK_EXE_PREFIX="${GTK_RUNTIME}" +export GTK_PATH="${GTK_RUNTIME}" + +export PANGO_SYSCONFDIR="${GTK_RUNTIME}/etc" +export PANGO_LIBDIR="${GTK_RUNTIME}/lib" + +"${RADIANT_HOME}/Contents/MacOS/radiant.bin" \ No newline at end of file diff --git a/apple/GtkRadiant.app/Contents/lib/.turd b/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/etc/gtk-2.0/gtk.immodules similarity index 100% rename from apple/GtkRadiant.app/Contents/lib/.turd rename to apple/GtkRadiant.app/Contents/Resources/gtk-runtime/etc/gtk-2.0/gtk.immodules diff --git a/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/etc/gtk-2.0/gtkrc b/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/etc/gtk-2.0/gtkrc new file mode 100644 index 00000000..e69de29b diff --git a/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/etc/pango/pangorc b/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/etc/pango/pangorc new file mode 100644 index 00000000..f56d3437 --- /dev/null +++ b/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/etc/pango/pangorc @@ -0,0 +1 @@ +[Pango] \ No newline at end of file diff --git a/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/lib/.turd b/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/lib/.turd new file mode 100644 index 00000000..e69de29b diff --git a/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/share/gtk-2.0/icons/.turd b/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/share/gtk-2.0/icons/.turd new file mode 100644 index 00000000..e69de29b diff --git a/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/share/gtk-2.0/themes/.turd b/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/share/gtk-2.0/themes/.turd new file mode 100644 index 00000000..e69de29b diff --git a/apple/Makefile b/apple/Makefile index 7760d795..008d4692 100644 --- a/apple/Makefile +++ b/apple/Makefile @@ -3,13 +3,16 @@ INSTALL = ../install TARGET = target GTKRADIANT = $(TARGET)/GtkRadiant.app -LIBRARIES = $(GTKRADIANT)/Contents/lib BINARIES = $(GTKRADIANT)/Contents/MacOS +LIBRARIES = $(GTKRADIANT)/Contents/MacOS/lib RESOURCES = $(GTKRADIANT)/Contents/Resources VERSION = 1.6.4 DMG = $(TARGET)/GtkRadiant-$(VERSION).dmg VOLUME_NAME = "GtkRadiant $(VERSION)" +GTK_RUNTIME = $(RESOURCES)/gtk-runtime +GTK_PREFIX_EXPR = 's:/opt/local:@executable_path/../Resources/gtk-runtime:g' + all: install pre-install: @@ -22,9 +25,10 @@ install: pre-install install $(INSTALL)/q3map2 $(BINARIES)/q3map2 install $(INSTALL)/q3map2_urt $(BINARIES)/q3map2_urt install $(INSTALL)/q3data $(BINARIES)/q3data - install $(INSTALL)/modules/*.so $(BINARIES)/modules - + install $(INSTALL)/bitmaps/*.* $(RESOURCES)/bitmaps + + install $(INSTALL)/modules/*.so $(RESOURCES)/modules install $(INSTALL)/modules/bitmaps/*.* $(RESOURCES)/modules/bitmaps @for i in $(INSTALL)/installs/*; do \ @@ -37,8 +41,39 @@ install: pre-install bundle: dylibbundler -b \ - `find $(BINARIES) -type f | xargs -I {} echo -x {}` \ - -d $(LIBRARIES) -of -p @executable_path/../lib + -x $(BINARIES)/radiant.bin \ + -x $(BINARIES)/q3map2 \ + -x $(BINARIES)/q3map2_urt \ + -x $(BINARIES)/q3data \ + -d $(LIBRARIES) -of -p @executable_path/lib + + # The Radiant plugins (modules) are a little funky + # Some of them are actually linked against the build directory + ln -s ../build ./build + + dylibbundler -b \ + `find $(RESOURCES)/modules -name "*.so" | xargs -I {} echo -x {}` \ + -d $(LIBRARIES) -of -p @executable_path/lib + + rm -f build + +gtk-runtime: + gdk-pixbuf-query-loaders | sed $(GTK_PREFIX_EXPR) > \ + $(GTK_RUNTIME)/etc/gtk-2.0/gdk-pixbuf.loaders + + pango-querymodules | sed $(GTK_PREFIX_EXPR) > \ + $(GTK_RUNTIME)/etc/pango/pango.modules + + cp -r /opt/local/lib/gdk-pixbuf-2.0 $(GTK_RUNTIME)/lib + cp -r /opt/local/lib/pango $(GTK_RUNTIME)/lib + + find $(GTK_RUNTIME)/lib -type f ! -name "*.so" -delete + + dylibbundler -b \ + `find $(GTK_RUNTIME)/lib -name "*.so" | xargs -I {} echo -x {}` \ + -d $(LIBRARIES) -of -p @executable_path/lib + + cp -r /opt/local/share/themes/Default $(GTK_RUNTIME)/share image: ln -f -s /Applications $(TARGET)/Applications From 178ebc262b7f2fa12bf5fe457569161a7f75c6be Mon Sep 17 00:00:00 2001 From: jdolan Date: Thu, 27 Jun 2013 00:36:39 -0400 Subject: [PATCH 05/14] Unify whitespace and add -headerpad_max_install_names to LINKFLAGS. --- config.py | 817 +++++++++++++++++++++++++++--------------------------- 1 file changed, 411 insertions(+), 406 deletions(-) diff --git a/config.py b/config.py index c317df31..1708b54a 100644 --- a/config.py +++ b/config.py @@ -1,7 +1,7 @@ import sys, traceback, platform, re, commands, platform, subprocess if __name__ != '__main__': - from SCons.Script import * + from SCons.Script import * import utils, urllib2, zipfile, shutil, pprint, subprocess, re, os.path @@ -9,351 +9,356 @@ import utils, urllib2, zipfile, shutil, pprint, subprocess, re, os.path # target = class Config: - # aliases - # 'all' -> for each choices - # 'gamecode' for the targets, 'game' 'cgame' 'ui' + # aliases + # 'all' -> for each choices + # 'gamecode' for the targets, 'game' 'cgame' 'ui' - def __init__( self ): - # initialize defaults - self.target_selected = [ 'radiant', 'q3map2', 'q3data', 'setup' ] - self.config_selected = [ 'release' ] - # those are global to each config - self.platform = platform.system() - self.cc = 'gcc' - self.cxx = 'g++' - self.install_directory = 'install' + def __init__( self ): + # initialize defaults + self.target_selected = [ 'radiant', 'q3map2', 'q3data', 'setup' ] + self.config_selected = [ 'release' ] + # those are global to each config + self.platform = platform.system() + self.cc = 'gcc' + self.cxx = 'g++' + self.install_directory = 'install' - # platforms for which to assemble a setup - self.setup_platforms = [ 'local', 'x86', 'x64', 'win32' ] - # paks to assemble in the setup - self.setup_packs = [ 'Q3Pack', 'UrTPack', 'ETPack', 'QLPack' ] + # platforms for which to assemble a setup + self.setup_platforms = [ 'local', 'x86', 'x64', 'win32' ] + + # paks to assemble in the setup + self.setup_packs = [ 'Q3Pack', 'UrTPack', 'ETPack', 'QLPack' ] - def __repr__( self ): - return 'config: target=%s config=%s' % ( self.target_selected, self.config_selected ) + def __repr__( self ): + return 'config: target=%s config=%s' % ( self.target_selected, self.config_selected ) - def _processTarget( self, ops ): - self.target_selected = ops + def _processTarget( self, ops ): + self.target_selected = ops - def _processConfig( self, ops ): - self.config_selected = ops + def _processConfig( self, ops ): + self.config_selected = ops - def _processCC( self, ops ): - self.cc = ops + def _processCC( self, ops ): + self.cc = ops - def _processCXX( self, ops ): - self.cxx = ops + def _processCXX( self, ops ): + self.cxx = ops - def _processInstallDir( self, ops ): - self.install_directory = os.path.normpath( os.path.expanduser( ops[0] ) ) + def _processInstallDir( self, ops ): + self.install_directory = os.path.normpath( os.path.expanduser( ops[0] ) ) - def _processSetupPlatforms( self, ops ): - self.setup_platforms = ops + def _processSetupPlatforms( self, ops ): + self.setup_platforms = ops - def _processSetupPacks( self, ops ): - self.setup_packs = ops + def _processSetupPacks( self, ops ): + self.setup_packs = ops - def setupParser( self, operators ): - operators['target'] = self._processTarget - operators['config'] = self._processConfig - operators['cc'] = self._processCC - operators['cxx'] = self._processCXX - operators['install_directory'] = self._processInstallDir - operators['setup_platforms'] = self._processSetupPlatforms - operators['setup_packs'] = self._processSetupPacks + def setupParser( self, operators ): + operators['target'] = self._processTarget + operators['config'] = self._processConfig + operators['cc'] = self._processCC + operators['cxx'] = self._processCXX + operators['install_directory'] = self._processInstallDir + operators['setup_platforms'] = self._processSetupPlatforms + operators['setup_packs'] = self._processSetupPacks - def emit_radiant( self ): - settings = self - for config_name in self.config_selected: - config = {} - config['name'] = config_name - config['shared'] = False - Export( 'utils', 'settings', 'config' ) - build_dir = os.path.join( 'build', config_name, 'radiant' ) - VariantDir( build_dir, '.', duplicate = 0 ) - lib_objects = [] - for project in [ 'libs/synapse/synapse.vcproj', 'libs/cmdlib/cmdlib.vcproj', 'libs/mathlib/mathlib.vcproj', 'libs/l_net/l_net.vcproj' ]: - Export( 'project' ) - lib_objects += SConscript( os.path.join( build_dir, 'SConscript.lib' ) ) - Export( 'lib_objects' ) - radiant = SConscript( os.path.join( build_dir, 'SConscript.radiant' ) ) - Default( InstallAs( os.path.join( self.install_directory, 'radiant.bin' ), radiant ) ) + def emit_radiant( self ): + settings = self + for config_name in self.config_selected: + config = {} + config['name'] = config_name + config['shared'] = False + Export( 'utils', 'settings', 'config' ) + build_dir = os.path.join( 'build', config_name, 'radiant' ) + VariantDir( build_dir, '.', duplicate = 0 ) + lib_objects = [] + for project in [ 'libs/synapse/synapse.vcproj', 'libs/cmdlib/cmdlib.vcproj', 'libs/mathlib/mathlib.vcproj', 'libs/l_net/l_net.vcproj' ]: + Export( 'project' ) + lib_objects += SConscript( os.path.join( build_dir, 'SConscript.lib' ) ) + Export( 'lib_objects' ) + radiant = SConscript( os.path.join( build_dir, 'SConscript.radiant' ) ) + Default( InstallAs( os.path.join( self.install_directory, 'radiant.bin' ), radiant ) ) - # PIC versions of the libs for the modules - shlib_objects_extra = {} - for project in [ 'libs/synapse/synapse.vcproj', 'libs/mathlib/mathlib.vcproj', 'libs/picomodel/picomodel.vcproj', 'libs/cmdlib/cmdlib.vcproj', 'libs/splines/splines.vcproj' ]: - ( libpath, libname ) = os.path.split( project ) - libname = os.path.splitext( libname )[0] - config['shared'] = True - Export( 'project', 'config' ) - build_dir = os.path.join( 'build', config_name, 'shobjs' ) - VariantDir( build_dir, '.', duplicate = 0 ) - shlib_objects_extra[libname] = SConscript( os.path.join( build_dir, 'SConscript.lib' ) ) + # PIC versions of the libs for the modules + shlib_objects_extra = {} + for project in [ 'libs/synapse/synapse.vcproj', 'libs/mathlib/mathlib.vcproj', 'libs/picomodel/picomodel.vcproj', 'libs/cmdlib/cmdlib.vcproj', 'libs/splines/splines.vcproj' ]: + ( libpath, libname ) = os.path.split( project ) + libname = os.path.splitext( libname )[0] + config['shared'] = True + Export( 'project', 'config' ) + build_dir = os.path.join( 'build', config_name, 'shobjs' ) + VariantDir( build_dir, '.', duplicate = 0 ) + shlib_objects_extra[libname] = SConscript( os.path.join( build_dir, 'SConscript.lib' ) ) - for project in [ 'plugins/vfsqlpk3/vfsqlpk3.vcproj', - 'plugins/vfspk3/vfspk3.vcproj', - 'plugins/vfspak/vfspak.vcproj', - 'plugins/vfswad/vfswad.vcproj', - 'plugins/eclassfgd/fgd.vcproj', - 'plugins/entity/entity.vcproj', - 'plugins/image/image.vcproj', - 'plugins/model/model.vcproj', - 'plugins/imagepng/imagepng.vcproj', - 'plugins/imagewal/imagewal.vcproj', - 'plugins/imagehl/imagehl.vcproj', - 'plugins/imagem8/imagem8.vcproj', - 'plugins/spritemodel/spritemodel.vcproj', - 'plugins/textool/textool.vcproj', - 'plugins/map/map.vcproj', - 'plugins/mapxml/mapxml.vcproj', - 'plugins/shaders/shaders.vcproj', - 'plugins/surface/surface.vcproj', - 'plugins/surface_ufoai/surface_ufoai.vcproj', - 'plugins/surface_quake2/surface_quake2.vcproj', - 'plugins/surface_heretic2/surface_heretic2.vcproj', - 'contrib/camera/camera.vcproj', - 'contrib/prtview/prtview.vcproj', - 'contrib/hydratoolz/hydratoolz.vcproj', - 'contrib/bobtoolz/bobtoolz.vcproj', - 'contrib/gtkgensurf/gtkgensurf.vcproj', - 'contrib/ufoai/ufoai.vcproj', - 'contrib/bkgrnd2d/bkgrnd2d.vcproj' - ]: - ( libpath, libname ) = os.path.split( project ) - libname = os.path.splitext( libname )[0] - # The old code assigned shlib_objects to shlib_objects_extra['synapse'], - # and this resulted in a non-copy. Stuff is added to shlib_objects below. - # So we need the explicit copy so we don't modify shlib_objects_extra['synapse']. - shlib_objects = shlib_objects_extra['synapse'][:] - if ( libname == 'camera' ): - shlib_objects += shlib_objects_extra['splines'] - elif ( libname == 'entity' ): - shlib_objects += shlib_objects_extra['mathlib'] - elif ( libname == 'map' ): - shlib_objects += shlib_objects_extra['cmdlib'] - elif ( libname == 'model' ): - shlib_objects += shlib_objects_extra['picomodel'] - shlib_objects += shlib_objects_extra['mathlib'] - elif ( libname == 'spritemodel' ): - shlib_objects += shlib_objects_extra['mathlib'] - elif ( libname == 'textool' ): - shlib_objects += shlib_objects_extra['mathlib'] - elif ( libname == 'bobtoolz' ): - shlib_objects += shlib_objects_extra['mathlib'] - shlib_objects += shlib_objects_extra['cmdlib'] - Export( 'project', 'shlib_objects' ) - module = SConscript( os.path.join( build_dir, 'SConscript.module' ) ) - Default( InstallAs( os.path.join( self.install_directory, 'modules/%s.so' % libname ), module ) ) + for project in [ 'plugins/vfsqlpk3/vfsqlpk3.vcproj', + 'plugins/vfspk3/vfspk3.vcproj', + 'plugins/vfspak/vfspak.vcproj', + 'plugins/vfswad/vfswad.vcproj', + 'plugins/eclassfgd/fgd.vcproj', + 'plugins/entity/entity.vcproj', + 'plugins/image/image.vcproj', + 'plugins/model/model.vcproj', + 'plugins/imagepng/imagepng.vcproj', + 'plugins/imagewal/imagewal.vcproj', + 'plugins/imagehl/imagehl.vcproj', + 'plugins/imagem8/imagem8.vcproj', + 'plugins/spritemodel/spritemodel.vcproj', + 'plugins/textool/textool.vcproj', + 'plugins/map/map.vcproj', + 'plugins/mapxml/mapxml.vcproj', + 'plugins/shaders/shaders.vcproj', + 'plugins/surface/surface.vcproj', + 'plugins/surface_ufoai/surface_ufoai.vcproj', + 'plugins/surface_quake2/surface_quake2.vcproj', + 'plugins/surface_heretic2/surface_heretic2.vcproj', + 'contrib/camera/camera.vcproj', + 'contrib/prtview/prtview.vcproj', + 'contrib/hydratoolz/hydratoolz.vcproj', + 'contrib/bobtoolz/bobtoolz.vcproj', + 'contrib/gtkgensurf/gtkgensurf.vcproj', + 'contrib/ufoai/ufoai.vcproj', + 'contrib/bkgrnd2d/bkgrnd2d.vcproj' + ]: + ( libpath, libname ) = os.path.split( project ) + libname = os.path.splitext( libname )[0] + # The old code assigned shlib_objects to shlib_objects_extra['synapse'], + # and this resulted in a non-copy. Stuff is added to shlib_objects below. + # So we need the explicit copy so we don't modify shlib_objects_extra['synapse']. + shlib_objects = shlib_objects_extra['synapse'][:] + if ( libname == 'camera' ): + shlib_objects += shlib_objects_extra['splines'] + elif ( libname == 'entity' ): + shlib_objects += shlib_objects_extra['mathlib'] + elif ( libname == 'map' ): + shlib_objects += shlib_objects_extra['cmdlib'] + elif ( libname == 'model' ): + shlib_objects += shlib_objects_extra['picomodel'] + shlib_objects += shlib_objects_extra['mathlib'] + elif ( libname == 'spritemodel' ): + shlib_objects += shlib_objects_extra['mathlib'] + elif ( libname == 'textool' ): + shlib_objects += shlib_objects_extra['mathlib'] + elif ( libname == 'bobtoolz' ): + shlib_objects += shlib_objects_extra['mathlib'] + shlib_objects += shlib_objects_extra['cmdlib'] + Export( 'project', 'shlib_objects' ) + module = SConscript( os.path.join( build_dir, 'SConscript.module' ) ) + Default( InstallAs( os.path.join( self.install_directory, 'modules/%s.so' % libname ), module ) ) - def emit_q3map2( self, urt = False ): - if ( urt ): - compiler_name = 'q3map2_urt' - sconscript_name = 'SConscript.q3map2.urt' - else: - compiler_name = 'q3map2' - sconscript_name = 'SConscript.q3map2' - settings = self - for config_name in self.config_selected: - config = {} - config['name'] = config_name - config['shared'] = False - Export( 'utils', 'settings', 'config' ) - build_dir = os.path.join( 'build', config_name, compiler_name ) - VariantDir( build_dir, '.', duplicate = 0 ) - lib_objects = [] - for project in [ 'tools/quake3/common/quake3-common.vcproj', 'libs/mathlib/mathlib.vcproj', 'libs/l_net/l_net.vcproj', 'libs/ddslib/ddslib.vcproj', 'libs/picomodel/picomodel.vcproj', 'libs/md5lib/md5lib.vcproj' ]: - Export( 'project' ) - lib_objects += SConscript( os.path.join( build_dir, 'SConscript.lib' ) ) - Export( 'lib_objects' ) + def emit_q3map2( self, urt = False ): + if ( urt ): + compiler_name = 'q3map2_urt' + sconscript_name = 'SConscript.q3map2.urt' + else: + compiler_name = 'q3map2' + sconscript_name = 'SConscript.q3map2' + settings = self + for config_name in self.config_selected: + config = {} + config['name'] = config_name + config['shared'] = False + Export( 'utils', 'settings', 'config' ) + build_dir = os.path.join( 'build', config_name, compiler_name ) + VariantDir( build_dir, '.', duplicate = 0 ) + lib_objects = [] + for project in [ 'tools/quake3/common/quake3-common.vcproj', 'libs/mathlib/mathlib.vcproj', 'libs/l_net/l_net.vcproj', 'libs/ddslib/ddslib.vcproj', 'libs/picomodel/picomodel.vcproj', 'libs/md5lib/md5lib.vcproj' ]: + Export( 'project' ) + lib_objects += SConscript( os.path.join( build_dir, 'SConscript.lib' ) ) + Export( 'lib_objects' ) - q3map2 = SConscript( os.path.join( build_dir, sconscript_name ) ) - Default( InstallAs( os.path.join( self.install_directory, compiler_name ), q3map2 ) ) + q3map2 = SConscript( os.path.join( build_dir, sconscript_name ) ) + Default( InstallAs( os.path.join( self.install_directory, compiler_name ), q3map2 ) ) - def emit_q3data( self ): - settings = self - for config_name in self.config_selected: - config = {} - config['name'] = config_name - config['shared'] = False - Export( 'utils', 'settings', 'config' ) - build_dir = os.path.join( 'build', config_name, 'q3data' ) - VariantDir( build_dir, '.', duplicate = 0 ) - lib_objects = [] - for project in [ 'libs/mathlib/mathlib.vcproj', 'libs/l_net/l_net.vcproj', 'libs/ddslib/ddslib.vcproj' ]: - Export( 'project' ) - lib_objects += SConscript( os.path.join( build_dir, 'SConscript.lib' ) ) - Export( 'lib_objects' ) - q3data = SConscript( os.path.join( build_dir, 'SConscript.q3data' ) ) - Default( InstallAs( os.path.join( self.install_directory, 'q3data' ), q3data ) ) + def emit_q3data( self ): + settings = self + for config_name in self.config_selected: + config = {} + config['name'] = config_name + config['shared'] = False + Export( 'utils', 'settings', 'config' ) + build_dir = os.path.join( 'build', config_name, 'q3data' ) + VariantDir( build_dir, '.', duplicate = 0 ) + lib_objects = [] + for project in [ 'libs/mathlib/mathlib.vcproj', 'libs/l_net/l_net.vcproj', 'libs/ddslib/ddslib.vcproj' ]: + Export( 'project' ) + lib_objects += SConscript( os.path.join( build_dir, 'SConscript.lib' ) ) + Export( 'lib_objects' ) + q3data = SConscript( os.path.join( build_dir, 'SConscript.q3data' ) ) + Default( InstallAs( os.path.join( self.install_directory, 'q3data' ), q3data ) ) - def emit( self ): - if 'radiant' in self.target_selected: - self.emit_radiant() - if 'q3map2' in self.target_selected: - self.emit_q3map2( urt = False ) - self.emit_q3map2( urt = True ) - if 'q3data' in self.target_selected: - self.emit_q3data() - if 'setup' in self.target_selected: - self.Setup() + def emit( self ): + if 'radiant' in self.target_selected: + self.emit_radiant() + if 'q3map2' in self.target_selected: + self.emit_q3map2( urt = False ) + self.emit_q3map2( urt = True ) + if 'q3data' in self.target_selected: + self.emit_q3data() + if 'setup' in self.target_selected: + self.Setup() - if ( self.platform == 'Linux' ): - finish_command = Command( 'finish', [], self.FinishBuild ) - Depends( finish_command, DEFAULT_TARGETS ) - Default( finish_command ) + if ( self.platform == 'Linux' ): + finish_command = Command( 'finish', [], self.FinishBuild ) + Depends( finish_command, DEFAULT_TARGETS ) + Default( finish_command ) - def SetupEnvironment( self, env, config, useGtk = False, useGtkGL = False, useJPEG = False, useZ = False, usePNG = False ): - env['CC'] = self.cc - env['CXX'] = self.cxx - ( ret, xml2 ) = commands.getstatusoutput( 'xml2-config --cflags' ) - if ( ret != 0 ): - print 'xml2-config failed' - assert( False ) - xml2libs = commands.getoutput( 'xml2-config --libs' ) - env.Append( LINKFLAGS = xml2libs.split( ' ' ) ) - baseflags = [ '-pipe', '-Wall', '-fmessage-length=0', '-fvisibility=hidden', xml2.split( ' ' ) ] + def SetupEnvironment( self, env, config, useGtk = False, useGtkGL = False, useJPEG = False, useZ = False, usePNG = False ): + env['CC'] = self.cc + env['CXX'] = self.cxx + ( ret, xml2 ) = commands.getstatusoutput( 'xml2-config --cflags' ) + if ( ret != 0 ): + print 'xml2-config failed' + assert( False ) + xml2libs = commands.getoutput( 'xml2-config --libs' ) + env.Append( LINKFLAGS = xml2libs.split( ' ' ) ) + baseflags = [ '-pipe', '-Wall', '-fmessage-length=0', '-fvisibility=hidden', xml2.split( ' ' ) ] - if ( useGtk ): - env.ParseConfig( 'pkg-config gtk+-2.0 --cflags --libs' ) - env.ParseConfig( 'pkg-config x11 --cflags --libs' ) - else: - # always setup at least glib - env.ParseConfig( 'pkg-config glib-2.0 --cflags --libs' ) + if ( useGtk ): + env.ParseConfig( 'pkg-config gtk+-2.0 --cflags --libs' ) + env.ParseConfig( 'pkg-config x11 --cflags --libs' ) + else: + # always setup at least glib + env.ParseConfig( 'pkg-config glib-2.0 --cflags --libs' ) - if ( useGtkGL ): - env.ParseConfig( 'pkg-config glu --cflags --libs' ) - env.ParseConfig( 'pkg-config gtkglext-1.0 --cflags --libs' ) - if ( useJPEG ): - env.Append( LIBS = 'jpeg' ) - if ( usePNG ): - pnglibs = 'png' - env.Append( LIBS = pnglibs.split( ' ' ) ) - env.ParseConfig( 'pkg-config zlib --cflags --libs' ) - if ( useZ ): - env.ParseConfig( 'pkg-config zlib --cflags --libs' ) + if ( useGtkGL ): + env.ParseConfig( 'pkg-config glu --cflags --libs' ) + env.ParseConfig( 'pkg-config gtkglext-1.0 --cflags --libs' ) + if ( useJPEG ): + env.Append( LIBS = 'jpeg' ) + if ( usePNG ): + pnglibs = 'png' + env.Append( LIBS = pnglibs.split( ' ' ) ) + env.ParseConfig( 'pkg-config zlib --cflags --libs' ) + if ( useZ ): + env.ParseConfig( 'pkg-config zlib --cflags --libs' ) - env.Append( CCFLAGS = baseflags ) - env.Append( CXXFLAGS = baseflags + [ '-fpermissive', '-fvisibility-inlines-hidden' ] ) - env.Append( CPPPATH = [ 'include', 'libs' ] ) - env.Append( CPPDEFINES = [ 'Q_NO_STLPORT' ] ) - if ( config == 'debug' ): - env.Append( CFLAGS = [ '-g' ] ) - env.Append( CXXFLAGS = [ '-g' ] ) - env.Append( CPPDEFINES = [ '_DEBUG' ] ) - else: - env.Append( CFLAGS = [ '-O2', '-fno-strict-aliasing' ] ) - env.Append( CXXFLAGS = [ '-O2', '-fno-strict-aliasing' ] ) + env.Append( CCFLAGS = baseflags ) + env.Append( CXXFLAGS = baseflags + [ '-fpermissive', '-fvisibility-inlines-hidden' ] ) + env.Append( CPPPATH = [ 'include', 'libs' ] ) + env.Append( CPPDEFINES = [ 'Q_NO_STLPORT' ] ) + if ( config == 'debug' ): + env.Append( CFLAGS = [ '-g' ] ) + env.Append( CXXFLAGS = [ '-g' ] ) + env.Append( CPPDEFINES = [ '_DEBUG' ] ) + else: + env.Append( CFLAGS = [ '-O2', '-fno-strict-aliasing' ] ) + env.Append( CXXFLAGS = [ '-O2', '-fno-strict-aliasing' ] ) - # this lets us catch libjpg and libpng libraries that we put in the same directory as radiant.bin - env.Append( LINKFLAGS = '-Wl,-rpath,.' ) + # this lets us catch libjpg and libpng libraries that we put in the same directory as radiant.bin + env.Append( LINKFLAGS = '-Wl,-rpath,.' ) + + # On Mac, we pad headers so that we may rewrite them for packaging + if ( self.platform == 'Darwin') : + env.Append( LINKFLAGS = [ '-headerpad_max_install_names' ] ) - def CheckoutOrUpdate( self, svnurl, path ): - if ( os.path.exists( path ) ): - cmd = [ 'svn', 'update', path ] - else: - cmd = [ 'svn', 'checkout', svnurl, path ] - print( repr( cmd ) ) - subprocess.check_call( cmd ) + def CheckoutOrUpdate( self, svnurl, path ): + if ( os.path.exists( path ) ): + cmd = [ 'svn', 'update', path ] + else: + cmd = [ 'svn', 'checkout', svnurl, path ] + print( repr( cmd ) ) + subprocess.check_call( cmd ) - def FetchGamePaks( self, path ): - for pak in self.setup_packs: - svnurl = 'svn://svn.icculus.org/gtkradiant-gamepacks/%s/trunk' % pak - self.CheckoutOrUpdate( svnurl, os.path.join( path, 'installs', pak ) ) + def FetchGamePaks( self, path ): + for pak in self.setup_packs: + svnurl = 'svn://svn.icculus.org/gtkradiant-gamepacks/%s/trunk' % pak + self.CheckoutOrUpdate( svnurl, os.path.join( path, 'installs', pak ) ) - def CopyTree( self, src, dst): - for root, dirs, files in os.walk( src ): - target_dir = os.path.join( dst, root[root.find( '/' )+1:] ) - print ( target_dir ) - if ( not os.path.exists( target_dir ) ): - os.mkdir( target_dir ) + def CopyTree( self, src, dst): + for root, dirs, files in os.walk( src ): + target_dir = os.path.join( dst, root[root.find( '/' )+1:] ) + print ( target_dir ) + if ( not os.path.exists( target_dir ) ): + os.mkdir( target_dir ) - for file in files: - shutil.copy( os.path.join( root, file ), os.path.join( target_dir, file ) ) + for file in files: + shutil.copy( os.path.join( root, file ), os.path.join( target_dir, file ) ) - def Setup( self ): - try: - self.setup_platforms.index( 'local' ) - except: - pass - else: - # special case, fetch external paks under the local install directory - self.FetchGamePaks( self.install_directory ) - # NOTE: unrelated to self.setup_platforms - grab support files and binaries and install them - if ( self.platform == 'Windows' ): - backup_cwd = os.getcwd() - for lib_archive in [ - 'gtk+-bundle-2.16.6-20100912-3-win32.zip', - 'gtkglext-1.2.0-3-win32.zip', - 'libxml2-2.7.3-2-win32.zip', - 'jpeg-8c-4-win32.zip', - 'STLport-5.2.1-4.zip' - ]: - if ( not os.path.exists( lib_archive ) ): - print( 'downloading %s' % lib_archive ) - archive_web_request = urllib2.urlopen( 'http://icculus.org/gtkradiant/files/1.6.2/%s' % lib_archive ) - archive_File = open( lib_archive, 'wb' ) - while True: - data = archive_web_request.read( 1048576 ) #read 1mb at a time - if not data: - break - archive_File.write( data ) + def Setup( self ): + try: + self.setup_platforms.index( 'local' ) + except: + pass + else: + # special case, fetch external paks under the local install directory + self.FetchGamePaks( self.install_directory ) + # NOTE: unrelated to self.setup_platforms - grab support files and binaries and install them + if ( self.platform == 'Windows' ): + backup_cwd = os.getcwd() + for lib_archive in [ + 'gtk+-bundle-2.16.6-20100912-3-win32.zip', + 'gtkglext-1.2.0-3-win32.zip', + 'libxml2-2.7.3-2-win32.zip', + 'jpeg-8c-4-win32.zip', + 'STLport-5.2.1-4.zip' + ]: + if ( not os.path.exists( lib_archive ) ): + print( 'downloading %s' % lib_archive ) + archive_web_request = urllib2.urlopen( 'http://icculus.org/gtkradiant/files/1.6.2/%s' % lib_archive ) + archive_File = open( lib_archive, 'wb' ) + while True: + data = archive_web_request.read( 1048576 ) #read 1mb at a time + if not data: + break + archive_File.write( data ) - archive_web_request.close() - archive_File.close() + archive_web_request.close() + archive_File.close() - print( 'unpacking %s' % lib_archive ) - lib_archive_path = os.path.abspath( lib_archive ) - os.chdir( os.path.dirname( backup_cwd ) ) + print( 'unpacking %s' % lib_archive ) + lib_archive_path = os.path.abspath( lib_archive ) + os.chdir( os.path.dirname( backup_cwd ) ) - archive_Zip = zipfile.ZipFile( lib_archive_path, 'r' ) - archive_Zip.extractall() - archive_Zip.close() + archive_Zip = zipfile.ZipFile( lib_archive_path, 'r' ) + archive_Zip.extractall() + archive_Zip.close() - os.chdir( backup_cwd ) + os.chdir( backup_cwd ) - # copy all the dependent runtime data to the install directory - srcdir = os.path.dirname( backup_cwd ) - for dll in [ - 'gtk-2.16.6/bin/freetype6.dll', - 'gtk-2.16.6/bin/intl.dll', - 'gtk-2.16.6/bin/libasprintf-0.dll', - 'gtk-2.16.6/bin/libatk-1.0-0.dll', - 'gtk-2.16.6/bin/libcairo-2.dll', - 'gtk-2.16.6/bin/libexpat-1.dll', - 'gtk-2.16.6/bin/libfontconfig-1.dll', - 'gtk-2.16.6/bin/libgailutil-18.dll', - 'gtk-2.16.6/bin/libgcc_s_dw2-1.dll', - 'gtk-2.16.6/bin/libgdk-win32-2.0-0.dll', - 'gtk-2.16.6/bin/libgdk_pixbuf-2.0-0.dll', - 'gtk-2.16.6/bin/libgio-2.0-0.dll', - 'gtk-2.16.6/bin/libglib-2.0-0.dll', - 'gtk-2.16.6/bin/libgmodule-2.0-0.dll', - 'gtk-2.16.6/bin/libgobject-2.0-0.dll', - 'gtk-2.16.6/bin/libgthread-2.0-0.dll', - 'gtk-2.16.6/bin/libgtk-win32-2.0-0.dll', - 'gtk-2.16.6/bin/libpango-1.0-0.dll', - 'gtk-2.16.6/bin/libpangocairo-1.0-0.dll', - 'gtk-2.16.6/bin/libpangoft2-1.0-0.dll', - 'gtk-2.16.6/bin/libpangowin32-1.0-0.dll', - 'gtk-2.16.6/bin/libpng14-14.dll', - 'gtk-2.16.6/bin/zlib1.dll', - 'gtk-2.16.6/lib/GNU.Gettext.dll', - 'gtk-2.16.6/lib/gtk-2.0/2.10.0/engines/libpixmap.dll', - 'gtk-2.16.6/lib/gtk-2.0/2.10.0/engines/libwimp.dll', - 'gtk-2.16.6/lib/gtk-2.0/modules/libgail.dll', - 'gtkglext-1.2.0/bin/libgdkglext-win32-1.0-0.dll', - 'gtkglext-1.2.0/bin/libgtkglext-win32-1.0-0.dll', - 'libxml2-2.7.3/bin/libxml2-2.dll' - ]: - shutil.copy( os.path.join( srcdir, dll ), 'install' ) + # copy all the dependent runtime data to the install directory + srcdir = os.path.dirname( backup_cwd ) + for dll in [ + 'gtk-2.16.6/bin/freetype6.dll', + 'gtk-2.16.6/bin/intl.dll', + 'gtk-2.16.6/bin/libasprintf-0.dll', + 'gtk-2.16.6/bin/libatk-1.0-0.dll', + 'gtk-2.16.6/bin/libcairo-2.dll', + 'gtk-2.16.6/bin/libexpat-1.dll', + 'gtk-2.16.6/bin/libfontconfig-1.dll', + 'gtk-2.16.6/bin/libgailutil-18.dll', + 'gtk-2.16.6/bin/libgcc_s_dw2-1.dll', + 'gtk-2.16.6/bin/libgdk-win32-2.0-0.dll', + 'gtk-2.16.6/bin/libgdk_pixbuf-2.0-0.dll', + 'gtk-2.16.6/bin/libgio-2.0-0.dll', + 'gtk-2.16.6/bin/libglib-2.0-0.dll', + 'gtk-2.16.6/bin/libgmodule-2.0-0.dll', + 'gtk-2.16.6/bin/libgobject-2.0-0.dll', + 'gtk-2.16.6/bin/libgthread-2.0-0.dll', + 'gtk-2.16.6/bin/libgtk-win32-2.0-0.dll', + 'gtk-2.16.6/bin/libpango-1.0-0.dll', + 'gtk-2.16.6/bin/libpangocairo-1.0-0.dll', + 'gtk-2.16.6/bin/libpangoft2-1.0-0.dll', + 'gtk-2.16.6/bin/libpangowin32-1.0-0.dll', + 'gtk-2.16.6/bin/libpng14-14.dll', + 'gtk-2.16.6/bin/zlib1.dll', + 'gtk-2.16.6/lib/GNU.Gettext.dll', + 'gtk-2.16.6/lib/gtk-2.0/2.10.0/engines/libpixmap.dll', + 'gtk-2.16.6/lib/gtk-2.0/2.10.0/engines/libwimp.dll', + 'gtk-2.16.6/lib/gtk-2.0/modules/libgail.dll', + 'gtkglext-1.2.0/bin/libgdkglext-win32-1.0-0.dll', + 'gtkglext-1.2.0/bin/libgtkglext-win32-1.0-0.dll', + 'libxml2-2.7.3/bin/libxml2-2.dll' + ]: + shutil.copy( os.path.join( srcdir, dll ), 'install' ) - for extra in [ - 'gtk-2.16.6/etc', - 'gtk-2.16.6/share', - 'gtkglext-1.2.0/share', - 'libxml2-2.7.3/share' - ]: - self.CopyTree( os.path.join( srcdir, extra ), 'install' ) + for extra in [ + 'gtk-2.16.6/etc', + 'gtk-2.16.6/share', + 'gtkglext-1.2.0/share', + 'libxml2-2.7.3/share' + ]: + self.CopyTree( os.path.join( srcdir, extra ), 'install' ) def FinishBuild( self, target, source, env ): print( 'Lookup and bundle the PNG and JPEG libraries' ) @@ -365,8 +370,8 @@ class Config: # print( module_ldd ) def find_library( output, libname ): - match = filter( lambda l : l.find( libname ) != -1, output.split( '\n' ) )[0] - return re.split( '.*=> (.*) .*', match )[1] + match = filter( lambda l : l.find( libname ) != -1, output.split( '\n' ) )[0] + return re.split( '.*=> (.*) .*', match )[1] jpeg_path = find_library( module_ldd, 'libjpeg' ) print( 'JPEG library: %s' % repr( jpeg_path ) ) @@ -379,115 +384,115 @@ class Config: # parse the config statement line to produce/update an existing config list # the configs expose a list of keywords and accepted values, which the engine parses out class ConfigParser: - def __init__( self ): - self.operators = {} + def __init__( self ): + self.operators = {} - def _processOp( self, ops ): - assert( len( ops ) == 1 ) - op = ops.pop() - if ( op == 'clear' ): - self.configs = [] - self.current_config = None - elif ( op == 'pop' ): - self.configs.pop() - self.current_config = None - elif ( op == 'push' ): - self.configs.append( self.current_config ) - self.current_config = Config() - self._setupParser( self.current_config ) + def _processOp( self, ops ): + assert( len( ops ) == 1 ) + op = ops.pop() + if ( op == 'clear' ): + self.configs = [] + self.current_config = None + elif ( op == 'pop' ): + self.configs.pop() + self.current_config = None + elif ( op == 'push' ): + self.configs.append( self.current_config ) + self.current_config = Config() + self._setupParser( self.current_config ) - def _setupParser( self, c ): - self.operators = { 'op' : self._processOp } - c.setupParser( self.operators ) + def _setupParser( self, c ): + self.operators = { 'op' : self._processOp } + c.setupParser( self.operators ) - def _parseStatement( self, s ): - statement_re = re.compile( '(.*)=(.*)' ) - value_list_re = re.compile( '([^,]*),?' ) - if ( not statement_re.match( s ) ): - print 'syntax error (statement match): %s' % repr( s ) - return - statement_split = statement_re.split( s ) - if ( len( statement_split ) != 4 ): - print 'syntax error (statement split): %s' % repr( s ) - return - ( foo, name, value, bar ) = statement_split - value_split = value_list_re.split( value ) - if ( len( value_split ) < 2 or len( value_split ) % 2 != 1 ): - print 'syntax error (value split): %s' % ( repr( value_split ) ) - return - try: - value_array = [] - value_split.reverse() - value_split.pop() - while ( len( value_split ) != 0 ): - value_array.append( value_split.pop() ) - value_split.pop() - except: - print traceback.print_exception( sys.exc_type, sys.exc_value, sys.exc_traceback ) - print 'syntax error (value to array): %s' % ( repr( value_split ) ) - return + def _parseStatement( self, s ): + statement_re = re.compile( '(.*)=(.*)' ) + value_list_re = re.compile( '([^,]*),?' ) + if ( not statement_re.match( s ) ): + print 'syntax error (statement match): %s' % repr( s ) + return + statement_split = statement_re.split( s ) + if ( len( statement_split ) != 4 ): + print 'syntax error (statement split): %s' % repr( s ) + return + ( foo, name, value, bar ) = statement_split + value_split = value_list_re.split( value ) + if ( len( value_split ) < 2 or len( value_split ) % 2 != 1 ): + print 'syntax error (value split): %s' % ( repr( value_split ) ) + return + try: + value_array = [] + value_split.reverse() + value_split.pop() + while ( len( value_split ) != 0 ): + value_array.append( value_split.pop() ) + value_split.pop() + except: + print traceback.print_exception( sys.exc_type, sys.exc_value, sys.exc_traceback ) + print 'syntax error (value to array): %s' % ( repr( value_split ) ) + return - return ( name, value_array ) + return ( name, value_array ) - def parseStatements( self, _configs, statements ): - self.current_config = None - self.configs = _configs - if ( self.configs is None ): - self.configs = [] - for s in statements: + def parseStatements( self, _configs, statements ): + self.current_config = None + self.configs = _configs + if ( self.configs is None ): + self.configs = [] + for s in statements: - if ( self.current_config is None ): - # use a provided config, or create a default one - if ( len( self.configs ) > 0 ): - self.current_config = self.configs.pop() - else: - self.current_config = Config() - # setup the operator table for this config - # NOTE: have that in self._processOp too - self._setupParser( self.current_config ) + if ( self.current_config is None ): + # use a provided config, or create a default one + if ( len( self.configs ) > 0 ): + self.current_config = self.configs.pop() + else: + self.current_config = Config() + # setup the operator table for this config + # NOTE: have that in self._processOp too + self._setupParser( self.current_config ) - ret = self._parseStatement( s ) - if ( ret is None ): - print 'stop statement parse at %s' % repr( s ) - break - ( name, value_array ) = ret - try: - processor = self.operators[name] - except: - print 'unknown operator %s - stop statement parse at %s' % ( repr( name ), repr( s ) ) - break - processor( value_array ) + ret = self._parseStatement( s ) + if ( ret is None ): + print 'stop statement parse at %s' % repr( s ) + break + ( name, value_array ) = ret + try: + processor = self.operators[name] + except: + print 'unknown operator %s - stop statement parse at %s' % ( repr( name ), repr( s ) ) + break + processor( value_array ) - if ( not self.current_config is None ): - self.configs.append( self.current_config ) - # make sure there is at least one config - if ( len( self.configs ) == 0 ): - print 'pushing a default config' - self.configs.append( Config() ) - return self.configs + if ( not self.current_config is None ): + self.configs.append( self.current_config ) + # make sure there is at least one config + if ( len( self.configs ) == 0 ): + print 'pushing a default config' + self.configs.append( Config() ) + return self.configs import unittest class TestConfigParse( unittest.TestCase ): - def setUp( self ): - self.parser = ConfigParser() + def setUp( self ): + self.parser = ConfigParser() - def testBasicParse( self ): - # test basic config parsing - # needs to cleanly stop at the first config statement that is not recognized - configs = self.parser.parseStatements( None, [ 'game=missionpack', 'config=qvm', 'foobar' ] ) - print repr( configs ) + def testBasicParse( self ): + # test basic config parsing + # needs to cleanly stop at the first config statement that is not recognized + configs = self.parser.parseStatements( None, [ 'game=missionpack', 'config=qvm', 'foobar' ] ) + print repr( configs ) - def testMultiParse( self ): - # multiple configs seperated by commas - configs = self.parser.parseStatements( None, [ 'target=server,game,cgame' ] ) - print repr( configs ) + def testMultiParse( self ): + # multiple configs seperated by commas + configs = self.parser.parseStatements( None, [ 'target=server,game,cgame' ] ) + print repr( configs ) - def testOp( self ): - # test the operator for multiple configs - configs = self.parser.parseStatements( None, [ 'target=core', 'config=release', 'op=push', 'target=game,cgame,ui', 'config=debug' ] ) - print repr( configs ) + def testOp( self ): + # test the operator for multiple configs + configs = self.parser.parseStatements( None, [ 'target=core', 'config=release', 'op=push', 'target=game,cgame,ui', 'config=debug' ] ) + print repr( configs ) if __name__ == '__main__': - unittest.main() + unittest.main() From 09126695d9d65eeb774775a1dfd8e49bff597bea Mon Sep 17 00:00:00 2001 From: jdolan Date: Thu, 27 Jun 2013 00:36:58 -0400 Subject: [PATCH 06/14] Vastly simplify the .app structure. Radiant runs. --- apple/GtkRadiant.app/Contents/MacOS/radiant | 19 +++-- .../etc/gtk-2.0/gtk.immodules | 0 .../{gtk-runtime => }/etc/gtk-2.0/gtkrc | 0 .../{gtk-runtime => }/etc/pango/pangorc | 0 .../Resources/{ => install}/bitmaps/.turd | 0 .../Resources/{ => install}/games/.turd | 0 .../lib => install/installs}/.turd | 0 .../icons => install/modules/bitmaps}/.turd | 0 .../share/gtk-2.0/themes => lib}/.turd | 0 .../{installs => share/gtk-2.0/icons}/.turd | 0 .../bitmaps => share/gtk-2.0/themes}/.turd | 0 apple/Makefile | 76 ++++++++----------- 12 files changed, 41 insertions(+), 54 deletions(-) rename apple/GtkRadiant.app/Contents/Resources/{gtk-runtime => }/etc/gtk-2.0/gtk.immodules (100%) rename apple/GtkRadiant.app/Contents/Resources/{gtk-runtime => }/etc/gtk-2.0/gtkrc (100%) rename apple/GtkRadiant.app/Contents/Resources/{gtk-runtime => }/etc/pango/pangorc (100%) rename apple/GtkRadiant.app/Contents/Resources/{ => install}/bitmaps/.turd (100%) rename apple/GtkRadiant.app/Contents/Resources/{ => install}/games/.turd (100%) rename apple/GtkRadiant.app/Contents/Resources/{gtk-runtime/lib => install/installs}/.turd (100%) rename apple/GtkRadiant.app/Contents/Resources/{gtk-runtime/share/gtk-2.0/icons => install/modules/bitmaps}/.turd (100%) rename apple/GtkRadiant.app/Contents/Resources/{gtk-runtime/share/gtk-2.0/themes => lib}/.turd (100%) rename apple/GtkRadiant.app/Contents/Resources/{installs => share/gtk-2.0/icons}/.turd (100%) rename apple/GtkRadiant.app/Contents/Resources/{modules/bitmaps => share/gtk-2.0/themes}/.turd (100%) diff --git a/apple/GtkRadiant.app/Contents/MacOS/radiant b/apple/GtkRadiant.app/Contents/MacOS/radiant index 8ff4de42..40af99ff 100755 --- a/apple/GtkRadiant.app/Contents/MacOS/radiant +++ b/apple/GtkRadiant.app/Contents/MacOS/radiant @@ -9,15 +9,18 @@ echo set -x -GTK_RUNTIME="${RADIANT_HOME}/Contents/Resources/gtk-runtime" +resources="${RADIANT_HOME}/Contents/Resources" -export GDK_PIXBUF_MODULE_FILE="${GTK_RUNTIME}/etc/gtk-2.0/gdk-pixbuf.loaders" +export GDK_PIXBUF_MODULE_FILE="${resources}/etc/gtk-2.0/gdk-pixbuf.loaders" -export GTK_DATA_PREFIX="${GTK_RUNTIME}" -export GTK_EXE_PREFIX="${GTK_RUNTIME}" -export GTK_PATH="${GTK_RUNTIME}" +export GTK_DATA_PREFIX="${resources}" +export GTK_EXE_PREFIX="${resources}" +export GTK_PATH="${resources}" -export PANGO_SYSCONFDIR="${GTK_RUNTIME}/etc" -export PANGO_LIBDIR="${GTK_RUNTIME}/lib" +export PANGO_SYSCONFDIR="${resources}/etc" +export PANGO_LIBDIR="${resources}/lib" -"${RADIANT_HOME}/Contents/MacOS/radiant.bin" \ No newline at end of file +cd "${resources}/install" +./radiant.bin $@ + +set +x \ No newline at end of file diff --git a/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/etc/gtk-2.0/gtk.immodules b/apple/GtkRadiant.app/Contents/Resources/etc/gtk-2.0/gtk.immodules similarity index 100% rename from apple/GtkRadiant.app/Contents/Resources/gtk-runtime/etc/gtk-2.0/gtk.immodules rename to apple/GtkRadiant.app/Contents/Resources/etc/gtk-2.0/gtk.immodules diff --git a/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/etc/gtk-2.0/gtkrc b/apple/GtkRadiant.app/Contents/Resources/etc/gtk-2.0/gtkrc similarity index 100% rename from apple/GtkRadiant.app/Contents/Resources/gtk-runtime/etc/gtk-2.0/gtkrc rename to apple/GtkRadiant.app/Contents/Resources/etc/gtk-2.0/gtkrc diff --git a/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/etc/pango/pangorc b/apple/GtkRadiant.app/Contents/Resources/etc/pango/pangorc similarity index 100% rename from apple/GtkRadiant.app/Contents/Resources/gtk-runtime/etc/pango/pangorc rename to apple/GtkRadiant.app/Contents/Resources/etc/pango/pangorc diff --git a/apple/GtkRadiant.app/Contents/Resources/bitmaps/.turd b/apple/GtkRadiant.app/Contents/Resources/install/bitmaps/.turd similarity index 100% rename from apple/GtkRadiant.app/Contents/Resources/bitmaps/.turd rename to apple/GtkRadiant.app/Contents/Resources/install/bitmaps/.turd diff --git a/apple/GtkRadiant.app/Contents/Resources/games/.turd b/apple/GtkRadiant.app/Contents/Resources/install/games/.turd similarity index 100% rename from apple/GtkRadiant.app/Contents/Resources/games/.turd rename to apple/GtkRadiant.app/Contents/Resources/install/games/.turd diff --git a/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/lib/.turd b/apple/GtkRadiant.app/Contents/Resources/install/installs/.turd similarity index 100% rename from apple/GtkRadiant.app/Contents/Resources/gtk-runtime/lib/.turd rename to apple/GtkRadiant.app/Contents/Resources/install/installs/.turd diff --git a/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/share/gtk-2.0/icons/.turd b/apple/GtkRadiant.app/Contents/Resources/install/modules/bitmaps/.turd similarity index 100% rename from apple/GtkRadiant.app/Contents/Resources/gtk-runtime/share/gtk-2.0/icons/.turd rename to apple/GtkRadiant.app/Contents/Resources/install/modules/bitmaps/.turd diff --git a/apple/GtkRadiant.app/Contents/Resources/gtk-runtime/share/gtk-2.0/themes/.turd b/apple/GtkRadiant.app/Contents/Resources/lib/.turd similarity index 100% rename from apple/GtkRadiant.app/Contents/Resources/gtk-runtime/share/gtk-2.0/themes/.turd rename to apple/GtkRadiant.app/Contents/Resources/lib/.turd diff --git a/apple/GtkRadiant.app/Contents/Resources/installs/.turd b/apple/GtkRadiant.app/Contents/Resources/share/gtk-2.0/icons/.turd similarity index 100% rename from apple/GtkRadiant.app/Contents/Resources/installs/.turd rename to apple/GtkRadiant.app/Contents/Resources/share/gtk-2.0/icons/.turd diff --git a/apple/GtkRadiant.app/Contents/Resources/modules/bitmaps/.turd b/apple/GtkRadiant.app/Contents/Resources/share/gtk-2.0/themes/.turd similarity index 100% rename from apple/GtkRadiant.app/Contents/Resources/modules/bitmaps/.turd rename to apple/GtkRadiant.app/Contents/Resources/share/gtk-2.0/themes/.turd diff --git a/apple/Makefile b/apple/Makefile index 008d4692..e13f8824 100644 --- a/apple/Makefile +++ b/apple/Makefile @@ -2,17 +2,16 @@ INSTALL = ../install TARGET = target -GTKRADIANT = $(TARGET)/GtkRadiant.app -BINARIES = $(GTKRADIANT)/Contents/MacOS -LIBRARIES = $(GTKRADIANT)/Contents/MacOS/lib -RESOURCES = $(GTKRADIANT)/Contents/Resources +RESOURCES = $(TARGET)/GtkRadiant.app/Contents/Resources +CONFDIR = $(RESOURCES)/etc +DATADIR = $(RESOURCES)/share +LIBDIR = $(RESOURCES)/lib +INSTDIR = $(RESOURCES)/install +PREFIX_SED_EXPR = 's:/opt/local:@executable_path/..:g' VERSION = 1.6.4 DMG = $(TARGET)/GtkRadiant-$(VERSION).dmg VOLUME_NAME = "GtkRadiant $(VERSION)" -GTK_RUNTIME = $(RESOURCES)/gtk-runtime -GTK_PREFIX_EXPR = 's:/opt/local:@executable_path/../Resources/gtk-runtime:g' - all: install pre-install: @@ -21,60 +20,45 @@ pre-install: find $(TARGET) -name .turd -delete install: pre-install - install $(INSTALL)/radiant.bin $(BINARIES)/radiant.bin - install $(INSTALL)/q3map2 $(BINARIES)/q3map2 - install $(INSTALL)/q3map2_urt $(BINARIES)/q3map2_urt - install $(INSTALL)/q3data $(BINARIES)/q3data + cp -r $(INSTALL) $(RESOURCES) + rm -rf `find $(INSTDIR)/installs -type d -name .svn` + +gtk-runtime: + gdk-pixbuf-query-loaders | sed $(PREFIX_SED_EXPR) > \ + $(CONFDIR)/gtk-2.0/gdk-pixbuf.loaders - install $(INSTALL)/bitmaps/*.* $(RESOURCES)/bitmaps + pango-querymodules | sed $(PREFIX_SED_EXPR) > \ + $(CONFDIR)/pango/pango.modules - install $(INSTALL)/modules/*.so $(RESOURCES)/modules - install $(INSTALL)/modules/bitmaps/*.* $(RESOURCES)/modules/bitmaps + cp -r /opt/local/lib/gdk-pixbuf-2.0 $(LIBDIR) + cp -r /opt/local/lib/pango $(LIBDIR) - @for i in $(INSTALL)/installs/*; do \ - if [ -d $$i/.svn ]; then \ - svn export --force $$i $(RESOURCES)/installs/`basename $$i` ; \ - else \ - cp -r $$i $(RESOURCES)/installs ; \ - fi \ - done + find $(LIBDIR) -type f ! -name "*.so" -delete + + dylibbundler -b \ + `find $(LIBDIR) -type f | xargs -I {} echo -x {}` \ + -d $(LIBDIR) -of -p @executable_path/../lib + + cp -r /opt/local/share/themes/Default $(RESOURCES)/share bundle: dylibbundler -b \ - -x $(BINARIES)/radiant.bin \ - -x $(BINARIES)/q3map2 \ - -x $(BINARIES)/q3map2_urt \ - -x $(BINARIES)/q3data \ - -d $(LIBRARIES) -of -p @executable_path/lib + -x $(INSTDIR)/radiant.bin \ + -x $(INSTDIR)/q3map2 \ + -x $(INSTDIR)/q3map2_urt \ + -x $(INSTDIR)/q3data \ + -d $(LIBDIR) -of -p @executable_path/../lib # The Radiant plugins (modules) are a little funky # Some of them are actually linked against the build directory ln -s ../build ./build dylibbundler -b \ - `find $(RESOURCES)/modules -name "*.so" | xargs -I {} echo -x {}` \ - -d $(LIBRARIES) -of -p @executable_path/lib + `find $(INSTDIR)/modules -name "*.so" | xargs -I {} echo -x {}` \ + -d $(LIBDIR) -of -p @executable_path/../lib rm -f build -gtk-runtime: - gdk-pixbuf-query-loaders | sed $(GTK_PREFIX_EXPR) > \ - $(GTK_RUNTIME)/etc/gtk-2.0/gdk-pixbuf.loaders - - pango-querymodules | sed $(GTK_PREFIX_EXPR) > \ - $(GTK_RUNTIME)/etc/pango/pango.modules - - cp -r /opt/local/lib/gdk-pixbuf-2.0 $(GTK_RUNTIME)/lib - cp -r /opt/local/lib/pango $(GTK_RUNTIME)/lib - - find $(GTK_RUNTIME)/lib -type f ! -name "*.so" -delete - - dylibbundler -b \ - `find $(GTK_RUNTIME)/lib -name "*.so" | xargs -I {} echo -x {}` \ - -d $(LIBRARIES) -of -p @executable_path/lib - - cp -r /opt/local/share/themes/Default $(GTK_RUNTIME)/share - image: ln -f -s /Applications $(TARGET)/Applications hdiutil create $(DMG) -srcfolder $(TARGET) -volname $(VOLUME_NAME) From 430696eacf562e3fa5bca1d055b83a738967e179 Mon Sep 17 00:00:00 2001 From: jdolan Date: Thu, 27 Jun 2013 00:39:24 -0400 Subject: [PATCH 07/14] Deletions. --- apple/GtkRadiant.app/Contents/MacOS/lib/.turd | 0 apple/GtkRadiant.app/Contents/Resources/install/bitmaps/.turd | 0 apple/GtkRadiant.app/Contents/Resources/install/games/.turd | 0 apple/GtkRadiant.app/Contents/Resources/install/installs/.turd | 0 .../Contents/Resources/install/modules/bitmaps/.turd | 0 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apple/GtkRadiant.app/Contents/MacOS/lib/.turd delete mode 100644 apple/GtkRadiant.app/Contents/Resources/install/bitmaps/.turd delete mode 100644 apple/GtkRadiant.app/Contents/Resources/install/games/.turd delete mode 100644 apple/GtkRadiant.app/Contents/Resources/install/installs/.turd delete mode 100644 apple/GtkRadiant.app/Contents/Resources/install/modules/bitmaps/.turd diff --git a/apple/GtkRadiant.app/Contents/MacOS/lib/.turd b/apple/GtkRadiant.app/Contents/MacOS/lib/.turd deleted file mode 100644 index e69de29b..00000000 diff --git a/apple/GtkRadiant.app/Contents/Resources/install/bitmaps/.turd b/apple/GtkRadiant.app/Contents/Resources/install/bitmaps/.turd deleted file mode 100644 index e69de29b..00000000 diff --git a/apple/GtkRadiant.app/Contents/Resources/install/games/.turd b/apple/GtkRadiant.app/Contents/Resources/install/games/.turd deleted file mode 100644 index e69de29b..00000000 diff --git a/apple/GtkRadiant.app/Contents/Resources/install/installs/.turd b/apple/GtkRadiant.app/Contents/Resources/install/installs/.turd deleted file mode 100644 index e69de29b..00000000 diff --git a/apple/GtkRadiant.app/Contents/Resources/install/modules/bitmaps/.turd b/apple/GtkRadiant.app/Contents/Resources/install/modules/bitmaps/.turd deleted file mode 100644 index e69de29b..00000000 From 9237b835f7a1e85762421546276bb55c60130cfd Mon Sep 17 00:00:00 2001 From: jdolan Date: Thu, 27 Jun 2013 09:32:30 -0400 Subject: [PATCH 08/14] Working with no GTK errors whatsoever, crashes on GL init. --- apple/GtkRadiant.app/Contents/MacOS/radiant | 2 +- .../Resources/etc/gtk-2.0/gtk.immodules | 0 apple/Makefile | 21 ++++++++++++++----- config.py | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) delete mode 100644 apple/GtkRadiant.app/Contents/Resources/etc/gtk-2.0/gtk.immodules diff --git a/apple/GtkRadiant.app/Contents/MacOS/radiant b/apple/GtkRadiant.app/Contents/MacOS/radiant index 40af99ff..8d06d233 100755 --- a/apple/GtkRadiant.app/Contents/MacOS/radiant +++ b/apple/GtkRadiant.app/Contents/MacOS/radiant @@ -21,6 +21,6 @@ export PANGO_SYSCONFDIR="${resources}/etc" export PANGO_LIBDIR="${resources}/lib" cd "${resources}/install" -./radiant.bin $@ +./radiant.bin set +x \ No newline at end of file diff --git a/apple/GtkRadiant.app/Contents/Resources/etc/gtk-2.0/gtk.immodules b/apple/GtkRadiant.app/Contents/Resources/etc/gtk-2.0/gtk.immodules deleted file mode 100644 index e69de29b..00000000 diff --git a/apple/Makefile b/apple/Makefile index e13f8824..6aec233c 100644 --- a/apple/Makefile +++ b/apple/Makefile @@ -1,4 +1,4 @@ -# Makefile for GtkRadiant, requires http://macdylibbundler.sourceforge.net/ +# Makefile for GtkRadiant.app, requires http://macdylibbundler.sourceforge.net/ INSTALL = ../install TARGET = target @@ -12,7 +12,7 @@ VERSION = 1.6.4 DMG = $(TARGET)/GtkRadiant-$(VERSION).dmg VOLUME_NAME = "GtkRadiant $(VERSION)" -all: install +all: install gtk-runtime bundle pre-install: install -d $(TARGET) @@ -22,21 +22,32 @@ pre-install: install: pre-install cp -r $(INSTALL) $(RESOURCES) rm -rf `find $(INSTDIR)/installs -type d -name .svn` - + gtk-runtime: gdk-pixbuf-query-loaders | sed $(PREFIX_SED_EXPR) > \ $(CONFDIR)/gtk-2.0/gdk-pixbuf.loaders + gtk-query-immodules-2.0 | sed $(PREFIX_SED_EXPR) > \ + $(CONFDIR)/gtk-2.0/gtk.immodules + pango-querymodules | sed $(PREFIX_SED_EXPR) > \ $(CONFDIR)/pango/pango.modules cp -r /opt/local/lib/gdk-pixbuf-2.0 $(LIBDIR) + cp -r /opt/local/lib/gtk-2.0 $(LIBDIR) cp -r /opt/local/lib/pango $(LIBDIR) - find $(LIBDIR) -type f ! -name "*.so" -delete + find $(LIBDIR)/gdk-pixbuf-2.0 -type f ! -name "*.so" -delete + find $(LIBDIR)/gtk-2.0 -type f ! -name "*.so" -delete + find $(LIBDIR)/pango -type f ! -name "*.so" -delete + + rm -rf $(LIBDIR)/gtk-2.0/{includes,modules} + rm -rf $(LIBDIR)/gtk-2.0/*/printbackends dylibbundler -b \ - `find $(LIBDIR) -type f | xargs -I {} echo -x {}` \ + `find $(LIBDIR)/gdk-pixbuf-2.0 -type f | xargs -I {} echo -x {}` \ + `find $(LIBDIR)/gtk-2.0 -type f | xargs -I {} echo -x {}` \ + `find $(LIBDIR)/pango -type f | xargs -I {} echo -x {}` \ -d $(LIBDIR) -of -p @executable_path/../lib cp -r /opt/local/share/themes/Default $(RESOURCES)/share diff --git a/config.py b/config.py index 1708b54a..d43e6420 100644 --- a/config.py +++ b/config.py @@ -248,7 +248,7 @@ class Config: env.Append( LINKFLAGS = '-Wl,-rpath,.' ) # On Mac, we pad headers so that we may rewrite them for packaging - if ( self.platform == 'Darwin') : + if ( self.platform == 'Darwin' ) : env.Append( LINKFLAGS = [ '-headerpad_max_install_names' ] ) def CheckoutOrUpdate( self, svnurl, path ): From 482dc447ab9747388dc06ab1b4f7b3e22a106d27 Mon Sep 17 00:00:00 2001 From: jdolan Date: Thu, 27 Jun 2013 10:02:03 -0400 Subject: [PATCH 09/14] Yea, that's definitely a crash if you don't return there, even on Apple (wtf?). --- radiant/qgl.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/radiant/qgl.c b/radiant/qgl.c index cf42a3b6..881e616e 100644 --- a/radiant/qgl.c +++ b/radiant/qgl.c @@ -1717,11 +1717,9 @@ int GL_ExtensionSupported( const char *extension ){ } extensions = qglGetString( GL_EXTENSIONS ); -#ifndef __APPLE__ if ( !extensions ) { return 0; } -#endif // It takes a bit of care to be fool-proof about parsing the // OpenGL extensions string. Don't be fooled by sub-strings, etc. From 78edf4e227e82c6d42ece01fbc52515a17d9dee6 Mon Sep 17 00:00:00 2001 From: jdolan Date: Thu, 27 Jun 2013 16:02:47 -0400 Subject: [PATCH 10/14] Make Radiant honor GDK_GL_LIBGL_PATH. This way Radiant and GtkGLExt can use the same instance of libGL.dylib. Failure to do this results in unpredictable and wrong behavior from GL. --- apple/GtkRadiant.app/Contents/MacOS/radiant | 8 ++- apple/Makefile | 59 ++++++++++----------- radiant/main.cpp | 24 ++++----- 3 files changed, 46 insertions(+), 45 deletions(-) diff --git a/apple/GtkRadiant.app/Contents/MacOS/radiant b/apple/GtkRadiant.app/Contents/MacOS/radiant index 8d06d233..0ef3a975 100755 --- a/apple/GtkRadiant.app/Contents/MacOS/radiant +++ b/apple/GtkRadiant.app/Contents/MacOS/radiant @@ -11,8 +11,14 @@ set -x resources="${RADIANT_HOME}/Contents/Resources" +export GDK_GL_LIBGL_PATH="${resources}/lib/libGL.1.dylib" +export GDK_GL_LIBGLU_PATH="${resources}/lib/libGLU.1.dylib" + +export GDK_PATH="${resources}" export GDK_PIXBUF_MODULE_FILE="${resources}/etc/gtk-2.0/gdk-pixbuf.loaders" +export GOBJECT_PATH="${resources}" + export GTK_DATA_PREFIX="${resources}" export GTK_EXE_PREFIX="${resources}" export GTK_PATH="${resources}" @@ -21,6 +27,6 @@ export PANGO_SYSCONFDIR="${resources}/etc" export PANGO_LIBDIR="${resources}/lib" cd "${resources}/install" -./radiant.bin +./radiant.bin & set +x \ No newline at end of file diff --git a/apple/Makefile b/apple/Makefile index 6aec233c..b706c837 100644 --- a/apple/Makefile +++ b/apple/Makefile @@ -12,62 +12,59 @@ VERSION = 1.6.4 DMG = $(TARGET)/GtkRadiant-$(VERSION).dmg VOLUME_NAME = "GtkRadiant $(VERSION)" -all: install gtk-runtime bundle +all: install bundle -pre-install: +-pre-install: install -d $(TARGET) cp -r GtkRadiant.app $(TARGET) find $(TARGET) -name .turd -delete - -install: pre-install - cp -r $(INSTALL) $(RESOURCES) - rm -rf `find $(INSTDIR)/installs -type d -name .svn` - -gtk-runtime: + +-gtk-runtime-gdk-pixbuf-2.0: + cp -r /opt/local/lib/gdk-pixbuf-2.0 $(LIBDIR) + find $(LIBDIR)/gdk-pixbuf-2.0 -type f ! -name "*.so" -delete + gdk-pixbuf-query-loaders | sed $(PREFIX_SED_EXPR) > \ $(CONFDIR)/gtk-2.0/gdk-pixbuf.loaders - - gtk-query-immodules-2.0 | sed $(PREFIX_SED_EXPR) > \ - $(CONFDIR)/gtk-2.0/gtk.immodules - + +-gtk-runtime-pango: + cp -r /opt/local/lib/pango $(LIBDIR) + find $(LIBDIR)/pango -type f ! -name "*.so" -delete + pango-querymodules | sed $(PREFIX_SED_EXPR) > \ $(CONFDIR)/pango/pango.modules - cp -r /opt/local/lib/gdk-pixbuf-2.0 $(LIBDIR) +-gtk-runtime: -gtk-runtime-gdk-pixbuf-2.0 -gtk-runtime-pango cp -r /opt/local/lib/gtk-2.0 $(LIBDIR) - cp -r /opt/local/lib/pango $(LIBDIR) - - find $(LIBDIR)/gdk-pixbuf-2.0 -type f ! -name "*.so" -delete find $(LIBDIR)/gtk-2.0 -type f ! -name "*.so" -delete - find $(LIBDIR)/pango -type f ! -name "*.so" -delete rm -rf $(LIBDIR)/gtk-2.0/{includes,modules} rm -rf $(LIBDIR)/gtk-2.0/*/printbackends - dylibbundler -b \ - `find $(LIBDIR)/gdk-pixbuf-2.0 -type f | xargs -I {} echo -x {}` \ - `find $(LIBDIR)/gtk-2.0 -type f | xargs -I {} echo -x {}` \ - `find $(LIBDIR)/pango -type f | xargs -I {} echo -x {}` \ - -d $(LIBDIR) -of -p @executable_path/../lib - cp -r /opt/local/share/themes/Default $(RESOURCES)/share + + gtk-query-immodules-2.0 | sed $(PREFIX_SED_EXPR) > \ + $(CONFDIR)/gtk-2.0/gtk.immodules + +install: -pre-install -gtk-runtime + cp -r $(INSTALL) $(RESOURCES) + rm -rf `find $(INSTDIR)/installs -type d -name .svn` bundle: + + # The Radiant plugins (modules) are a little funky + # Some of them are actually linked against the build directory + + ln -s ../build ./build + dylibbundler -b \ -x $(INSTDIR)/radiant.bin \ -x $(INSTDIR)/q3map2 \ -x $(INSTDIR)/q3map2_urt \ -x $(INSTDIR)/q3data \ + `find $(INSTDIR)/modules -name "*.so" | xargs -I {} echo -x {}` \ + `find $(LIBDIR) -name "*.so" | xargs -I {} echo -x {}` \ -d $(LIBDIR) -of -p @executable_path/../lib - # The Radiant plugins (modules) are a little funky - # Some of them are actually linked against the build directory - ln -s ../build ./build - - dylibbundler -b \ - `find $(INSTDIR)/modules -name "*.so" | xargs -I {} echo -x {}` \ - -d $(LIBDIR) -of -p @executable_path/../lib - rm -f build image: diff --git a/radiant/main.cpp b/radiant/main.cpp index 5ba7b518..d41b77e1 100644 --- a/radiant/main.cpp +++ b/radiant/main.cpp @@ -463,19 +463,17 @@ int main( int argc, char* argv[] ) { */ putenv( "LC_NUMERIC=C" ); -#ifdef _WIN32 - libgl = "opengl32.dll"; -#endif - -#if defined ( __linux__ ) - libgl = "libGL.so.1"; -#endif - -#ifdef __APPLE__ - // libgl = "/usr/X11R6/lib/libGL.dylib"; - // libgl = "/usr/X11/lib/libGL.dylib"; - libgl = "/opt/local/lib/libGL.dylib"; -#endif + // Use the same environment variable for resolving libGL as libgtkglext does. + libgl = getenv("GDK_GL_LIBGL_PATH"); + if ( libgl == NULL ) { + #if defined ( _WIN32 ) + libgl = "opengl32.dll"; + #elif defined ( __linux__ ) + libgl = "libGL.so.1"; + #elif defined ( __APPLE__ ) + libgl = "/opt/local/lib/libGL.dylib"; + #endif + } #if defined ( __linux__ ) || defined ( __APPLE__ ) // Give away unnecessary root privileges. From 625eaa9502d10418c037d504c482fcbeb8548920 Mon Sep 17 00:00:00 2001 From: jdolan Date: Thu, 27 Jun 2013 17:48:22 -0400 Subject: [PATCH 11/14] Fix 64 bit windows q3map2 visibility. --- config.py | 32 ++++++++++++++++---------------- radiant/preferences.cpp | 8 ++++++-- radiant/qe3.cpp | 17 ++++++++++------- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/config.py b/config.py index 0bd21866..58c4d8cc 100644 --- a/config.py +++ b/config.py @@ -169,22 +169,22 @@ class Config: q3map2 = SConscript( os.path.join( build_dir, sconscript_name ) ) Default( InstallAs( os.path.join( self.install_directory, compiler_name ), q3map2 ) ) - def emit_q3data( self ): - settings = self - for config_name in self.config_selected: - config = {} - config['name'] = config_name - config['shared'] = False - Export( 'utils', 'settings', 'config' ) - build_dir = os.path.join( 'build', config_name, 'q3data' ) - VariantDir( build_dir, '.', duplicate = 0 ) - lib_objects = [] - for project in [ 'libs/mathlib/mathlib.vcproj', 'libs/l_net/l_net.vcproj', 'libs/ddslib/ddslib.vcproj' ]: - Export( 'project' ) - lib_objects += SConscript( os.path.join( build_dir, 'SConscript.lib' ) ) - Export( 'lib_objects' ) - q3data = SConscript( os.path.join( build_dir, 'SConscript.q3data' ) ) - Default( InstallAs( os.path.join( self.install_directory, 'q3data' ), q3data ) ) + def emit_q3data( self ): + settings = self + for config_name in self.config_selected: + config = {} + config['name'] = config_name + config['shared'] = False + Export( 'utils', 'settings', 'config' ) + build_dir = os.path.join( 'build', config_name, 'q3data' ) + VariantDir( build_dir, '.', duplicate = 0 ) + lib_objects = [] + for project in [ 'libs/mathlib/mathlib.vcproj', 'libs/l_net/l_net.vcproj', 'libs/ddslib/ddslib.vcproj' ]: + Export( 'project' ) + lib_objects += SConscript( os.path.join( build_dir, 'SConscript.lib' ) ) + Export( 'lib_objects' ) + q3data = SConscript( os.path.join( build_dir, 'SConscript.q3data' ) ) + Default( InstallAs( os.path.join( self.install_directory, 'q3data' ), q3data ) ) def emit( self ): if 'radiant' in self.target_selected: diff --git a/radiant/preferences.cpp b/radiant/preferences.cpp index 2cd2210f..c1191ec8 100644 --- a/radiant/preferences.cpp +++ b/radiant/preferences.cpp @@ -662,7 +662,9 @@ PrefsDlg::PrefsDlg (){ #endif m_nLightRadiuses = 1; m_bQ3Map2Texturing = TRUE; - m_bx64q3map2 = TRUE; +#ifdef _WIN32 + m_bx64q3map2 = TRUE; +#endif #ifdef ATIHACK_812 m_bGlATIHack = FALSE; #endif @@ -3144,7 +3146,9 @@ void PrefsDlg::LoadPrefs(){ mLocalPrefs.GetPref( LIGHTRADIUS_KEY, &m_nLightRadiuses, TRUE ); mLocalPrefs.GetPref( Q3MAP2TEX_KEY, &m_bQ3Map2Texturing, TRUE ); - mLocalPrefs.GetPref( X64Q3MAP2_KEY, &m_bx64q3map2, TRUE ); +#ifdef _WIN32 + mLocalPrefs.GetPref( X64Q3MAP2_KEY, &m_bx64q3map2, TRUE ); +#endif #ifdef ATIHACK_812 mLocalPrefs.GetPref( ATIHACK_KEY, &m_bGlATIHack, FALSE ); diff --git a/radiant/qe3.cpp b/radiant/qe3.cpp index e22ad01c..f5f962ac 100644 --- a/radiant/qe3.cpp +++ b/radiant/qe3.cpp @@ -443,7 +443,7 @@ void ReplaceTemplates( char* w, const char* r ){ const char *__TOOLSPATH = "TEMPLATEtoolspath"; const char *__BASEDIR = "TEMPLATEbasedir"; const char *__APPPATH = "TEMPLATEapppath"; - const char *__Q3MAP2 = "TEMPLATEq3map2"; + const char *__Q3MAP2 = "TEMPLATEq3map2"; // iterate through string r while ( *r != '\0' ) @@ -471,13 +471,16 @@ void ReplaceTemplates( char* w, const char* r ){ p = g_strAppPath.GetBuffer(); } else if ( strncmp( r + 1, __Q3MAP2, strlen( __Q3MAP2 ) ) == 0 ) { - r += strlen( __Q3MAP2 ) + 1; - // see https://github.com/TTimo/GtkRadiant/issues/116 - if ( g_PrefsDlg.m_bx64q3map2 ) { + r += strlen( __Q3MAP2 ) + 1; + // see https://github.com/TTimo/GtkRadiant/issues/116 +#ifdef _WIN32 + if ( g_PrefsDlg.m_bx64q3map2 ) { p = "x64/q3map2"; - } else { - p = "q3map2"; - } + } else +#endif + { + p = "q3map2"; + } } else { From 32e9a51af2af331ff9d82e98e4d2107eac0bf0fd Mon Sep 17 00:00:00 2001 From: jdolan Date: Thu, 27 Jun 2013 18:18:44 -0400 Subject: [PATCH 12/14] Remove 'git clone horror' :) --- config.py | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/config.py b/config.py index 58c4d8cc..23b84b12 100644 --- a/config.py +++ b/config.py @@ -261,22 +261,9 @@ class Config: def FetchGamePaks( self, path ): for pak in self.setup_packs: - if ( pak == 'Q2WPack' ): - continue svnurl = 'svn://svn.icculus.org/gtkradiant-gamepacks/%s/trunk' % pak self.CheckoutOrUpdate( svnurl, os.path.join( path, 'installs', pak ) ) - - if 'Q2WPack' in self.setup_packs: - if ( os.path.exists( 'quake2world' ) ): - subprocess.check_call( [ 'git', 'pull', ], cwd = 'quake2world' ) - else: - cmd = [ 'git', 'clone', 'git://github.com/jdolan/quake2world.git' ] - subprocess.check_call( cmd ) - # squash and sync.. - if ( os.path.exists( 'install/installs/Q2WPack' ) ): - shutil.rmtree( 'install/installs/Q2WPack/' ) - shutil.copytree( 'quake2world/support/gtkradiant/Q2WPack/', 'install/installs/Q2WPack/' ) - + def CopyTree( self, src, dst): for root, dirs, files in os.walk( src ): target_dir = os.path.join( dst, root[root.find( '/' )+1:] ) From 00b1557797ebea1fe55145163bf9d6b02eaa9e10 Mon Sep 17 00:00:00 2001 From: jdolan Date: Fri, 28 Jun 2013 09:07:02 -0400 Subject: [PATCH 13/14] Add FontConfig configuration file and turn on FC_DEBUG. --- apple/GtkRadiant.app/Contents/MacOS/radiant | 3 + .../Contents/Resources/etc/fonts/fonts.conf | 133 ++++++++++++++++++ apple/Makefile | 3 +- 3 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 apple/GtkRadiant.app/Contents/Resources/etc/fonts/fonts.conf diff --git a/apple/GtkRadiant.app/Contents/MacOS/radiant b/apple/GtkRadiant.app/Contents/MacOS/radiant index 0ef3a975..64f07358 100755 --- a/apple/GtkRadiant.app/Contents/MacOS/radiant +++ b/apple/GtkRadiant.app/Contents/MacOS/radiant @@ -11,6 +11,9 @@ set -x resources="${RADIANT_HOME}/Contents/Resources" +export FONTCONFIG_PATH="${resources}/etc/fonts" +export FC_DEBUG=1024 + export GDK_GL_LIBGL_PATH="${resources}/lib/libGL.1.dylib" export GDK_GL_LIBGLU_PATH="${resources}/lib/libGLU.1.dylib" diff --git a/apple/GtkRadiant.app/Contents/Resources/etc/fonts/fonts.conf b/apple/GtkRadiant.app/Contents/Resources/etc/fonts/fonts.conf new file mode 100644 index 00000000..7183a4be --- /dev/null +++ b/apple/GtkRadiant.app/Contents/Resources/etc/fonts/fonts.conf @@ -0,0 +1,133 @@ + + + + + + + + /usr/X11/lib/X11/fonts + /Library/Fonts + /System/Library/Fonts + fonts + + + + + mono + + + monospace + + + + + + + sans serif + + + sans-serif + + + + + + + sans + + + sans-serif + + + + + fontconfig + + + + + 0x0020 + 0x00A0 + 0x00AD + 0x034F + 0x0600 + 0x0601 + 0x0602 + 0x0603 + 0x06DD + 0x070F + 0x115F + 0x1160 + 0x1680 + 0x17B4 + 0x17B5 + 0x180E + 0x2000 + 0x2001 + 0x2002 + 0x2003 + 0x2004 + 0x2005 + 0x2006 + 0x2007 + 0x2008 + 0x2009 + 0x200A + 0x200B + 0x200C + 0x200D + 0x200E + 0x200F + 0x2028 + 0x2029 + 0x202A + 0x202B + 0x202C + 0x202D + 0x202E + 0x202F + 0x205F + 0x2060 + 0x2061 + 0x2062 + 0x2063 + 0x206A + 0x206B + 0x206C + 0x206D + 0x206E + 0x206F + 0x2800 + 0x3000 + 0x3164 + 0xFEFF + 0xFFA0 + 0xFFF9 + 0xFFFA + 0xFFFB + + + + 30 + + + + + diff --git a/apple/Makefile b/apple/Makefile index b706c837..31081dd9 100644 --- a/apple/Makefile +++ b/apple/Makefile @@ -68,8 +68,9 @@ bundle: rm -f build image: + find $(TARGET) -name .DS_Store -delete ln -f -s /Applications $(TARGET)/Applications - hdiutil create $(DMG) -srcfolder $(TARGET) -volname $(VOLUME_NAME) + hdiutil create -ov $(DMG) -srcfolder $(TARGET) -volname $(VOLUME_NAME) rm $(TARGET)/Applications clean: From 34cdd2d66774df618fc94ebc84ca00cdfedc0583 Mon Sep 17 00:00:00 2001 From: jdolan Date: Fri, 28 Jun 2013 09:08:33 -0400 Subject: [PATCH 14/14] Updated .gitignore to ignore games, installs, q3map2_urt, q3data. --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index f982b2e2..088cad52 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ /apple/target/* +/install/games +/install/installs +/install/q3data /install/q3map2 +/install/q3map2_urt /install/radiant.bin /.sconsign.dblite /site.sconf