Files
adam d4f9485f90 Modern C++.
Frankly I don't care to try to support a wide variety of
"older" stuff.  I don't have the time, and I don't think
it's sensible to promote being able to play the
modified form of this game (using my dynamic system) on
toasters and coffee makers.  Most systems with the capacity
to handle what I'll wind up demanding will probably
support C++23 already.
2024-04-28 02:00:31 -04:00

784 lines
23 KiB
Plaintext

# This file is sourced by build.sh
# Include build functions used here
. build/unix/config_functions
. build/unix/menu_functions
. build/unix/ansi
uqm_requirements()
{
# Some requirements:
have_build_tools_language C || exit 1
have_build_tools_language CXX || exit 1
have_build_tool LINK || exit 1
case "$HOST_SYSTEM" in
MINGW32*|cegcc)
have_build_tool WINDRES || exit 1
;;
Darwin)
have_build_tools_language OBJC || exit 1
have_build_tool REZ || exit 1
;;
esac
# Define WORDS_BIGENDIAN on bigendian machines
check_endianness
# Libraries always used
have_library SDL 1.2.8
have_library SDL2
have_library SDL 1.2.8 || have_library SDL2 || exit 1
use_library libpng || exit 1
case "$HOST_SYSTEM" in
WINSCW|ARMV5|GCCE)
# Symbian does not use dynamically generated config.h
return
;;
esac
# Add defines for HAVE_READDIR_R, HAVE_SETENV, HAVE_STRUPR,
# HAVE_STRCASECMP, and HAVE_STRICMP
define_have_symbol readdir_r
define_have_symbol setenv
define_have_symbol strupr
define_have_symbol strcasecmp
define_have_symbol stricmp
# Check to see whether math functions are available for free.
define_have_symbol acos
# Require either strcasecmp or stricmp.
if not have_symbol strcasecmp && not have_symbol stricmp; then
echo "Fatal: Your system defines neither strcasecmp() nor stricmp()."
exit 1
fi
# If we don't have math for free, add -lm to LDFLAGS.
if not have_symbol acos; then
LDFLAGS="$LDFLAGS -lm"
fi
# Add defines for HAVE_ISWGRAPH, HAVE_WCHAR_T, and HAVE_WINT_T
define_have_symbol iswgraph
define_have_type wchar_t
define_have_type wint_t
# Add defines for HAVE_GETOPT_LONG and HAVE_REGEX_H
define_have_symbol getopt_long
define_have_header regex.h
# If we have the regex header, see if we need to link it specially
case "$HOST_SYSTEM" in
MINGW32*)
LDFLAGS="$LDFLAGS -lregex"
;;
esac
# Add define for HAVE__BOOL
define_have_type _Bool
# Add an environment variable for MACRO_WIN32 and MACRO___MINGW32__
define_have_macro WIN32
define_have_macro __MINGW32__
if [ -n "$MACRO___MINGW32__" ]; then
USE_WINSOCK=1
fi
}
uqm_prepare_config()
{
# Describe the menu:
MENU_main_ITEMS="debug graphics sound mikmod ovcodec netplay joystick \
ioformat accel threadlib"
case "$HOST_SYSTEM" in
Darwin|WINSCW|ARMV5|GCCE)
# Installation directory not modifiable
;;
MINGW32*|cegcc)
# No install procedure available for MinGW
;;
*)
MENU_main_ITEMS="$MENU_main_ITEMS install_path"
;;
esac
MENU_main_TITLE="Main menu"
MENU_main_ITEM_debug_TYPE=CHOICE
MENU_main_ITEM_graphics_TYPE=CHOICE
MENU_main_ITEM_sound_TYPE=CHOICE
MENU_main_ITEM_mikmod_TYPE=CHOICE
MENU_main_ITEM_ovcodec_TYPE=CHOICE
MENU_main_ITEM_netplay_TYPE=CHOICE
MENU_main_ITEM_joystick_TYPE=CHOICE
MENU_main_ITEM_ioformat_TYPE=CHOICE
MENU_main_ITEM_accel_TYPE=CHOICE
MENU_main_ITEM_threadlib_TYPE=CHOICE
MENU_main_ITEM_install_path_TYPE=MENU
CHOICE_debug_OPTIONS="nodebug debug strictdebug"
CHOICE_debug_TITLE="Type of build"
CHOICE_debug_OPTION_nodebug_TITLE="Optimised release build"
CHOICE_debug_OPTION_nodebug_ACTION='nodebug_action'
nodebug_action() {
case "$HOST_SYSTEM" in
WINSCW)
CCOMMONFLAGS="$CCOMMONFLAGS -O2 -d NDEBUG"
;;
ARMV5)
CCOMMONFLAGS="$CCOMMONFLAGS -O3 -Otime -DNDEBUG"
;;
GCCE)
CCOMMONFLAGS="$CCOMMONFLAGS -O3 -DNDEBUG"
;;
*)
CCOMMONFLAGS="$CCOMMONFLAGS -O3 -DNDEBUG"
;;
esac
DEBUG=0
}
CHOICE_debug_OPTION_debug_TITLE="Debugging build"
CHOICE_debug_OPTION_debug_ACTION='debug_action'
debug_action() {
case "$HOST_SYSTEM" in
WINSCW)
CCOMMONFLAGS="$CCOMMONFLAGS -g -O0 -W all -d DEBUG -d _DEBUG"
;;
ARMV5|GCCE)
CCOMMONFLAGS="$CCOMMONFLAGS -g -O0 -DDEBUG -D_DEBUG"
;;
*)
CCOMMONFLAGS="$CCOMMONFLAGS -g -O0 -W -Wall -DDEBUG"
LDFLAGS="$LDFLAGS -O0"
;;
esac
DEBUG=1
}
CHOICE_debug_OPTION_strictdebug_TITLE="Debug + strict compile checks"
CHOICE_debug_OPTION_strictdebug_ACTION='strictdebug_action'
strictdebug_action() {
case "$HOST_SYSTEM" in
WINSCW)
CCOMMONFLAGS="$CCOMMONFLAGS -g -O0 -W all -d DEBUG -d _DEBUG"
;;
ARMV5|GCCE)
CCOMMONFLAGS="$CCOMMONFLAGS -g -O0 -DDEBUG -D_DEBUG"
;;
*)
CCOMMONFLAGS="$CCOMMONFLAGS -g -O0 -DDEBUG -W -Wall"
# CCOMMONFLAGS="$CCOMMONFLAGS -O1"
# This is needed for -Wunitialized with gcc 3.4
CCOMMONFLAGS="$CCOMMONFLAGS -Wcast-qual -Wmissing-declarations \
-Wwrite-strings -Wimplicit -Wreturn-type -Wformat \
-Wswitch -Wcomment -Wchar-subscripts \
-Wparentheses -Wcast-align -Wuninitialized"
CFLAGS="$CFLAGS -Wbad-function-cast -Wmissing-prototypes \
-Wstrict-prototypes"
# CFLAGS is for flags not valid in C++.
CFLAGS="$CFLAGS -Wdeclaration-after-statement"
# Until we abandon MSVC 6
# CCOMMONFLAGS="$CCOMMONFLAGS -Waggregate-return"
# It's not unreasonable to return structs at times.
# CCOMMONFLAGS="$CCOMMONFLAGS "-Wpointer-arith"
# Some standard header won't even compile with this on
# CCOMMONFLAGS="$CCOMMONFLAGS -Wshadow"
# This gives absurd conflicts with standard files,
# like from 'y0 and y1'
# CCOMMONFLAGS="$CCOMMONFLAGS -Werror"
# We shouldn't do this until we actually nail them
# all in the original code. Then we can enforce them
# on ourselves.
# CCOMMONFLAGS="$CCOMMONFLAGS -pedantic-errors -ansi -trigraphs" # ANSI
# CCOMMONFLAGS="$CCOMMONFLAGS -Wnested-externs"
# We know they're in the code, and though we'd like to
# get rid of them, they're not bugs.
# CCOMMONFLAGS="$CCOMMONFLAGS -Winline"
# This gives too many warnings which we can do nothing
# about, obscuring legitimate warnings.
CFLAGS=`echo $CFLAGS`
CXXFLAGS=`echo $CXXFLAGS`
CCOMMONFLAGS=`echo $CCOMMONFLAGS`
# Remove all the unnecessary spaces from the flags vars
# for more readable messages.
LDFLAGS="$LDFLAGS -O0"
;;
esac
DEBUG=1
}
case "$HOST_SYSTEM" in
ARMV5|WINSCW|GCCE)
CHOICE_debug_DEFAULT=nodebug
;;
*)
CHOICE_debug_DEFAULT=debug
;;
esac
CHOICE_graphics_OPTIONS="pure opengl sdl2"
CHOICE_graphics_TITLE="Graphics Engine"
CHOICE_graphics_OPTION_pure_TITLE="SDL1 without OpenGL graphics support"
CHOICE_graphics_OPTION_pure_ACTION='graphics_pure_action'
CHOICE_graphics_OPTION_pure_PRECOND='have_library SDL 1.2.8'
graphics_pure_action() {
CFLAGS="$CFLAGS -DGFXMODULE_SDL -DSDL_DIR=SDL"
CCOMMONFLAGS="$CCOMMONFLAGS -DGFXMODULE_SDL"
GFXMODULE=sdl
HAVE_OPENGL=0
use_library SDL 1.2.8
}
CHOICE_graphics_OPTION_opengl_TITLE="SDL1 with OpenGL graphics support"
CHOICE_graphics_OPTION_opengl_ACTION='graphics_opengl_action'
CHOICE_graphics_OPTION_opengl_PRECOND="have_library SDL 1.2.8 && have_library opengl"
graphics_opengl_action() {
CFLAGS="$CFLAGS -DGFXMODULE_SDL -DHAVE_OPENGL -DSDL_DIR=SDL"
GFXMODULE=sdl
HAVE_OPENGL=1
use_library SDL 1.2.8 && use_library opengl
}
CHOICE_graphics_OPTION_sdl2_TITLE="SDL2 with modern graphics support"
CHOICE_graphics_OPTION_sdl2_ACTION='graphics_sdl2_action'
CHOICE_graphics_OPTION_sdl2_PRECOND='have_library SDL2'
graphics_sdl2_action() {
CFLAGS="$CFLAGS -DGFXMODULE_SDL -DSDL_DIR=SDL2"
GFXMODULE=sdl
HAVE_OPENGL=0
use_library SDL2
}
if have_library SDL2; then
CHOICE_graphics_DEFAULT=sdl2
elif have_library opengl; then
CHOICE_graphics_DEFAULT=opengl
else
CHOICE_graphics_DEFAULT=pure
fi
CHOICE_sound_OPTIONS="mixsdl openal"
CHOICE_sound_TITLE="Sound backend"
CHOICE_sound_OPTION_mixsdl_TITLE="Use MixSDL for sound (internal)"
CHOICE_sound_OPTION_mixsdl_ACTION=sound_mixsdl_action
sound_mixsdl_action() {
SOUNDMODULE=mixsdl
}
CHOICE_sound_OPTION_openal_TITLE="Include OpenAL support (experimental)"
CHOICE_sound_OPTION_openal_PRECOND="have_library openal"
CHOICE_sound_OPTION_openal_ACTION=sound_openal_action
sound_openal_action() {
CCOMMONFLAGS="$CCOMMONFLAGS -DHAVE_OPENAL"
SOUNDMODULE=openal
use_library openal
}
CHOICE_sound_DEFAULT=mixsdl
CHOICE_ovcodec_OPTIONS="standard tremor none"
CHOICE_ovcodec_TITLE="Ogg Vorbis codec"
CHOICE_ovcodec_OPTION_standard_TITLE="Xiph libogg + libvorbis"
CHOICE_ovcodec_OPTION_standard_PRECOND="have_library vorbisfile"
CHOICE_ovcodec_OPTION_standard_ACTION=ovcodec_standard_action
ovcodec_standard_action() {
use_library vorbisfile
OGGVORBIS=vorbisfile
}
CHOICE_ovcodec_OPTION_tremor_TITLE="Tremor (avoids floating point math)"
CHOICE_ovcodec_OPTION_tremor_PRECOND="have_library tremor"
CHOICE_ovcodec_OPTION_tremor_ACTION=ovcodec_tremor_action
ovcodec_tremor_action() {
CCOMMONFLAGS="$CCOMMONFLAGS -DOVCODEC_TREMOR"
OGGVORBIS=tremor
use_library tremor
}
CHOICE_ovcodec_OPTION_none_TITLE="No Ogg Vorbis support"
CHOICE_ovcodec_OPTION_none_ACTION=ovcodec_none_action
ovcodec_none_action() {
CCOMMONFLAGS="$CCOMMONFLAGS -DOVCODEC_NONE"
OGGVORBIS=none
}
CHOICE_ovcodec_DEFAULT=standard
CHOICE_mikmod_OPTIONS="internal external"
CHOICE_mikmod_TITLE="Tracker music support"
CHOICE_mikmod_OPTION_internal_TITLE="Included libmikmod"
CHOICE_mikmod_OPTION_internal_ACTION=mikmod_internal_action
mikmod_internal_action() {
CCOMMONFLAGS="$CCOMMONFLAGS -DUSE_INTERNAL_MIKMOD"
USE_INTERNAL_MIKMOD=1
}
CHOICE_mikmod_OPTION_external_TITLE="System libmikmod"
CHOICE_mikmod_OPTION_external_PRECOND="have_library libmikmod"
CHOICE_mikmod_OPTION_external_ACTION=mikmod_external_action
mikmod_external_action() {
USE_INTERNAL_MIKMOD=""
use_library libmikmod
}
CHOICE_mikmod_DEFAULT=internal
CHOICE_joystick_OPTIONS="enabled disabled"
CHOICE_joystick_TITLE="Joystick support"
CHOICE_joystick_OPTION_enabled_TITLE="enabled"
#CHOICE_joystick_OPTION_enabled_PRECOND="have_symbol SDL_Joystick"
# TODO: Check whether SDL has joystick support.
CHOICE_joystick_OPTION_enabled_ACTION=joystick_enabled_action
joystick_enabled_action() {
CCOMMONFLAGS="$CCOMMONFLAGS -DHAVE_JOYSTICK"
}
CHOICE_joystick_OPTION_disabled_TITLE="disabled"
case "$HOST_SYSTEM" in
ARMV5|WINSCW|GCCE)
CHOICE_joystick_DEFAULT=disabled
;;
*)
CHOICE_joystick_DEFAULT=enabled
;;
esac
CHOICE_netplay_OPTIONS="none full ipv4"
CHOICE_netplay_TITLE="Network Supermelee support"
CHOICE_netplay_OPTION_none_TITLE="disabled"
CHOICE_netplay_OPTION_none_ACTION=netplay_none_action
netplay_none_action() {
NETPLAY=""
}
CHOICE_netplay_OPTION_full_TITLE="IPv4 and IPv6"
CHOICE_netplay_OPTION_full_PRECOND="have_library netlibs"
CHOICE_netplay_OPTION_full_ACTION=netplay_full_action
netplay_full_action() {
CCOMMONFLAGS="$CCOMMONFLAGS -DNETPLAY=NETPLAY_FULL"
if [ -n "$MACRO_WIN32" ]; then
LDFLAGS="$LDFLAGS -lws2_32"
fi
NETPLAY="FULL"
use_library netlibs
}
CHOICE_netplay_OPTION_ipv4_TITLE="IPv4; no IPv6"
CHOICE_netplay_OPTION_ipv4_PRECOND="have_library netlibs"
CHOICE_netplay_OPTION_ipv4_ACTION=netplay_ipv4_action
netplay_ipv4_action() {
CCOMMONFLAGS="$CCOMMONFLAGS -DNETPLAY=NETPLAY_IPV4"
NETPLAY="IPV4"
use_library netlibs
}
CHOICE_netplay_DEFAULT=full
CHOICE_ioformat_OPTIONS="stdio stdio_zip"
CHOICE_ioformat_TITLE="Supported file i/o methods"
CHOICE_ioformat_OPTION_stdio_TITLE="Only direct file i/o"
CHOICE_ioformat_OPTION_stdio_zip_TITLE="Direct & .zip file i/o"
CHOICE_ioformat_OPTION_stdio_zip_PRECOND="have_library zlib"
CHOICE_ioformat_OPTION_stdio_zip_ACTION="ioformat_stdio_zip_action"
ioformat_stdio_zip_action() {
CCOMMONFLAGS="$CCOMMONFLAGS -DHAVE_ZIP=1"
USE_ZIP_IO=1
use_library zlib
}
CHOICE_ioformat_DEFAULT=stdio_zip
CHOICE_accel_OPTIONS="asm plainc"
CHOICE_accel_TITLE="Graphics/Sound optimizations"
CHOICE_accel_OPTION_asm_TITLE="Platform acceleration (asm, etc.)"
CHOICE_accel_OPTION_asm_ACTION="accel_asm_action"
accel_asm_action() {
CCOMMONFLAGS="$CCOMMONFLAGS -DUSE_PLATFORM_ACCEL"
USE_PLATFORM_ACCEL=1
}
CHOICE_accel_OPTION_plainc_TITLE="Only plain C code"
CHOICE_accel_OPTION_plainc_ACTION="accel_plainc_action"
accel_plainc_action() {
USE_PLATFORM_ACCEL=0
}
CHOICE_accel_DEFAULT=asm
CHOICE_threadlib_OPTIONS="sdl pthread"
CHOICE_threadlib_TITLE="Thread library"
CHOICE_threadlib_OPTION_sdl_TITLE="SDL-controlled thread library"
CHOICE_threadlib_OPTION_sdl_ACTION="threadlib_sdl_action"
threadlib_sdl_action() {
CCOMMONFLAGS="$CCOMMONFLAGS -DTHREADLIB_SDL"
THREADLIB="SDL"
}
CHOICE_threadlib_OPTION_pthread_TITLE="Pthread thread library"
CHOICE_threadlib_OPTION_pthread_PRECOND="have_library pthread"
CHOICE_threadlib_OPTION_pthread_ACTION="threadlib_pthread_action"
threadlib_pthread_action() {
CCOMMONFLAGS="$CCOMMONFLAGS -DTHREADLIB_PTHREAD"
THREADLIB="PTHREAD"
use_library pthread
}
CHOICE_threadlib_DEFAULT=sdl
MENU_install_path_ITEMS="install_prefix install_bindir install_libdir \
install_sharedir"
MENU_install_path_TITLE="Installation paths"
MENU_install_path_ITEM_install_prefix_TYPE=INPUT
MENU_install_path_ITEM_install_bindir_TYPE=INPUT
MENU_install_path_ITEM_install_libdir_TYPE=INPUT
MENU_install_path_ITEM_install_sharedir_TYPE=INPUT
INPUT_install_prefix_DEFAULT="/usr/local/games"
INPUT_install_prefix_TITLE="Installation prefix"
INPUT_install_prefix_VALIDATOR=validate_path
INPUT_install_prefix_ACTION='eval INSTALL_PREFIX=$MENU_install_prefix_VALUE'
INPUT_install_bindir_DEFAULT='$prefix/bin'
INPUT_install_bindir_TITLE="Location for binaries"
INPUT_install_bindir_VALIDATOR=validate_path
INPUT_install_libdir_DEFAULT='$prefix/lib'
INPUT_install_libdir_TITLE="Location for non-sharable data"
INPUT_install_libdir_VALIDATOR=validate_path
INPUT_install_sharedir_DEFAULT='$prefix/share'
INPUT_install_sharedir_TITLE="Location for sharable data"
INPUT_install_sharedir_VALIDATOR=validate_path
}
uqm_do_config()
{
# Show the menu and let people set things
do_menu MENU main "$BUILD_WORK/config.state"
echo "Configuration complete."
}
uqm_process_config() {
menu_process MENU main
# Set INSTALL_LIBDIR, INSTALL_BINDIR, and INSTALL_SHAREDIR to the specified
# values, replacing '$prefix' to the prefix set.
local prefix
prefix="$INPUT_install_prefix_VALUE"
eval INSTALL_BINDIR="${INPUT_install_bindir_VALUE%/}/"
eval INSTALL_LIBDIR="${INPUT_install_libdir_VALUE%/}/"
eval INSTALL_SHAREDIR="${INPUT_install_sharedir_VALUE%/}/"
# Set the content dir
CONTENTDIR="${INSTALL_SHAREDIR}uqm/content"
CCOMMONFLAGS="$CCOMMONFLAGS -I\"$BUILD_WORK\""
# Set C++ only flags
# These allow use of C++ without the standard library
# ADAM: We're permitting ALL of C++!
#CXXFLAGS="$CXXFLAGS -fno-rtti -fno-exceptions -nostdinc++"
# Also use more modern C++
CXXFLAGS="$CXXFLAGS -std=c++2b"
# At this point, all the compiler flags must be set.
CFLAGS="$CFLAGS $CCOMMONFLAGS"
CXXFLAGS="$CXXFLAGS $CCOMMONFLAGS"
CCOMMONFLAGS=""
# Export the HAVE_ symbols to config_unix.h, using config_unix.h.in
# as template (or config_win.h/config_win.h.in).
SUBSTITUTE_VARS="$HAVE_SYMBOLS CONTENTDIR"
case "$HOST_SYSTEM" in
MINGW32*|CYGWIN*)
SUBSTITUTE_FILES="config_win.h"
;;
*)
SUBSTITUTE_FILES="config_unix.h"
;;
esac
substitute_vars SUBSTITUTE_VARS SUBSTITUTE_FILES src "$BUILD_WORK"
# Make build.vars from build.vars.in, substituting variables.
SUBSTITUTE_VARS="BUILD_SYSTEM HOST_SYSTEM CFLAGS CXXFLAGS LDFLAGS LINK \
PREPROC_C MKDEP_C COMPILE_C \
PREPROC_CXX MKDEP_CXX COMPILE_CXX \
PREPROC_OBJC MKDEP_OBJC COMPILE_OBJC \
MAKE ECHON SED DEBUG JOYSTICK NETPLAY \
OGGVORBIS SOUNDMODULE USE_INTERNAL_MIKMOD \
GFXMODULE HAVE_OPENGL \
HAVE_GETOPT_LONG HAVE_REGEX_H_FLAG \
USE_ZIP_IO USE_PLATFORM_ACCEL THREADLIB USE_WINSOCK \
INSTALL_LIBDIR INSTALL_BINDIR INSTALL_SHAREDIR \
REZ WINDRES $HAVE_SYMBOLS"
SUBSTITUTE_FILES="build.vars"
substitute_vars SUBSTITUTE_VARS SUBSTITUTE_FILES . "$BUILD_WORK"
# Make 'uqm' shell script from uqm-wrapper.in, substituting variables.
SUBSTITUTE_VARS="INSTALL_LIBDIR INSTALL_BINDIR INSTALL_SHAREDIR uqm_NAME"
SUBSTITUTE_FILES="uqm-wrapper"
substitute_vars SUBSTITUTE_VARS SUBSTITUTE_FILES build/unix "$BUILD_WORK"
}
uqm_load_config()
{
do_menu_load MENU main "$BUILD_WORK/config.state"
}
uqm_save_config()
{
do_menu_save MENU main "$BUILD_WORK/config.state"
}
uqm_pre_build() {
: # Nothing to do
}
uqm_post_build() {
local TARGET_FILE
local RFORK
eval TARGET_FILE="\$BUILD_WORK/\${${BUILD_PROJECT}_NAME}"
RFORK="src/res/darwin/${BUILD_PROJECT}.r"
test -f "$TARGET_FILE" || return
# If run from the command-line on OSX, the Window Manager
# will refuse to recognize the window unless the program has
# a resource fork; so we give it a small one here. When
# run from inside an application package, this step is useless
# (the cp command in the install step implicitly strips off
# the resource fork, in fact)
case "$HOST_SYSTEM" in
Darwin)
$REZ "$RFORK" -o "$TARGET_FILE"
;;
ARMV5)
cp "$TARGET_FILE" "$BUILD_EPOCROOT/epoc32/release/armv5/urel/"
cd src/symbian
cmd \\/C bldmake bldfiles
cmd \\/C abld build armv5 urel
cd ../..
;;
WINSCW)
cp "$TARGET_FILE" "$BUILD_EPOCROOT/epoc32/release/winscw/udeb/"
cd src/symbian
cmd \\/C bldmake bldfiles
cmd \\/C abld build winscw udeb
cd ../..
;;
GCCE)
cp "$TARGET_FILE" "$BUILD_EPOCROOT/epoc32/release/armv5/urel/"
cd src/symbian
cmd \\/C bldmake bldfiles
cmd \\/C abld build gcce urel
cd ../..
;;
esac
}
uqm_pre_install() {
: # Nothing to do
}
uqm_install() {
case "$HOST_SYSTEM" in
Darwin)
uqm_install_osx
;;
MINGW32*)
echo "No installation procedure available for MinGW."
echo "Read the manual for more information."
;;
cegcc*)
echo "No installation procedure available for Windows CE."
echo "Read the manual for more information."
;;
WINSCW)
uqm_install_winscw
;;
ARMV5)
uqm_install_armv5
;;
GCCE)
uqm_install_gcce
;;
*)
generic_install
;;
esac
}
uqm_post_install() {
: # Nothing to do
}
uqm_install_osx() {
local VERSION HEADERS HEADER HEADER_FILE FRAMEWORK
VERSION=`head -1 content/version`
INSTROOT="$BUILD_WORK/The Ur-Quan Masters.app/Contents"
# Make directory structure
echo "Creating directory structure..." >&2
mkdirhier "$INSTROOT/MacOS" 0755
mkdirhier "$INSTROOT/Frameworks" 0755
mkdirhier "$INSTROOT/Resources/content/addons" 0755
mkdirhier "$INSTROOT/Resources/content/packages" 0755
# Install misc. resources, icons, etc.
echo "Installing miscellaneous resources..." >&2
$SED "s/@@VERSION@@/$VERSION/g" src/res/darwin/Info.plist > \
"$INSTROOT/Info.plist"
cp src/res/darwin/PkgInfo "$INSTROOT"
cp "src/res/darwin/The Ur-Quan Masters.icns" "$INSTROOT/Resources"
# Find Frameworks and copy them into the application.
echo "Copying dependancy Frameworks..." >&2
HEADERS="Ogg/Ogg.h SDL/SDL.h SDL_image/SDL_image.h Vorbis/vorbisfile.h"
if [ "$uqm_SOUNDMODULE" = openal ]; then
HEADERS="$HEADERS OpenAL/al.h"
fi
for HEADER in $HEADERS; do
HEADER_FILE=`basename $HEADER`
eval FRAMEWORK=`echo '' | \
$PREPROC_C -D__MACOSX__ -include $HEADER - | \
awk '(/'$HEADER_FILE'/ && $2 == 1) { print $3; exit }' | \
$SED 's/.Headers.*$/"/'`
cp -a "$FRAMEWORK" "$INSTROOT/Frameworks"
done
# Install game content (it should probably make a zipfile)
echo "Creating base content package..." >&2
cp content/version "$INSTROOT/Resources/content/"
(cd content && \
find . -type f -not -path '*/CVS*' -not -path '*/.svn*' -not -path '*/addons*' -print | \
$SED 's/^..//' | zip -X -q -n .ogg -8 -@ uqm-${VERSION}-prv-content.uqm)
mv content/uqm-$VERSION-prv-content.uqm "$INSTROOT/Resources/content/packages"
echo "Creating voice content package..." >&2
(cd content/addons && \
find 3dovoice -type f -not -path '*/CVS*' -not -path '*/.svn*' -print | \
zip -X -q -n .ogg -8 -@ ../uqm-${VERSION}-prv-voice.uqm)
mv content/uqm-$VERSION-prv-voice.uqm "$INSTROOT/Resources/content/addons"
echo "Creating 3do music content package..." >&2
(cd content/addons && \
find 3domusic -type f -not -path '*/CVS*' -not -path '*/.svn*' -print | \
zip -X -q -n .ogg -8 -@ ../uqm-${VERSION}-prv-3domusic.uqm)
mv content/uqm-$VERSION-prv-3domusic.uqm "$INSTROOT/Resources/content/addons"
# Install game binary (and rename it)
echo "Installing executable..." >&2
cp $uqm_NAME "$INSTROOT/MacOS/The Ur-Quan Masters"
}
uqm_install_winscw() {
local PRIVATE_DIR
PRIVATE_DIR="$BUILD_EPOCROOT/epoc32/winscw/c/private/A000A0C3"
uqm_create_symbian_content_package
echo "Creating directory structure to $PRIVATE_DIR ..."
mkdir "$PRIVATE_DIR"
mkdir "$PRIVATE_DIR/content"
mkdir "$PRIVATE_DIR/content/packages"
mkdir "$PRIVATE_DIR/userdata"
echo "Copying data to $PRIVATE_DIR ..."
cp content/version "$PRIVATE_DIR/content"
cp content.uqm "$PRIVATE_DIR/content/packages"
cp src/symbian/uqm.cfg "$PRIVATE_DIR/userdata"
}
uqm_install_armv5() {
uqm_create_symbian_content_package
cd src/symbian
cmd \\/C makekeys -cert -expdays 9999 -password asdfgh -len 2048 -dname "CN=UQM OR=Ur-Quan Masters CO=FI" uqm.key uqm.cer
cmd \\/C makesis uqm-armv5.pkg uqm.sis
cmd \\/C signsis -v uqm.sis uqm.sisx uqm.cer uqm.key asdfgh
mv uqm.sisx ../..
cd ../..
}
uqm_install_gcce() {
uqm_create_symbian_content_package
cd src/symbian
cmd \\/C makekeys -cert -expdays 9999 -password asdfgh -len 2048 -dname "CN=UQM OR=Ur-Quan Masters CO=FI" uqm.key uqm.cer
cmd \\/C makesis uqm-gcce.pkg uqm.sis
cmd \\/C signsis -v uqm.sis uqm.sisx uqm.cer uqm.key asdfgh
mv uqm.sisx ../..
cd ../..
}
uqm_create_symbian_content_package() {
if [ -e "content.uqm" ]; then
echo "Content package already exists, skipping"
return
fi
local ANIFILE ANIFILES DNAME ESC_DNAME FONTDIR FONTDIRS FONTFILES
echo "Building temporary content directory..."
cd content
find . -type f -not -path '*/CVS*' -not -path '*/.svn*' -not -path './addons*' -not -name "version" -not -name '*.png' -not -name '*.ani' -not -name '*.sml' -not -name '*.med' -not -name '*.mid' -not -name '*.big' >../content.lst
tar cf ../tmp1.tar -T ../content.lst
rm ../content.lst
mkdir ../tmpcontent
cd ../tmpcontent
tar xf ../tmp1.tar
rm ../tmp1.tar
cd ../content
echo "Packing ani files..."
ANIFILES=`find . -regex ".*\(sml\|med\|mid\|big\|ani\)$"`
for ANIFILE in $ANIFILES; do
DNAME=`dirname $ANIFILE`/
ESC_DNAME=`echo $DNAME|sed "s/\//\\\\\\\\\//g"`
mkdirhier ../tmpcontent/$DNAME 0755
zip -q -j -0 ../tmpcontent/$ANIFILE $ANIFILE `cat $ANIFILE|cut -d " " -f 1|sed s/^/$ESC_DNAME/`
done
echo "Packing font files..."
FONTDIRS=`find . -name '*.fon'`
for FONTDIR in $FONTDIRS; do
FONTFILES=`find $FONTDIR -name '*.png'|sort -t. +2.4 -n`
zip -q -j -0 ../tmpcontent/$FONTDIR $FONTFILES
done
cd ../tmpcontent
echo "Building content package..."
zip -q -r ../content.uqm .
cd ..
echo "Removing temporary content directory..."
rm -rf tmpcontent
}
uqm_clean() {
case "$HOST_SYSTEM" in
MINGW32*|CYGWIN*)
rm -f "$BUILD_WORK/config_win.h"
;;
ARMV5|GCCE)
local TARGET_FILE
eval TARGET_FILE="\$BUILD_WORK/\${${BUILD_PROJECT}_NAME}"
rm -f "$BUILD_WORK/config_unix.h"
rm -f "$BUILD_EPOCROOT/epoc32/release/armv5/urel/$TARGET_FILE"
rm -f $TARGET_FILE uqm.sisx content.uqm
cd src/symbian
cmd \\/C abld reallyclean
cmd \\/C bldmake clean
rm -f uqm.sis uqm.key uqm.cer
cd ../..
;;
WINSCW)
local TARGET_FILE
eval TARGET_FILE="\$BUILD_WORK/\${${BUILD_PROJECT}_NAME}"
rm -f "$BUILD_WORK/config_unix.h"
rm -f "$BUILD_EPOCROOT/epoc32/release/winscw/udeb/$TARGET_FILE"
rm -f $TARGET_FILE content.uqm
cd src/symbian
cmd \\/C abld reallyclean
cmd \\/C bldmake clean
cd ../..
;;
*)
rm -f "$BUILD_WORK/config_unix.h"
;;
esac
}