1 #/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 12 cd `dirname $0` 13 14 # try to find the Android build directory automatically 15 if [ -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 23 fi 24 25 if [ ! -d $ANDROID_QEMU_PATH ] ; then 26 echo "Your ANDROID_QEMU_PATH does not point to a valid directory." 27 exit 1 28 fi 29 30 if [ ! -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 34 fi 35 36 # source common functions definitions 37 . $ANDROID_QEMU_PATH/android/build/common.sh 38 39 # Parse options 40 OPTION_TRY_64=no 41 OPTION_HELP=no 42 OPTION_TARGETS= 43 OPTION_FORCE_AUTODETECT=no 44 OPTION_NO_TIGER=no 45 46 if [ -z "$CC" ] ; then 47 CC=gcc 48 fi 49 50 for 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 76 done 77 78 # Print the help message 79 # 80 if [ "$OPTION_HELP" = "yes" ] ; then 81 cat << EOF 82 83 Usage: rebuild.sh [options] 84 Options: [defaults in brackets after descriptions] 85 EOF 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 95 fi 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 # 101 if [ "$OPTION_TRY_64" != "yes" ] ; then 102 force_32bit_binaries 103 fi 104 105 # default target 106 if [ -z "$OPTION_TARGETS" ] ; then 107 OPTION_TARGETS=out/$OS 108 fi 109 110 # we can build SDL with Cygwin, so enable it 111 enable_cygwin 112 113 setup_toolchain 114 115 ### 116 ### Special compiler and linker flags 117 ### 118 119 case "$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= 148 esac 149 150 # BUILD_CFLAGS are used to build SDL, but SDL_CFLAGS are used 151 # when clients want to use its facilities 152 # 153 case "$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" 160 SDL_STATIC_LIBS="-Wl,-framework,OpenGL -Wl,-framework,Cocoa -Wl,-framework,QuickTime -Wl,-framework,ApplicationServices -Wl,-framework,Carbon -Wl,-framework,IOKit" 161 ;; 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= 169 esac 170 171 DOLLAR="$" 172 SDL_STATIC_LIBS="$DOLLAR{libdir}/libSDLmain.a $DOLLAR{libdir}/libSDL.a $SDL_STATIC_LIBS" 173 174 ### 175 ### Features probes 176 ### 177 178 CONFIG_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 # 187 mkdir -p objs 188 189 config_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 198 config_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 215 # $1 : driver prefix, e.g. DRIVERS_VIDEO 216 # $2 : macro prefix 217 # this will look for DRIVERS_VIDEO_${HOST_OS}, and, if it is not 218 # defined in DRIVERS_VIDEO_default 219 # 220 # then this will call 'config_add ${2}_${driver}' for each driver listed 221 # 222 config_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 234 config_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 239 sdl_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 252 sdl_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 # 264 sdl_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 278 typedef void (*func_t)(void); 279 extern void $funcname(void); 280 func_t _dummy = $funcname; 281 int main(void) 282 { 283 return _dummy == $funcname; 284 } 285 EOF 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 292 sdl_check_funcs () 293 { 294 for ff in $*; do 295 sdl_check_func "$ff" 296 done 297 } 298 299 # check endianess of the host platform 300 sdl_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 } 313 EOF 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 323 generate_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 381 config_add_macro SDL_AUDIO_DISABLED yes 382 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 "" 393 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 429 make_add () 430 { 431 echo "$1" >> $config_mk 432 } 433 434 make_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 442 make_add "SDL_$2_${driver_name} := yes" 443 done 444 } 445 446 generate_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 457 make_add "SDL_CONFIG_LIBC := $CONFIG_LIBC" 458 make_add "SDL_CONFIG_CPUINFO := yes" 459 460 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 473 generate_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 481 s!@exec_prefix@!\$\{prefix\}!g 482 s!@libdir@!\$\{exec_prefix\}/libs!g 483 s!@includedir@!\$\{prefix\}/include!g 484 EOF 485 486 # we want to enable static linking, do @ENABLE_STATIC_FALSE@ and @ENABLE_STATIC_TRUE@ 487 cat >> $TMPC <<EOF 488 s!@ENABLE_STATIC_FALSE@!\#!g 489 s!@ENABLE_STATIC_TRUE@!!g 490 s!@ENABLE_SHARED_TRUE@!\#!g 491 s!@ENABLE_SHARED_FALSE@!!g 492 EOF 493 494 # set the version to 1.2.15 495 cat >> $TMPC <<EOF 496 s!@SDL_VERSION@!1.2.15!g 497 EOF 498 499 # 500 cat >> $TMPC <<EOF 501 s!@SDL_CFLAGS@!$SDL_CFLAGS!g 502 s!@SDL_STATIC_LIBS@!$SDL_STATIC_LIBS!g 503 EOF 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 # 514 copy_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 525 generate_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 532 DRIVERS_LOADSO_default=DLOPEN 533 DRIVERS_LOADSO_darwin=DLCOMPAT 534 DRIVERS_LOADSO_windows=WIN32 535 536 # TODO: determine if PTHREAD_RECURSIVE or PTHREAD_RECURSIVE_NP is valid for the platform 537 DRIVERS_THREAD_default="PTHREAD PTHREAD_RECURSIVE_MUTEX" 538 DRIVERS_THREAD_linux="PTHREAD PTHREAD_RECURSIVE_MUTEX_NP" 539 DRIVERS_THREAD_windows=WIN32 540 541 DRIVERS_TIMER_default=UNIX 542 DRIVERS_TIMER_windows=WIN32 543 544 # TODO: actually compute this properly for X11 and dynamic loading !! 545 DRIVERS_VIDEO_default="X11 X11_DPMS X11_XINERAMA X11_XME" 546 DRIVERS_VIDEO_darwin="QUARTZ" 547 DRIVERS_VIDEO_windows="WINDIB" 548 549 DRIVERS_MAIN_default=DUMMY 550 DRIVERS_MAIN_darwin=MACOSX 551 DRIVERS_MAIN_windows=WIN32 552 553 generate_all 554