blob: 95bb91fb72608759d2de874b6e44c9aa8c460e6a [file] [log] [blame]
David 'Digit' Turner46be4872009-06-04 16:07:01 +02001#/bin/sh
2#
3# this script is used to rebuild SDL from sources in the current
4# directory. It depends on the Android emulator build scripts
5# that should normally be located in ../emulator/android/build
6# but you can also use ANDROID_QEMU_PATH in your environment
7# to point to the top of the Android emulator sources
8#
9#
10
11# first, let's see which system we're running this on
12cd `dirname $0`
13
14# try to find the Android build directory automatically
15if [ -z "$ANDROID_QEMU_PATH" ] ; then
16 if [ -f ../../android/build/common.sh ] ; then
17 ANDROID_QEMU_PATH=../..
18 else
19 echo "You must define ANDROID_QEMU_PATH in your environment to point"
20 echo "to the directory containing the Android emulator's sources."
21 exit 1
22 fi
23fi
24
25if [ ! -d $ANDROID_QEMU_PATH ] ; then
26 echo "Your ANDROID_QEMU_PATH does not point to a valid directory."
27 exit 1
28fi
29
30if [ ! -f $ANDROID_QEMU_PATH/android/build/common.sh ] ; then
31 echo "Your ANDROID_QEMU_PATH does not point to a directory that"
32 echo "contains the Android emulator build scripts."
33 exit 1
34fi
35
36# source common functions definitions
37. $ANDROID_QEMU_PATH/android/build/common.sh
38
39# Parse options
40OPTION_TRY_64=no
41OPTION_HELP=no
42OPTION_TARGETS=
43OPTION_FORCE_AUTODETECT=no
44OPTION_NO_TIGER=no
45
46if [ -z "$CC" ] ; then
47 CC=gcc
48fi
49
50for opt do
51 optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
52 case "$opt" in
53 --help|-h|-\?) OPTION_HELP=yes
54 ;;
55 --verbose)
56 if [ "$VERBOSE" = "yes" ] ; then
57 VERBOSE2=yes
58 else
59 VERBOSE=yes
60 fi
61 ;;
62 --cc=*) CC="$optarg" ; HOSTCC=$CC
63 ;;
64 --try-64) OPTION_TRY_64=yes
65 ;;
66 --prefix=*) OPTION_TARGETS="$OPTION_TARGETS $optarg"
67 ;;
68 --force-autodetect) OPTION_FORCE_AUTODETECT=yes
69 ;;
70 --no-tiger) OPTION_NO_TIGER=yes
71 ;;
72 *)
73 echo "unknown option '$opt', use --help"
74 exit 1
75 esac
76done
77
78# Print the help message
79#
80if [ "$OPTION_HELP" = "yes" ] ; then
81 cat << EOF
82
83Usage: rebuild.sh [options]
84Options: [defaults in brackets after descriptions]
85EOF
86 echo "Standard options:"
87 echo " --help print this message"
88 echo " --cc=PATH specify C compiler [$CC]"
89 echo " --try-64 try to build a 64-bit executable (may crash)"
90 echo " --verbose verbose configuration"
91 echo " --force-autodetect force feature auto-detection"
92 echo " --no-tiger do not generate Tiger-compatible binaries (OS X only)"
93 echo ""
94 exit 1
95fi
96
97# we only support generating 32-bit binaris on 64-bit systems.
98# And we may need to add a -Wa,--32 to CFLAGS to let the assembler
99# generate 32-bit binaries on Linux x86_64.
100#
101if [ "$OPTION_TRY_64" != "yes" ] ; then
102 force_32bit_binaries
103fi
104
105# default target
106if [ -z "$OPTION_TARGETS" ] ; then
107 OPTION_TARGETS=out/$OS
108fi
109
110# we can build SDL with Cygwin, so enable it
111enable_cygwin
112
113setup_toolchain
114
115###
116### Special compiler and linker flags
117###
118
119case "$OS" in
120 linux-*)
121 BUILD_CFLAGS="-D_GNU_SOURCE=1 -fvisibility=hidden -DXTHREADS -D_REENTRANT"
122 # prevent -fstack-protector or the generated binaries will not link
123 BUILD_CFLAGS="$BUILD_CFLAGS -fno-stack-protector"
124 ;;
125 darwin-*)
126 BUILD_CFLAGS="-D_GNU_SOURCE=1 -fvisibility=hidden -DTARGET_API_MAC_CARBON -DTARGET_API_MAC_OSX -D_THREAD_SAFE -force_cpusubtype_ALL -fpascal-strings"
127 # detect the 10.4 SDK and use it automatically
128 TIGER_SDK=/Developer/SDKs/MacOSX10.4u.sdk
129 if [ ! -d $TIGER_SDK -a $OPTION_NO_TIGER = no ] ; then
130 echo "Please install the 10.4 SDK at $TIGER_SDK to generate Tiger-compatible binaries."
131 echo "If you don't want compatibility, use --no-tiger option instead."
132 exit 1
133 fi
134 if [ -d $TIGER_SDK ] ; then
135 TIGER_OPTS="-isysroot $TIGER_SDK -mmacosx-version-min=10.4"
136 BUILD_CFLAGS="$BUILD_CFLAGS $TIGER_OPTS"
137 BUILD_LDFLAGS="$BUILD_LDFLAGS $TIGER_OPTS -Wl,-syslibroot,$(TIGER_SDK)"
138 echo "Using OS X 10.4 SDK to generate Tiger-compatible binaries."
139 else
140 echo "Warning: the generated binaries will not be compatible with Tiger."
141 fi
142 ;;
143 windows)
144 BUILD_CFLAGS="-D_GNU_SOURCE=1"
145 ;;
146 *)
147 BUILD_CFLAGS=
148esac
149
150# BUILD_CFLAGS are used to build SDL, but SDL_CFLAGS are used
151# when clients want to use its facilities
152#
153case "$HOST_OS" in
154 linux)
155 SDL_CFLAGS="-D_GNU_SOURCE=1 -D_REENTRANT"
156 SDL_STATIC_LIBS="-lm -ldl -lpthread -lrt"
157 ;;
158 darwin)
159 SDL_CFLAGS="-D_GNU_SOURCE=1 -D_THREAD_SAFE"
David 'Digit' Turner34d16512010-05-18 17:02:33 -0700160 SDL_STATIC_LIBS="-Wl,-framework,OpenGL -Wl,-framework,Cocoa -Wl,-framework,QuickTime -Wl,-framework,ApplicationServices -Wl,-framework,Carbon -Wl,-framework,IOKit"
David 'Digit' Turner46be4872009-06-04 16:07:01 +0200161 ;;
162 windows)
163 SDL_CFLAGS="-D_GNU_SOURCE=1 -Dmain=SDL_main"
164 SDL_STATIC_LIBS="-luser32 -lgdi32 -lwinmm"
165 ;;
166 *)
167 SDL_CFLAGS=
168 SDL_STATIC_LIBS=
169esac
170
171DOLLAR="$"
172SDL_STATIC_LIBS="$DOLLAR{libdir}/libSDLmain.a $DOLLAR{libdir}/libSDL.a $SDL_STATIC_LIBS"
173
174###
175### Features probes
176###
177
178CONFIG_LIBC=yes
179
180###
181### Configuration files generation
182###
183
184# create the objs directory that is going to contain all generated files
185# including the configuration ones
186#
187mkdir -p objs
188
189config_add ()
190{
191 echo "$1" >> $config_h
192}
193
194# used to add a macro define/undef line to the configuration
195# $1: macro name
196# $2: 1, 0, yes or no
197# $3: optional log prefix
198config_add_macro ()
199{
200 local logname
201 logname="${3:-CfgMacro }"
202 case "$2" in
203 0|no|false)
204 config_add "/* #undef $1 */"
205 log "$logname: $1=0"
206 ;;
207 1|yes|true)
208 config_add "#define $1 1"
209 log "$logname: $1=1"
210 ;;
211 esac
212}
213
214# used to add host-os-specific driver macros to the config file
David 'Digit' Turner63e644f2010-05-14 14:02:19 -0700215# $1 : driver prefix, e.g. DRIVERS_VIDEO
David 'Digit' Turner46be4872009-06-04 16:07:01 +0200216# $2 : macro prefix
David 'Digit' Turner63e644f2010-05-14 14:02:19 -0700217# this will look for DRIVERS_VIDEO_${HOST_OS}, and, if it is not
218# defined in DRIVERS_VIDEO_default
David 'Digit' Turner46be4872009-06-04 16:07:01 +0200219#
220# then this will call 'config_add ${2}_${driver}' for each driver listed
221#
222config_add_driver_macros ()
223{
224 local driver_list="`var_value ${1}_${HOST_OS}`"
225 local driver_name
226 if [ -z "$driver_list" ] ; then
227 driver_list="`var_value ${1}_default`"
228 fi
229 for driver_name in $driver_list; do
230 config_add_macro "${2}_${driver_name}" yes
231 done
232}
233
234config_h=objs/SDL_config.h
235
236# a function used to check the availability of a given Standard C header
237# $1 : header name, without the .h suffix nor enclosing brackets (e.g. 'memory' for <memory.h>)
238# this will update the configuration with a relevant line
239sdl_check_header ()
240{
241 local result
242 local header
243 local macro
244 header="<$1.h>"
245 macro=`to_uppercase $1`
246 macro=`echo $macro | tr '/' '_'`
247 feature_check_header result "$header"
248 config_add_macro HAVE_${macro}_H $result "StdCHeader "
249}
250
251# call sdl_check_header with a list of header names
252sdl_check_headers ()
253{
254 for hh in $*; do
255 sdl_check_header "$hh"
256 done
257}
258
259# a function used to check that a given function is available in the C library
260# this will update the configuration with a relevant line
261# $1: function name
262# $2: optional, libraries to link against
263#
264sdl_check_func ()
265{
266 local result
267 local funcname
268 local macro
269 funcname="$1"
270 macro=`to_uppercase $1`
271 rm -f $TMPC
272 cat > $TMPC <<EOF
273#undef $funcname
274#define $funcname _innocuous_$funcname
275#include <assert.h>
276#undef $funcname
277
278typedef void (*func_t)(void);
279extern void $funcname(void);
280func_t _dummy = $funcname;
281int main(void)
282{
283 return _dummy == $funcname;
284}
285EOF
286 EXTRA_LDFLAGS="$2"
287 feature_check_link result
288 config_add_macro HAVE_${macro} $result "StdCFunc "
289}
290
291# call sdl_check_func with a list of functions
292sdl_check_funcs ()
293{
294 for ff in $*; do
295 sdl_check_func "$ff"
296 done
297}
298
299# check endianess of the host platform
300sdl_check_endianess ()
301{
302 cat > $TMPC <<EOF
303 int main(void)
304 {
305 union {
306 unsigned short v;
307 unsigned char b[2];
308 } u;
309
310 u.v = 0x1234;
311 return (u.b[0] == 0x12);
312 }
313EOF
314 feature_run_exec test_e
315 if [ "$test_e" = "1" ] ; then
316 eval $1=4321
317 else
318 eval $1=1234
319 fi
320}
321
322
323generate_SDL_config_h ()
324{
325 echo "/* This file was autogenerated by '$PROGNAME' - do not edit */" > $config_h
326
327 config_add "#ifndef _SDL_config_h"
328 config_add "#define _SDL_config_h"
329 config_add ""
330 config_add "#include \"SDL_platform.h\""
331 config_add ""
332
333 # true for all architectures these days
334 config_add_macro SDL_HAS_64BIT_TYPE 1
335
336 sdl_check_endianess ENDIANESS
337 config_add "#define SDL_BYTEORDER $ENDIANESS"
338 config_add ""
339
340 config_add_macro HAVE_LIBC $CONFIG_LIBC
341
342 config_add "#if HAVE_LIBC"
343 config_add ""
344 config_add "/* Useful headers */"
345
346 sdl_check_headers alloca sys/types stdio
347
348 # just like configure - force it to 1
349 config_add "#define STDC_HEADERS 1"
350
351 sdl_check_headers stdlib stdarg malloc memory string strings inttypes stdint ctype math iconv signal altivec
352
353 config_add "/* C library functions */"
354
355 sdl_check_funcs malloc calloc realloc free alloc
356
357 config_add "#ifndef _WIN32 /* Don't use on Windows */"
358
359 sdl_check_funcs getenv putenv unsetenv
360
361 config_add "#endif"
362 sdl_check_funcs qsort abs bcopy memset memcpy memmove memcmp strlen strlcpy strlcat
363 sdl_check_funcs strdup _strrev _strupr _strlwr index rindex strchr strrchr itoa _ltoa
364 sdl_check_funcs _uitoa _ultoa strtol strtoul _i64toa _ui64toa strtoll strtoull
365 sdl_check_funcs strtod atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp
366 sdl_check_funcs vsnprintf iconv sigaction setjmp nanosleep
367
368 sdl_check_func clock_gettime -lrt
369 sdl_check_func dlvsym -ldl
370
371 sdl_check_funcs getpagesize
372
373 config_add "#else"
374 config_add "/* We may need some replacement for stdarg.h here */"
375 config_add "#include <stdarg.h>"
376 config_add "#endif /* HAVE_LIBC */"
377 config_add ""
378
379 config_add "/* Allow disabling of core subsystems */"
380
David 'Digit' Turner63e644f2010-05-14 14:02:19 -0700381 config_add_macro SDL_AUDIO_DISABLED yes
David 'Digit' Turner46be4872009-06-04 16:07:01 +0200382 config_add_macro SDL_CDROM_DISABLED yes
383 config_add_macro SDL_CPUINFO_DISABLED no
384 config_add_macro SDL_EVENTS_DISABLED no
385 config_add_macro SDL_FILE_DISABLED yes
386 config_add_macro SDL_JOYSTICK_DISABLED yes
387 config_add_macro SDL_LOADSO_DISABLED no
388 config_add_macro SDL_THREADS_DISABLED no
389 config_add_macro SDL_TIMERS_DISABLED no
390 config_add_macro SDL_VIDEO_DISABLED no
391
392 config_add ""
David 'Digit' Turner46be4872009-06-04 16:07:01 +0200393 config_add "/* Enable various shared object loading systems */"
394
395 config_add_driver_macros DRIVERS_LOADSO SDL_LOADSO
396
397 config_add ""
398 config_add "/* Enable various threading systems */"
399
400 config_add_driver_macros DRIVERS_THREAD SDL_THREAD
401
402 config_add ""
403 config_add "/* Enable various timer systems */"
404
405 config_add_driver_macros DRIVERS_TIMER SDL_TIMER
406
407 config_add ""
408 config_add "/* Enable various video drivers */"
409
410 config_add_driver_macros DRIVERS_VIDEO SDL_VIDEO_DRIVER
411
412 config_add_driver_macros DRIVERS_MAIN SDL_MAIN
413
414 # the following defines are good enough for all recent Unix distributions
415 config_add "#define SDL_VIDEO_DRIVER_X11_DYNAMIC \"libX11.so.6\""
416 config_add "#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT \"libXext.so.6\""
417 config_add "#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR \"libXrandr.so.2\""
418 config_add "#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRENDER \"libXrender.so.1\""
419
420 # todo: OpenGL support ?
421 # todo: Assembly routines support ?
422
423 config_add "#endif /* _SDL_config_h */"
424}
425
426### Build the config sub-makefile
427###
428
429make_add ()
430{
431 echo "$1" >> $config_mk
432}
433
434make_add_driver_macros ()
435{
436 local driver_list="`var_value ${1}_${HOST_OS}`"
437 local driver_name
438 if [ -z "$driver_list" ] ; then
439 driver_list="`var_value ${1}_default`"
440 fi
441 for driver_name in $driver_list; do
David 'Digit' Turner34d16512010-05-18 17:02:33 -0700442 make_add "SDL_$2_${driver_name} := yes"
David 'Digit' Turner46be4872009-06-04 16:07:01 +0200443 done
444}
445
446generate_sdl_config_mk ()
447{
448 CFLAGS="$CFLAGS $BUILD_CFLAGS"
449 LDFLAGS="$LDFLAGS $BUILD_LDFLAGS"
450 create_config_mk
451
452 make_add ""
453 PWD=`pwd`
454 make_add "SRC_PATH=$PWD"
455 make_add "BUILD_SYSTEM=$ANDROID_QEMU_PATH/android/build"
456
David 'Digit' Turner34d16512010-05-18 17:02:33 -0700457 make_add "SDL_CONFIG_LIBC := $CONFIG_LIBC"
458 make_add "SDL_CONFIG_CPUINFO := yes"
David 'Digit' Turner46be4872009-06-04 16:07:01 +0200459
David 'Digit' Turner46be4872009-06-04 16:07:01 +0200460 make_add_driver_macros DRIVERS_LOADSO CONFIG_LOADSO
461 make_add_driver_macros DRIVERS_THREAD CONFIG_THREAD
462 make_add_driver_macros DRIVERS_TIMER CONFIG_TIMER
463 make_add_driver_macros DRIVERS_VIDEO CONFIG_VIDEO
464
465 make_add_driver_macros DRIVERS_MAIN CONFIG_MAIN
466
467 make_add "INSTALL_TARGETS := $OPTION_TARGETS"
468}
469
470### Build the final sdl-config script from the template
471###
472
473generate_sdl_config ()
474{
475 # build a sed script that will replace all @VARIABLES@ in the template
476 # with appropriate values
477 rm -f $TMPC
478
479 # replace @exec_prefix@ with "{prefix}", and @libdir@ with "{libdir}"
480 cat > $TMPC <<EOF
481s!@exec_prefix@!\$\{prefix\}!g
Stefan Hilzingerfb169872011-02-22 12:00:40 +0000482s!@libdir@!\$\{exec_prefix\}/libs!g
David 'Digit' Turner46be4872009-06-04 16:07:01 +0200483s!@includedir@!\$\{prefix\}/include!g
484EOF
485
486 # we want to enable static linking, do @ENABLE_STATIC_FALSE@ and @ENABLE_STATIC_TRUE@
487 cat >> $TMPC <<EOF
488s!@ENABLE_STATIC_FALSE@!\#!g
489s!@ENABLE_STATIC_TRUE@!!g
490s!@ENABLE_SHARED_TRUE@!\#!g
491s!@ENABLE_SHARED_FALSE@!!g
492EOF
493
494 # set the version to 1.2.12
495 cat >> $TMPC <<EOF
496s!@SDL_VERSION@!1.2.12!g
497EOF
498
499 #
500 cat >> $TMPC <<EOF
501s!@SDL_CFLAGS@!$SDL_CFLAGS!g
502s!@SDL_STATIC_LIBS@!$SDL_STATIC_LIBS!g
503EOF
504
505 cat sdl-config.in | sed -f $TMPC > objs/sdl-config
506 chmod +x objs/sdl-config
507}
508
509# copy a configuration file or perform auto-detection if one is not available
510# or the --force-autodetect option was used
511# $1: basename of config file
512# $2: command to run to perform auto-detection/generation
513#
514copy_or_autodetect ()
515{
516 if [ "$OPTION_FORCE_AUTODETECT" != "yes" -a -f android/build/$OS/$1 ] ; then
517 log "Setup : Copying $1 from android/build/$OS"
518 cp -f android/build/$OS/$1 objs/$1
519 else
520 log "Setup : Auto-generating $1"
521 eval $2
522 fi
523}
524
525generate_all ()
526{
527 copy_or_autodetect SDL_config.h generate_SDL_config_h
528 generate_sdl_config_mk
529 copy_or_autodetect sdl-config generate_sdl_config
530}
531
David 'Digit' Turner46be4872009-06-04 16:07:01 +0200532DRIVERS_LOADSO_default=DLOPEN
533DRIVERS_LOADSO_darwin=DLCOMPAT
534DRIVERS_LOADSO_windows=WIN32
535
536# TODO: determine if PTHREAD_RECURSIVE or PTHREAD_RECURSIVE_NP is valid for the platform
537DRIVERS_THREAD_default="PTHREAD PTHREAD_RECURSIVE_MUTEX"
538DRIVERS_THREAD_linux="PTHREAD PTHREAD_RECURSIVE_MUTEX_NP"
539DRIVERS_THREAD_windows=WIN32
540
541DRIVERS_TIMER_default=UNIX
542DRIVERS_TIMER_windows=WIN32
543
544# TODO: actually compute this properly for X11 and dynamic loading !!
545DRIVERS_VIDEO_default="X11 X11_DPMS X11_XINERAMA X11_XME"
546DRIVERS_VIDEO_darwin="QUARTZ"
547DRIVERS_VIDEO_windows="WINDIB"
548
549DRIVERS_MAIN_default=DUMMY
550DRIVERS_MAIN_darwin=MACOSX
551DRIVERS_MAIN_windows=WIN32
552
553generate_all