Index: ps/trunk/binaries/data/mods/public/gui/credits/texts/programming.json
===================================================================
--- ps/trunk/binaries/data/mods/public/gui/credits/texts/programming.json
+++ ps/trunk/binaries/data/mods/public/gui/credits/texts/programming.json
@@ -172,6 +172,7 @@
{ "nick": "niektb", "name": "Niek ten Brinke" },
{ "nick": "njm" },
{ "nick": "NoMonkey", "name": "John Mena" },
+ { "nick": "norsnor" },
{ "nick": "notpete", "name": "Rich Cross" },
{ "nick": "nwtour" },
{ "nick": "odoaker", "name": "Ágoston Sipos" },
@@ -238,6 +239,7 @@
{ "nick": "texane" },
{ "nick": "thamlett", "name": "Timothy Hamlett" },
{ "nick": "thedrunkyak", "name": "Dan Fuhr" },
+ { "nick": "Tobbi" },
{ "nick": "TrinityDeath", "name": "Jethro Lu" },
{ "nick": "triumvir", "name": "Corin Schedler" },
{ "nick": "trompetin17", "name": "Juan Guillermo" },
Index: ps/trunk/build/jenkins/pipelines/macos-bundle.Jenkinsfile
===================================================================
--- ps/trunk/build/jenkins/pipelines/macos-bundle.Jenkinsfile
+++ ps/trunk/build/jenkins/pipelines/macos-bundle.Jenkinsfile
@@ -0,0 +1,50 @@
+/* Copyright (C) 2019 Wildfire Games.
+ * This file is part of 0 A.D.
+ *
+ * 0 A.D. is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 0 A.D. is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with 0 A.D. If not, see .
+ */
+
+pipeline {
+ agent { label 'MacSlave' }
+
+ // Archive the installer for public download; keep only the latest one.
+ options {
+ buildDiscarder(logRotator(artifactNumToKeepStr: '1'))
+ }
+
+ parameters {
+ booleanParam(name: 'release', defaultValue: false)
+ }
+
+ stages {
+ stage("Checkout") {
+ steps {
+ svn "https://svn.wildfiregames.com/public/ps/trunk"
+ sh "svn cleanup"
+ sh "svn st --no-ignore | cut -c 9- | xargs rm -rf"
+ }
+ }
+ stage("Bundle") {
+ steps {
+ sh "cd source/tools/dist && ./build-osx-bundle.sh"
+ }
+ }
+ }
+
+ post {
+ success {
+ archiveArtifacts 'build/workspaces/*.dmg'
+ }
+ }
+}
Index: ps/trunk/build/jenkins/pipelines/macos-differential.Jenkinsfile
===================================================================
--- ps/trunk/build/jenkins/pipelines/macos-differential.Jenkinsfile
+++ ps/trunk/build/jenkins/pipelines/macos-differential.Jenkinsfile
@@ -0,0 +1,111 @@
+/* Copyright (C) 2020 Wildfire Games.
+ * This file is part of 0 A.D.
+ *
+ * 0 A.D. is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 0 A.D. is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with 0 A.D. If not, see .
+ */
+
+pipeline {
+ agent { label 'MacSlave' }
+ options {
+ skipDefaultCheckout()
+ }
+
+ parameters {
+ string(name: 'DIFF_ID', defaultValue: '', description: 'ID of the Phabricator Differential.')
+ string(name: 'PHID', defaultValue: '', description: 'Phabricator ID')
+ }
+
+ stages {
+ stage ("Checkout") {
+ options {
+ retry(3)
+ }
+ steps {
+ script {
+ try {
+ svn "https://svn.wildfiregames.com/public/ps/trunk"
+ } catch(e) {
+ sh "svn cleanup"
+ sleep 300
+ throw e
+ }
+ }
+ sh "svn cleanup"
+ }
+ }
+ stage ("Patch") {
+ steps {
+ script {
+ try {
+ sh "arc patch --diff ${params.DIFF_ID} --force"
+ } catch (e) {
+ sh "svn revert -R ."
+ sh "svn st | cut -c 9- | xargs rm -rf"
+ sh "arc patch --diff ${params.DIFF_ID} --force"
+ }
+ }
+ }
+ }
+ stage("macOS libraries build") {
+ steps {
+ sh "cd libraries/osx/ && ./build-osx-libs.sh -j4"
+ }
+ }
+ stage("Update workspaces") {
+ steps {
+ sh "cd build/workspaces/ && ./update-workspaces.sh -j4 --atlas --jenkins-tests"
+ }
+ }
+ stage("Debug Build & Tests") {
+ steps {
+ sh "cd build/workspaces/gcc/ && make -j4 config=debug"
+ script {
+ try {
+ sh "binaries/system/test_dbg > cxxtest-debug.xml"
+ } catch (e) {
+ echo (message: readFile (file: "cxxtest-debug.xml"))
+ throw e
+ } finally {
+ junit "cxxtest-debug.xml"
+ }
+ }
+ }
+ }
+ stage("Release Build & Tests") {
+ steps {
+ sh "cd build/workspaces/gcc/ && make -j4 config=release"
+ script {
+ try {
+ sh "binaries/system/test > cxxtest-release.xml"
+ } catch (e) {
+ echo (message: readFile (file: "cxxtest-release.xml"))
+ throw e
+ } finally {
+ junit "cxxtest-release.xml"
+ }
+ }
+ }
+ }
+ }
+
+ post {
+ always {
+ step([$class: 'PhabricatorNotifier', commentOnSuccess: true, commentWithConsoleLinkOnFailure: true])
+ sh "rm -f cxxtest_*.xml"
+ sh "svn revert -R ."
+ sh "svn st binaries/data/ | cut -c 9- | xargs rm -rf"
+ sh "svn st source/ | cut -c 9- | xargs rm -rf"
+ }
+ }
+}
Index: ps/trunk/build/jenkins/pipelines/macos-svn.Jenkinsfile
===================================================================
--- ps/trunk/build/jenkins/pipelines/macos-svn.Jenkinsfile
+++ ps/trunk/build/jenkins/pipelines/macos-svn.Jenkinsfile
@@ -0,0 +1,92 @@
+/* Copyright (C) 2020 Wildfire Games.
+ * This file is part of 0 A.D.
+ *
+ * 0 A.D. is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 0 A.D. is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with 0 A.D. If not, see .
+ */
+
+pipeline {
+ agent { label 'MacSlave' }
+
+ parameters {
+ string(name: 'SVN_REV', defaultValue: '', description: 'For instance 21000')
+ string(name: 'PHID', defaultValue: '', description: 'Phabricator ID')
+ }
+
+ stages {
+ stage("Checkout") {
+ options {
+ // Account for network errors
+ retry(3)
+ }
+ steps {
+ script {
+ try {
+ svn "https://svn.wildfiregames.com/public/ps/trunk@${params.SVN_REV}"
+ } catch(e) {
+ sh "svn cleanup"
+ sleep 300
+ throw e
+ }
+ }
+ sh "svn cleanup"
+ }
+ }
+ stage("macOS libraries build") {
+ steps {
+ sh "cd libraries/osx/ && ./build-osx-libs.sh -j4"
+ }
+ }
+ stage("Update workspaces") {
+ steps {
+ sh "cd build/workspaces/ && ./update-workspaces.sh -j4 --atlas --jenkins-tests"
+ }
+ }
+ stage("Debug Build & Tests") {
+ steps {
+ sh "cd build/workspaces/gcc/ && make -j4 config=debug"
+ script {
+ try {
+ sh "binaries/system/test_dbg > cxxtest-debug.xml"
+ } catch (e) {
+ echo (message: readFile (file: "cxxtest-debug.xml"))
+ throw e
+ } finally {
+ junit "cxxtest-debug.xml"
+ }
+ }
+ }
+ }
+ stage("Release Build & Tests") {
+ steps {
+ sh "cd build/workspaces/gcc/ && make -j4 config=release"
+ script {
+ try {
+ sh "binaries/system/test > cxxtest-release.xml"
+ } catch (e) {
+ echo (message: readFile (file: "cxxtest-release.xml"))
+ throw e
+ } finally {
+ junit "cxxtest-release.xml"
+ }
+ }
+ }
+ }
+ }
+
+ post {
+ always {
+ step([$class: 'PhabricatorNotifier'])
+ }
+ }
+}
Index: ps/trunk/build/resources/InfoPlists.strings
===================================================================
--- ps/trunk/build/resources/InfoPlists.strings
+++ ps/trunk/build/resources/InfoPlists.strings
@@ -0,0 +1,10 @@
+
+
+
+
+ CFBundleDisplayName
+ 0 A.D.
+ CFBundleName
+ 0 A.D.
+
+
Index: ps/trunk/build/workspaces/build-osx-bundle.sh
===================================================================
--- ps/trunk/build/workspaces/build-osx-bundle.sh
+++ ps/trunk/build/workspaces/build-osx-bundle.sh
@@ -1,220 +0,0 @@
-#!/bin/sh
-#
-# This script will build an OS X app bundle for 0 A.D.
-#
-# App bundles are intended to be self-contained and portable.
-# An SDK is required, usually included with Xcode. The SDK ensures
-# that only those system libraries are used which are available on
-# the chosen target and compatible systems.
-#
-# Steps to build a 0 A.D. bundle are:
-# 1. confirm ARCH is set to desired target architecture
-# 2. confirm SYSROOT points to the correct target SDK
-# 3. confirm MIN_OSX_VERSION matches the target OS X version
-# 4. update BUNDLE_VERSION to match current 0 A.D. version
-# 5. run this script
-#
-
-# Force build architecture, as sometimes environment is broken.
-# For a universal fat binary, the approach would be to build every
-# library with both archs and combine them with lipo, then do the
-# same thing with the game itself.
-# Choices are "x86_64" or "i386" (ppc and ppc64 not supported)
-export ARCH=${ARCH:="x86_64"}
-
-OSX_VERSION=`sw_vers -productVersion | grep -Eo "^\d+.\d+"`
-# Set SDK and mimimum required OS X version
-export SYSROOT=${SYSROOT:="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$OSX_VERSION.sdk"}
-export MIN_OSX_VERSION=${MIN_OSX_VERSION:="10.9"}
-
-# 0 A.D. release version, e.g. Alpha 21 is 0.0.21
-BUNDLE_VERSION=${BUNDLE_VERSION:="0.0.X"}
-
-# Define compiler as "clang", this is all Mavericks supports.
-# gcc symlinks may still exist, but they are simply clang with
-# slightly different config, which confuses build scripts.
-# llvm-gcc and gcc 4.2 are no longer supported by SpiderMonkey.
-export CC=${CC:="clang"} CXX=${CXX:="clang++"}
-
-# Unique identifier string for this bundle (reverse-DNS style)
-BUNDLE_IDENTIFIER=${BUNDLE_IDENTIFIER:="com.wildfiregames.0ad"}
-# Minimum version of OS X on which the bundle will run
-BUNDLE_MIN_OSX_VERSION="${MIN_OSX_VERSION}.0"
-
-die()
-{
- echo ERROR: $*
- exit 1
-}
-
-# Check that we're actually on OS X
-if [ "`uname -s`" != "Darwin" ]; then
- die "This script is intended for OS X only"
-fi
-
-# Check SDK exists
-if [ ! -d "$SYSROOT" ]; then
- die "$SYSROOT does not exist! You probably need to install Xcode"
-fi
-
-cd "$(dirname $0)"
-# Now in build/workspaces/ (where we assume this script resides)
-
-JOBS=${JOBS:="-j5"}
-build_release=false
-build_path="$HOME/0ad-export"
-# TODO: proper logging of all output, but show errors in terminal too
-build_log="$(pwd)/bundle-build.log"
-
-# Parse command-line options:
-for i in "$@"
-do
- case $i in
- -j* ) JOBS=$i ;;
- --release ) build_release=true ;;
- esac
-done
-
-rm -f $build_log
-
-# For release, export an SVN copy
-if [ "$build_release" = "true" ]; then
- echo "\nExporting SVN and preparing release\n"
-
- BUNDLE_OUTPUT="$build_path/0ad.app"
- SVN_REV=`svnversion -n ../..`
- rm -rf $build_path
- svn export ../.. $build_path >> $build_log 2>&1 || die "Error exporting SVN working directory"
- cd $build_path
- rm -f binaries/data/config/dev.cfg
- # Only include translations for a subset of languages
- . source/tools/dist/remove-incomplete-translations.sh $build_path/binaries/data || die "Error excluding translations"
- echo L\"${SVN_REV}-release\" > build/svn_revision/svn_revision.txt
- cd build/workspaces
-fi
-
-BUNDLE_OUTPUT=${BUNDLE_OUTPUT:="$(pwd)/0ad.app"}
-BUNDLE_CONTENTS=$BUNDLE_OUTPUT/Contents
-BUNDLE_BIN=$BUNDLE_CONTENTS/MacOS
-BUNDLE_RESOURCES=$BUNDLE_CONTENTS/Resources
-BUNDLE_FRAMEWORKS=$BUNDLE_CONTENTS/Frameworks
-BUNDLE_PLUGINS=$BUNDLE_CONTENTS/PlugIns
-BUNDLE_SHAREDSUPPORT=$BUNDLE_CONTENTS/SharedSupport
-
-# TODO: Do we really want to regenerate everything? (consider if one task fails)
-
-# Build libraries against SDK
-echo "\nBuilding libraries\n"
-pushd ../../libraries/osx > /dev/null
-./build-osx-libs.sh $JOBS --force-rebuild >> $build_log 2>&1 || die "Libraries build script failed"
-popd > /dev/null
-
-# Clean and update workspaces
-echo "\nGenerating workspaces\n"
-
-# Pass OS X options through to Premake
-(./clean-workspaces.sh && SYSROOT="$SYSROOT" MIN_OSX_VERSION="$MIN_OSX_VERSION" ./update-workspaces.sh --macosx-bundle="$BUNDLE_IDENTIFIER" --sysroot="$SYSROOT" --macosx-version-min="$MIN_OSX_VERSION") >> $build_log 2>&1 || die "update-workspaces.sh failed!"
-
-pushd gcc > /dev/null
-echo "\nBuilding game\n"
-(make clean && CC="$CC -arch $ARCH" CXX="$CXX -arch $ARCH" make ${JOBS}) >> $build_log 2>&1 || die "Game build failed!"
-popd > /dev/null
-
-# Run test to confirm all is OK
-# TODO: tests are currently broken on OS X (see http://trac.wildfiregames.com/ticket/2780)
-#pushd ../../binaries/system > /dev/null
-#echo "\nRunning tests\n"
-#./test || die "Post-build testing failed!"
-#popd > /dev/null
-
-# Create bundle structure
-echo "\nCreating bundle directories\n"
-rm -rf ${BUNDLE_OUTPUT}
-mkdir -p ${BUNDLE_BIN}
-mkdir -p ${BUNDLE_FRAMEWORKS}
-mkdir -p ${BUNDLE_PLUGINS}
-mkdir -p ${BUNDLE_RESOURCES}
-mkdir -p ${BUNDLE_SHAREDSUPPORT}
-
-# Build archive(s) - don't archive the _test.* mods
-pushd ../../binaries/data/mods > /dev/null
-archives=""
-for modname in [a-zA-Z0-9]*
-do
- archives="${archives} ${modname}"
-done
-popd > /dev/null
-
-pushd ../../binaries/system > /dev/null
-
-for modname in $archives
-do
- echo "\nBuilding archive for '${modname}'\n"
- ARCHIVEBUILD_INPUT="$(pwd)/../data/mods/${modname}"
- ARCHIVEBUILD_OUTPUT="${BUNDLE_RESOURCES}/data/mods/${modname}"
-
- # For some reason the output directory has to exist?
- mkdir -p ${ARCHIVEBUILD_OUTPUT}
-
- (./pyrogenesis -archivebuild=${ARCHIVEBUILD_INPUT} -archivebuild-output=${ARCHIVEBUILD_OUTPUT}/${modname}.zip) >> $build_log 2>&1 || die "Archive build for '${modname}' failed!"
-done
-
-# Copy binaries
-echo "\nCopying binaries\n"
-# Only pyrogenesis for now, until we find a way to load
-# multiple binaries from one app bundle
-# TODO: Would be nicer if we could set this path in premake
-cp pyrogenesis ${BUNDLE_BIN}
-
-# Copy libs
-echo "\nCopying libs\n"
-# TODO: Would be nicer if we could set this path in premake
-cp -v libAtlasUI.dylib ${BUNDLE_FRAMEWORKS}
-cp -v libCollada.dylib ${BUNDLE_FRAMEWORKS}
-
-popd > /dev/null
-
-# Copy data
-echo "\nCopying non-archived game data\n"
-pushd ../../binaries/data > /dev/null
-if [ "$build_release" = "false" ]; then
- mv config/dev.cfg config/dev.bak
-fi
-cp -R -v config ${BUNDLE_RESOURCES}/data/
-cp -R -v l10n ${BUNDLE_RESOURCES}/data/
-cp -R -v tools ${BUNDLE_RESOURCES}/data/
-if [ "$build_release" = "false" ]; then
- mv config/dev.bak config/dev.cfg
-fi
-popd > /dev/null
-cp -v ../resources/0ad.icns ${BUNDLE_RESOURCES}
-
-# Copy license/readmes
-# TODO: Also want copies in the DMG - decide on layout
-echo "\nCopying readmes\n"
-cp -v ../../*.txt ${BUNDLE_RESOURCES}
-cp -v ../../libraries/LICENSE.txt ${BUNDLE_RESOURCES}/LIB_LICENSE.txt
-
-# Create Info.plist
-echo "\nCreating Info.plist\n"
-alias PlistBuddy=/usr/libexec/PlistBuddy
-INFO_PLIST="${BUNDLE_CONTENTS}/Info.plist"
-
-PlistBuddy -c "Add :CFBundleName string 0 A.D." ${INFO_PLIST}
-PlistBuddy -c "Add :CFBundleIdentifier string ${BUNDLE_IDENTIFIER}" ${INFO_PLIST}
-PlistBuddy -c "Add :CFBundleVersion string ${BUNDLE_VERSION}" ${INFO_PLIST}
-PlistBuddy -c "Add :CFBundlePackageType string APPL" ${INFO_PLIST}
-PlistBuddy -c "Add :CFBundleSignature string none" ${INFO_PLIST}
-PlistBuddy -c "Add :CFBundleExecutable string pyrogenesis" ${INFO_PLIST}
-PlistBuddy -c "Add :CFBundleShortVersionString string ${BUNDLE_VERSION}" ${INFO_PLIST}
-PlistBuddy -c "Add :CFBundleDevelopmentRegion string English" ${INFO_PLIST}
-PlistBuddy -c "Add :CFBundleInfoDictionaryVersion string 6.0" ${INFO_PLIST}
-PlistBuddy -c "Add :CFBundleIconFile string 0ad" ${INFO_PLIST}
-PlistBuddy -c "Add :LSMinimumSystemVersion string ${BUNDLE_MIN_OSX_VERSION}" ${INFO_PLIST}
-PlistBuddy -c "Add :NSHumanReadableCopyright string Copyright © $(date +%Y) Wildfire Games" ${INFO_PLIST}
-
-# TODO: Automatically create compressed DMG with hdiutil?
-# (this is a bit complicated so I do it manually for now)
-# (also we need to have good icon placement, background image, etc)
-
-echo "\nBundle complete! Located in ${BUNDLE_OUTPUT}"
Index: ps/trunk/libraries/osx/build-osx-libs.sh
===================================================================
--- ps/trunk/libraries/osx/build-osx-libs.sh
+++ ps/trunk/libraries/osx/build-osx-libs.sh
@@ -344,6 +344,7 @@
--prefix="$INSTALL_DIR" \
--disable-video-x11 \
--without-x \
+ --enable-video-cocoa \
--enable-shared=no \
&& make $JOBS && make install) || die "SDL2 build failed"
popd
@@ -959,6 +960,7 @@
mkdir -p $INCLUDE_DIR_DEBUG
cp -R -L dist/include/* $INCLUDE_DIR_DEBUG/
cp dist/sdk/lib/*.a $INSTALL_DIR/lib
+ cp js/src/*.a $INSTALL_DIR/lib
popd
mv moz.build.bak moz.build
Index: ps/trunk/source/tools/dist/build-osx-bundle.sh
===================================================================
--- ps/trunk/source/tools/dist/build-osx-bundle.sh
+++ ps/trunk/source/tools/dist/build-osx-bundle.sh
@@ -0,0 +1,211 @@
+#!/bin/sh
+#
+# This script will build an OS X app bundle for 0 A.D.
+#
+# App bundles are intended to be self-contained and portable.
+# An SDK is required, usually included with Xcode. The SDK ensures
+# that only those system libraries are used which are available on
+# the chosen target and compatible systems.
+#
+
+# Force build architecture, as sometimes environment is broken.
+# For a universal fat binary, the approach would be to build every
+# library with both archs and combine them with lipo, then do the
+# same thing with the game itself.
+# Choices are "x86_64" or "i386" (ppc and ppc64 not supported)
+export ARCH=${ARCH:="x86_64"}
+
+# Set mimimum required OS X version, SDK location and tools
+# Old SDKs can be found at https://github.com/phracker/MacOSX-SDKs
+export MIN_OSX_VERSION=${MIN_OSX_VERSION:="10.9"}
+export SYSROOT=${SYSROOT:="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX${MIN_OSX_VERSION}.sdk"}
+export CC=${CC:="clang"} CXX=${CXX:="clang++"}
+
+# 0 A.D. release version
+BUNDLE_VERSION=${BUNDLE_VERSION:="0.0.24dev"}
+BUNDLE_FILENAME="0ad-${BUNDLE_VERSION}-alpha-osx64.dmg"
+
+# Unique identifier string for this bundle (reverse-DNS style)
+BUNDLE_IDENTIFIER=${BUNDLE_IDENTIFIER:="com.wildfiregames.0ad"}
+# Minimum version of OS X on which the bundle will run
+BUNDLE_MIN_OSX_VERSION="${MIN_OSX_VERSION}.0"
+
+die()
+{
+ echo ERROR: $*
+ exit 1
+}
+
+# Check that we're actually on OS X
+if [ "`uname -s`" != "Darwin" ]; then
+ die "This script is intended for OS X only"
+fi
+
+# Check SDK exists
+if [ ! -d "$SYSROOT" ]; then
+ die "$SYSROOT does not exist! You probably need to install Xcode"
+fi
+
+# We assume this script resides in source/tools/dist/
+DMGBUILD_CONFIG="$(pwd)/dmgbuild-settings.py"
+cd "$(dirname $0)/../../../build/workspaces/"
+
+JOBS=${JOBS:="-j5"}
+build_release=false
+
+# Parse command-line options:
+for i in "$@"
+do
+ case $i in
+ -j* ) JOBS=$i ;;
+ --release ) build_release=true ;;
+ esac
+done
+
+# For release, export an SVN copy
+if [ "$build_release" = "true" ]; then
+ echo "\nExporting SVN and preparing release\n"
+
+ SVN_REV=`svnversion -n ../..`
+ rm -rf "0ad-export"
+ svn export ../.. "0ad-export" || die "Error exporting SVN working directory"
+ cd "0ad-export"
+ rm -f binaries/data/config/dev.cfg
+ # Only include translations for a subset of languages
+ . source/tools/dist/remove-incomplete-translations.sh $build_path/binaries/data || die "Error excluding translations"
+ echo L\"${SVN_REV}-release\" > build/svn_revision/svn_revision.txt
+ cd build/workspaces
+fi
+
+BUNDLE_APP="0ad.app"
+BUNDLE_DMG_NAME="0 A.D."
+BUNDLE_OUTPUT=${BUNDLE_OUTPUT:="$(pwd)/${BUNDLE_APP}"}
+BUNDLE_CONTENTS=$BUNDLE_OUTPUT/Contents
+BUNDLE_BIN=$BUNDLE_CONTENTS/MacOS
+BUNDLE_RESOURCES=$BUNDLE_CONTENTS/Resources
+BUNDLE_FRAMEWORKS=$BUNDLE_CONTENTS/Frameworks
+BUNDLE_PLUGINS=$BUNDLE_CONTENTS/PlugIns
+BUNDLE_SHAREDSUPPORT=$BUNDLE_CONTENTS/SharedSupport
+
+# TODO: Do we really want to regenerate everything? (consider if one task fails)
+
+# Build libraries against SDK
+echo "\nBuilding libraries\n"
+pushd ../../libraries/osx > /dev/null
+./build-osx-libs.sh $JOBS --force-rebuild || die "Libraries build script failed"
+popd > /dev/null
+
+# Clean and update workspaces
+echo "\nGenerating workspaces\n"
+
+# Pass OS X options through to Premake
+(./clean-workspaces.sh && SYSROOT="$SYSROOT" MIN_OSX_VERSION="$MIN_OSX_VERSION" ./update-workspaces.sh --macosx-bundle="$BUNDLE_IDENTIFIER" --sysroot="$SYSROOT" --macosx-version-min="$MIN_OSX_VERSION") || die "update-workspaces.sh failed!"
+
+pushd gcc > /dev/null
+echo "\nBuilding game\n"
+(make clean && CC="$CC -arch $ARCH" CXX="$CXX -arch $ARCH" make ${JOBS}) || die "Game build failed!"
+popd > /dev/null
+
+# Run test to confirm all is OK
+pushd ../../binaries/system > /dev/null
+echo "\nRunning tests\n"
+./test || die "Post-build testing failed!"
+popd > /dev/null
+
+# Create bundle structure
+echo "\nCreating bundle directories\n"
+rm -rf "${BUNDLE_OUTPUT}"
+mkdir -p "${BUNDLE_BIN}"
+mkdir -p "${BUNDLE_FRAMEWORKS}"
+mkdir -p "${BUNDLE_PLUGINS}"
+mkdir -p "${BUNDLE_RESOURCES}"
+mkdir -p "${BUNDLE_SHAREDSUPPORT}"
+
+# Build archive(s) - don't archive the _test.* mods
+pushd ../../binaries/data/mods > /dev/null
+archives=""
+for modname in [a-zA-Z0-9]*
+do
+ archives="${archives} ${modname}"
+done
+popd > /dev/null
+
+pushd ../../binaries/system > /dev/null
+
+for modname in $archives
+do
+ echo "\nBuilding archive for '${modname}'\n"
+ ARCHIVEBUILD_INPUT="$(pwd)/../data/mods/${modname}"
+ ARCHIVEBUILD_OUTPUT="${BUNDLE_RESOURCES}/data/mods/${modname}"
+
+ # For some reason the output directory has to exist?
+ mkdir -p "${ARCHIVEBUILD_OUTPUT}"
+
+ (./pyrogenesis -archivebuild="${ARCHIVEBUILD_INPUT}" -archivebuild-output="${ARCHIVEBUILD_OUTPUT}/${modname}.zip") || die "Archive build for '${modname}' failed!"
+done
+
+# Copy binaries
+echo "\nCopying binaries\n"
+# Only pyrogenesis for now, until we find a way to load
+# multiple binaries from one app bundle
+# TODO: Would be nicer if we could set this path in premake
+cp pyrogenesis "${BUNDLE_BIN}"
+
+# Copy libs
+echo "\nCopying libs\n"
+# TODO: Would be nicer if we could set this path in premake
+cp -v libAtlasUI.dylib "${BUNDLE_FRAMEWORKS}"
+cp -v libCollada.dylib "${BUNDLE_FRAMEWORKS}"
+
+popd > /dev/null
+
+# Copy data
+echo "\nCopying non-archived game data\n"
+pushd ../../binaries/data > /dev/null
+if [ "$build_release" = "false" ]; then
+ mv config/dev.cfg config/dev.bak
+fi
+cp -R -v config "${BUNDLE_RESOURCES}/data/"
+cp -R -v l10n "${BUNDLE_RESOURCES}/data/"
+cp -R -v tools "${BUNDLE_RESOURCES}/data/"
+if [ "$build_release" = "false" ]; then
+ mv config/dev.bak config/dev.cfg
+fi
+popd > /dev/null
+cp -v ../resources/0ad.icns "${BUNDLE_RESOURCES}"
+cp -v ../resources/InfoPlist.strings "${BUNDLE_RESOURCES}"
+
+# Copy license/readmes
+# TODO: Also want copies in the DMG - decide on layout
+echo "\nCopying readmes\n"
+cp -v ../../*.txt "${BUNDLE_RESOURCES}"
+cp -v ../../libraries/LICENSE.txt "${BUNDLE_RESOURCES}/LIB_LICENSE.txt"
+
+# Create Info.plist
+echo "\nCreating Info.plist\n"
+alias PlistBuddy=/usr/libexec/PlistBuddy
+INFO_PLIST="${BUNDLE_CONTENTS}/Info.plist"
+
+PlistBuddy -c "Add :CFBundleName string 0 A.D." "${INFO_PLIST}"
+PlistBuddy -c "Add :CFBundleIdentifier string ${BUNDLE_IDENTIFIER}" "${INFO_PLIST}"
+PlistBuddy -c "Add :CFBundleVersion string ${BUNDLE_VERSION}" "${INFO_PLIST}"
+PlistBuddy -c "Add :CFBundlePackageType string APPL" "${INFO_PLIST}"
+PlistBuddy -c "Add :CFBundleSignature string none" "${INFO_PLIST}"
+PlistBuddy -c "Add :CFBundleExecutable string pyrogenesis" "${INFO_PLIST}"
+PlistBuddy -c "Add :CFBundleShortVersionString string ${BUNDLE_VERSION}" "${INFO_PLIST}"
+PlistBuddy -c "Add :CFBundleDevelopmentRegion string English" "${INFO_PLIST}"
+PlistBuddy -c "Add :CFBundleInfoDictionaryVersion string 6.0" "${INFO_PLIST}"
+PlistBuddy -c "Add :CFBundleIconFile string 0ad" "${INFO_PLIST}"
+PlistBuddy -c "Add :LSHasLocalizedDisplayName bool true" "${INFO_PLIST}"
+PlistBuddy -c "Add :LSMinimumSystemVersion string ${BUNDLE_MIN_OSX_VERSION}" "${INFO_PLIST}"
+PlistBuddy -c "Add :NSHumanReadableCopyright string Copyright © $(date +%Y) Wildfire Games" "${INFO_PLIST}"
+
+# Package the app into a dmg
+dmgbuild \
+ -s "${DMGBUILD_CONFIG}" \
+ -D app="${BUNDLE_OUTPUT}" \
+ -D background="../../build/resources/dmgbackground.png" \
+ "${BUNDLE_DMG_NAME}" "${BUNDLE_FILENAME}"
+
+
+echo "\nBundle complete! Located in ${BUNDLE_OUTPUT}, compressed as ${BUNDLE_FILENAME}."
Index: ps/trunk/source/tools/dist/dmgbuild-settings.py
===================================================================
--- ps/trunk/source/tools/dist/dmgbuild-settings.py
+++ ps/trunk/source/tools/dist/dmgbuild-settings.py
@@ -0,0 +1,145 @@
+# -*- coding: utf-8 -*-
+import biplist
+import os.path
+
+#
+# 0 A.D. settings file for dmgbuild
+#
+
+# Use like this:
+# dmgbuild -s settings.py -D app=/path/to/My.app -D background=/path/to/background.png "My Application" MyApp.dmg
+
+application = defines.get('app')
+
+
+def icon_from_app(app_path):
+ plist_path = os.path.join(app_path, 'Contents', 'Info.plist')
+ plist = biplist.readPlist(plist_path)
+ icon_name = plist['CFBundleIconFile']
+ icon_root,icon_ext = os.path.splitext(icon_name)
+ if not icon_ext:
+ icon_ext = '.icns'
+ icon_name = icon_root + icon_ext
+ return os.path.join(app_path, 'Contents', 'Resources', icon_name)
+
+# .. Basics ....................................................................
+
+# Volume format (see hdiutil create -help)
+format = defines.get('format', 'UDBZ')
+
+# Volume size
+size = defines.get('size', '3G')
+
+# Files to include
+files = [ application ]
+
+# Symlinks to create
+symlinks = { 'Applications': '/Applications' }
+
+# Volume icon
+#
+# You can either define icon, in which case that icon file will be copied to the
+# image, *or* you can define badge_icon, in which case the icon file you specify
+# will be used to badge the system's Removable Disk icon
+#
+#icon = '/path/to/icon.icns'
+badge_icon = icon_from_app(application)
+
+# Where to put the icons
+icon_locations = {
+ os.path.basename(application): (125, 170),
+ 'Applications': (475, 170)
+}
+
+# .. Window configuration ......................................................
+
+# Background
+background = defines.get('background')
+
+show_status_bar = False
+show_tab_view = False
+show_toolbar = False
+show_pathbar = False
+show_sidebar = False
+sidebar_width = 0
+
+# Window position in ((x, y), (w, h)) format
+window_rect = ((0, 0), (600, 393))
+
+# Select the default view; must be one of
+#
+# 'icon-view'
+# 'list-view'
+# 'column-view'
+# 'coverflow'
+#
+default_view = 'icon-view'
+
+# General view configuration
+show_icon_preview = False
+
+# Set these to True to force inclusion of icon/list view settings (otherwise
+# we only include settings for the default view)
+include_icon_view_settings = 'auto'
+include_list_view_settings = 'auto'
+
+# .. Icon view configuration ...................................................
+
+arrange_by = None
+grid_offset = (0, 0)
+grid_spacing = 100
+scroll_position = (0, 0)
+label_pos = 'bottom' # or 'right'
+text_size = 12
+icon_size = 90
+
+# .. List view configuration ...................................................
+
+# Column names are as follows:
+#
+# name
+# date-modified
+# date-created
+# date-added
+# date-last-opened
+# size
+# kind
+# label
+# version
+# comments
+#
+list_icon_size = 16
+list_text_size = 12
+list_scroll_position = (0, 0)
+list_sort_by = 'name'
+list_use_relative_dates = True
+list_calculate_all_sizes = False,
+list_columns = ('name', 'date-modified', 'size', 'kind', 'date-added')
+list_column_widths = {
+ 'name': 300,
+ 'date-modified': 181,
+ 'date-created': 181,
+ 'date-added': 181,
+ 'date-last-opened': 181,
+ 'size': 97,
+ 'kind': 115,
+ 'label': 100,
+ 'version': 75,
+ 'comments': 300,
+}
+list_column_sort_directions = {
+ 'name': 'ascending',
+ 'date-modified': 'descending',
+ 'date-created': 'descending',
+ 'date-added': 'descending',
+ 'date-last-opened': 'descending',
+ 'size': 'descending',
+ 'kind': 'ascending',
+ 'label': 'ascending',
+ 'version': 'ascending',
+ 'comments': 'ascending',
+}
+
+# .. License configuration .....................................................
+
+# TODO: Use licenses from the app bundle.