1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
|
# 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
CXXFLAGS="$CXXFLAGS -fno-rtti -fno-exceptions -nostdinc++"
# 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
}
|