| #/bin/sh |
| # |
| # this script is used to rebuild SDL from sources in the current |
| # directory. It depends on the Android emulator build scripts |
| # that should normally be located in ../emulator/android/build |
| # but you can also use ANDROID_QEMU_PATH in your environment |
| # to point to the top of the Android emulator sources |
| # |
| # |
| |
| # first, let's see which system we're running this on |
| cd `dirname $0` |
| |
| # try to find the Android build directory automatically |
| if [ -z "$ANDROID_QEMU_PATH" ] ; then |
| if [ -f ../../android/build/common.sh ] ; then |
| ANDROID_QEMU_PATH=../.. |
| else |
| echo "You must define ANDROID_QEMU_PATH in your environment to point" |
| echo "to the directory containing the Android emulator's sources." |
| exit 1 |
| fi |
| fi |
| |
| if [ ! -d $ANDROID_QEMU_PATH ] ; then |
| echo "Your ANDROID_QEMU_PATH does not point to a valid directory." |
| exit 1 |
| fi |
| |
| if [ ! -f $ANDROID_QEMU_PATH/android/build/common.sh ] ; then |
| echo "Your ANDROID_QEMU_PATH does not point to a directory that" |
| echo "contains the Android emulator build scripts." |
| exit 1 |
| fi |
| |
| # source common functions definitions |
| . $ANDROID_QEMU_PATH/android/build/common.sh |
| |
| # Parse options |
| OPTION_TRY_64=no |
| OPTION_HELP=no |
| OPTION_TARGETS= |
| OPTION_FORCE_AUTODETECT=no |
| OPTION_NO_TIGER=no |
| |
| if [ -z "$CC" ] ; then |
| CC=gcc |
| fi |
| |
| for opt do |
| optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'` |
| case "$opt" in |
| --help|-h|-\?) OPTION_HELP=yes |
| ;; |
| --verbose) |
| if [ "$VERBOSE" = "yes" ] ; then |
| VERBOSE2=yes |
| else |
| VERBOSE=yes |
| fi |
| ;; |
| --cc=*) CC="$optarg" ; HOSTCC=$CC |
| ;; |
| --try-64) OPTION_TRY_64=yes |
| ;; |
| --prefix=*) OPTION_TARGETS="$OPTION_TARGETS $optarg" |
| ;; |
| --force-autodetect) OPTION_FORCE_AUTODETECT=yes |
| ;; |
| --no-tiger) OPTION_NO_TIGER=yes |
| ;; |
| *) |
| echo "unknown option '$opt', use --help" |
| exit 1 |
| esac |
| done |
| |
| # Print the help message |
| # |
| if [ "$OPTION_HELP" = "yes" ] ; then |
| cat << EOF |
| |
| Usage: rebuild.sh [options] |
| Options: [defaults in brackets after descriptions] |
| EOF |
| echo "Standard options:" |
| echo " --help print this message" |
| echo " --cc=PATH specify C compiler [$CC]" |
| echo " --try-64 try to build a 64-bit executable (may crash)" |
| echo " --verbose verbose configuration" |
| echo " --force-autodetect force feature auto-detection" |
| echo " --no-tiger do not generate Tiger-compatible binaries (OS X only)" |
| echo "" |
| exit 1 |
| fi |
| |
| # we only support generating 32-bit binaris on 64-bit systems. |
| # And we may need to add a -Wa,--32 to CFLAGS to let the assembler |
| # generate 32-bit binaries on Linux x86_64. |
| # |
| if [ "$OPTION_TRY_64" != "yes" ] ; then |
| force_32bit_binaries |
| fi |
| |
| # default target |
| if [ -z "$OPTION_TARGETS" ] ; then |
| OPTION_TARGETS=out/$OS |
| fi |
| |
| # we can build SDL with Cygwin, so enable it |
| enable_cygwin |
| |
| setup_toolchain |
| |
| ### |
| ### Special compiler and linker flags |
| ### |
| |
| case "$OS" in |
| linux-*) |
| BUILD_CFLAGS="-D_GNU_SOURCE=1 -fvisibility=hidden -DXTHREADS -D_REENTRANT" |
| # prevent -fstack-protector or the generated binaries will not link |
| BUILD_CFLAGS="$BUILD_CFLAGS -fno-stack-protector" |
| ;; |
| darwin-*) |
| BUILD_CFLAGS="-D_GNU_SOURCE=1 -fvisibility=hidden -DTARGET_API_MAC_CARBON -DTARGET_API_MAC_OSX -D_THREAD_SAFE -force_cpusubtype_ALL -fpascal-strings" |
| # detect the 10.4 SDK and use it automatically |
| TIGER_SDK=/Developer/SDKs/MacOSX10.4u.sdk |
| if [ ! -d $TIGER_SDK -a $OPTION_NO_TIGER = no ] ; then |
| echo "Please install the 10.4 SDK at $TIGER_SDK to generate Tiger-compatible binaries." |
| echo "If you don't want compatibility, use --no-tiger option instead." |
| exit 1 |
| fi |
| if [ -d $TIGER_SDK ] ; then |
| TIGER_OPTS="-isysroot $TIGER_SDK -mmacosx-version-min=10.4" |
| BUILD_CFLAGS="$BUILD_CFLAGS $TIGER_OPTS" |
| BUILD_LDFLAGS="$BUILD_LDFLAGS $TIGER_OPTS -Wl,-syslibroot,$(TIGER_SDK)" |
| echo "Using OS X 10.4 SDK to generate Tiger-compatible binaries." |
| else |
| echo "Warning: the generated binaries will not be compatible with Tiger." |
| fi |
| ;; |
| windows) |
| BUILD_CFLAGS="-D_GNU_SOURCE=1" |
| ;; |
| *) |
| BUILD_CFLAGS= |
| esac |
| |
| # BUILD_CFLAGS are used to build SDL, but SDL_CFLAGS are used |
| # when clients want to use its facilities |
| # |
| case "$HOST_OS" in |
| linux) |
| SDL_CFLAGS="-D_GNU_SOURCE=1 -D_REENTRANT" |
| SDL_STATIC_LIBS="-lm -ldl -lpthread -lrt" |
| ;; |
| darwin) |
| SDL_CFLAGS="-D_GNU_SOURCE=1 -D_THREAD_SAFE" |
| SDL_STATIC_LIBS="-Wl,-framework,OpenGL -Wl,-framework,Cocoa -Wl,-framework,QuickTime -Wl,-framework,ApplicationServices -Wl,-framework,Carbon -Wl,-framework,IOKit" |
| ;; |
| windows) |
| SDL_CFLAGS="-D_GNU_SOURCE=1 -Dmain=SDL_main" |
| SDL_STATIC_LIBS="-luser32 -lgdi32 -lwinmm" |
| ;; |
| *) |
| SDL_CFLAGS= |
| SDL_STATIC_LIBS= |
| esac |
| |
| DOLLAR="$" |
| SDL_STATIC_LIBS="$DOLLAR{libdir}/libSDLmain.a $DOLLAR{libdir}/libSDL.a $SDL_STATIC_LIBS" |
| |
| ### |
| ### Features probes |
| ### |
| |
| CONFIG_LIBC=yes |
| |
| ### |
| ### Configuration files generation |
| ### |
| |
| # create the objs directory that is going to contain all generated files |
| # including the configuration ones |
| # |
| mkdir -p objs |
| |
| config_add () |
| { |
| echo "$1" >> $config_h |
| } |
| |
| # used to add a macro define/undef line to the configuration |
| # $1: macro name |
| # $2: 1, 0, yes or no |
| # $3: optional log prefix |
| config_add_macro () |
| { |
| local logname |
| logname="${3:-CfgMacro }" |
| case "$2" in |
| 0|no|false) |
| config_add "/* #undef $1 */" |
| log "$logname: $1=0" |
| ;; |
| 1|yes|true) |
| config_add "#define $1 1" |
| log "$logname: $1=1" |
| ;; |
| esac |
| } |
| |
| # used to add host-os-specific driver macros to the config file |
| # $1 : driver prefix, e.g. DRIVERS_VIDEO |
| # $2 : macro prefix |
| # this will look for DRIVERS_VIDEO_${HOST_OS}, and, if it is not |
| # defined in DRIVERS_VIDEO_default |
| # |
| # then this will call 'config_add ${2}_${driver}' for each driver listed |
| # |
| config_add_driver_macros () |
| { |
| local driver_list="`var_value ${1}_${HOST_OS}`" |
| local driver_name |
| if [ -z "$driver_list" ] ; then |
| driver_list="`var_value ${1}_default`" |
| fi |
| for driver_name in $driver_list; do |
| config_add_macro "${2}_${driver_name}" yes |
| done |
| } |
| |
| config_h=objs/SDL_config.h |
| |
| # a function used to check the availability of a given Standard C header |
| # $1 : header name, without the .h suffix nor enclosing brackets (e.g. 'memory' for <memory.h>) |
| # this will update the configuration with a relevant line |
| sdl_check_header () |
| { |
| local result |
| local header |
| local macro |
| header="<$1.h>" |
| macro=`to_uppercase $1` |
| macro=`echo $macro | tr '/' '_'` |
| feature_check_header result "$header" |
| config_add_macro HAVE_${macro}_H $result "StdCHeader " |
| } |
| |
| # call sdl_check_header with a list of header names |
| sdl_check_headers () |
| { |
| for hh in $*; do |
| sdl_check_header "$hh" |
| done |
| } |
| |
| # a function used to check that a given function is available in the C library |
| # this will update the configuration with a relevant line |
| # $1: function name |
| # $2: optional, libraries to link against |
| # |
| sdl_check_func () |
| { |
| local result |
| local funcname |
| local macro |
| funcname="$1" |
| macro=`to_uppercase $1` |
| rm -f $TMPC |
| cat > $TMPC <<EOF |
| #undef $funcname |
| #define $funcname _innocuous_$funcname |
| #include <assert.h> |
| #undef $funcname |
| |
| typedef void (*func_t)(void); |
| extern void $funcname(void); |
| func_t _dummy = $funcname; |
| int main(void) |
| { |
| return _dummy == $funcname; |
| } |
| EOF |
| EXTRA_LDFLAGS="$2" |
| feature_check_link result |
| config_add_macro HAVE_${macro} $result "StdCFunc " |
| } |
| |
| # call sdl_check_func with a list of functions |
| sdl_check_funcs () |
| { |
| for ff in $*; do |
| sdl_check_func "$ff" |
| done |
| } |
| |
| # check endianess of the host platform |
| sdl_check_endianess () |
| { |
| cat > $TMPC <<EOF |
| int main(void) |
| { |
| union { |
| unsigned short v; |
| unsigned char b[2]; |
| } u; |
| |
| u.v = 0x1234; |
| return (u.b[0] == 0x12); |
| } |
| EOF |
| feature_run_exec test_e |
| if [ "$test_e" = "1" ] ; then |
| eval $1=4321 |
| else |
| eval $1=1234 |
| fi |
| } |
| |
| |
| generate_SDL_config_h () |
| { |
| echo "/* This file was autogenerated by '$PROGNAME' - do not edit */" > $config_h |
| |
| config_add "#ifndef _SDL_config_h" |
| config_add "#define _SDL_config_h" |
| config_add "" |
| config_add "#include \"SDL_platform.h\"" |
| config_add "" |
| |
| # true for all architectures these days |
| config_add_macro SDL_HAS_64BIT_TYPE 1 |
| |
| sdl_check_endianess ENDIANESS |
| config_add "#define SDL_BYTEORDER $ENDIANESS" |
| config_add "" |
| |
| config_add_macro HAVE_LIBC $CONFIG_LIBC |
| |
| config_add "#if HAVE_LIBC" |
| config_add "" |
| config_add "/* Useful headers */" |
| |
| sdl_check_headers alloca sys/types stdio |
| |
| # just like configure - force it to 1 |
| config_add "#define STDC_HEADERS 1" |
| |
| sdl_check_headers stdlib stdarg malloc memory string strings inttypes stdint ctype math iconv signal altivec |
| |
| config_add "/* C library functions */" |
| |
| sdl_check_funcs malloc calloc realloc free alloc |
| |
| config_add "#ifndef _WIN32 /* Don't use on Windows */" |
| |
| sdl_check_funcs getenv putenv unsetenv |
| |
| config_add "#endif" |
| sdl_check_funcs qsort abs bcopy memset memcpy memmove memcmp strlen strlcpy strlcat |
| sdl_check_funcs strdup _strrev _strupr _strlwr index rindex strchr strrchr itoa _ltoa |
| sdl_check_funcs _uitoa _ultoa strtol strtoul _i64toa _ui64toa strtoll strtoull |
| sdl_check_funcs strtod atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp |
| sdl_check_funcs vsnprintf iconv sigaction setjmp nanosleep |
| |
| sdl_check_func clock_gettime -lrt |
| sdl_check_func dlvsym -ldl |
| |
| sdl_check_funcs getpagesize |
| |
| config_add "#else" |
| config_add "/* We may need some replacement for stdarg.h here */" |
| config_add "#include <stdarg.h>" |
| config_add "#endif /* HAVE_LIBC */" |
| config_add "" |
| |
| config_add "/* Allow disabling of core subsystems */" |
| |
| config_add_macro SDL_AUDIO_DISABLED yes |
| config_add_macro SDL_CDROM_DISABLED yes |
| config_add_macro SDL_CPUINFO_DISABLED no |
| config_add_macro SDL_EVENTS_DISABLED no |
| config_add_macro SDL_FILE_DISABLED yes |
| config_add_macro SDL_JOYSTICK_DISABLED yes |
| config_add_macro SDL_LOADSO_DISABLED no |
| config_add_macro SDL_THREADS_DISABLED no |
| config_add_macro SDL_TIMERS_DISABLED no |
| config_add_macro SDL_VIDEO_DISABLED no |
| |
| config_add "" |
| config_add "/* Enable various shared object loading systems */" |
| |
| config_add_driver_macros DRIVERS_LOADSO SDL_LOADSO |
| |
| config_add "" |
| config_add "/* Enable various threading systems */" |
| |
| config_add_driver_macros DRIVERS_THREAD SDL_THREAD |
| |
| config_add "" |
| config_add "/* Enable various timer systems */" |
| |
| config_add_driver_macros DRIVERS_TIMER SDL_TIMER |
| |
| config_add "" |
| config_add "/* Enable various video drivers */" |
| |
| config_add_driver_macros DRIVERS_VIDEO SDL_VIDEO_DRIVER |
| |
| config_add_driver_macros DRIVERS_MAIN SDL_MAIN |
| |
| # the following defines are good enough for all recent Unix distributions |
| config_add "#define SDL_VIDEO_DRIVER_X11_DYNAMIC \"libX11.so.6\"" |
| config_add "#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT \"libXext.so.6\"" |
| config_add "#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR \"libXrandr.so.2\"" |
| config_add "#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRENDER \"libXrender.so.1\"" |
| |
| # todo: OpenGL support ? |
| # todo: Assembly routines support ? |
| |
| config_add "#endif /* _SDL_config_h */" |
| } |
| |
| ### Build the config sub-makefile |
| ### |
| |
| make_add () |
| { |
| echo "$1" >> $config_mk |
| } |
| |
| make_add_driver_macros () |
| { |
| local driver_list="`var_value ${1}_${HOST_OS}`" |
| local driver_name |
| if [ -z "$driver_list" ] ; then |
| driver_list="`var_value ${1}_default`" |
| fi |
| for driver_name in $driver_list; do |
| make_add "SDL_$2_${driver_name} := yes" |
| done |
| } |
| |
| generate_sdl_config_mk () |
| { |
| CFLAGS="$CFLAGS $BUILD_CFLAGS" |
| LDFLAGS="$LDFLAGS $BUILD_LDFLAGS" |
| create_config_mk |
| |
| make_add "" |
| PWD=`pwd` |
| make_add "SRC_PATH=$PWD" |
| make_add "BUILD_SYSTEM=$ANDROID_QEMU_PATH/android/build" |
| |
| make_add "SDL_CONFIG_LIBC := $CONFIG_LIBC" |
| make_add "SDL_CONFIG_CPUINFO := yes" |
| |
| make_add_driver_macros DRIVERS_LOADSO CONFIG_LOADSO |
| make_add_driver_macros DRIVERS_THREAD CONFIG_THREAD |
| make_add_driver_macros DRIVERS_TIMER CONFIG_TIMER |
| make_add_driver_macros DRIVERS_VIDEO CONFIG_VIDEO |
| |
| make_add_driver_macros DRIVERS_MAIN CONFIG_MAIN |
| |
| make_add "INSTALL_TARGETS := $OPTION_TARGETS" |
| } |
| |
| ### Build the final sdl-config script from the template |
| ### |
| |
| generate_sdl_config () |
| { |
| # build a sed script that will replace all @VARIABLES@ in the template |
| # with appropriate values |
| rm -f $TMPC |
| |
| # replace @exec_prefix@ with "{prefix}", and @libdir@ with "{libdir}" |
| cat > $TMPC <<EOF |
| s!@exec_prefix@!\$\{prefix\}!g |
| s!@libdir@!\$\{exec_prefix\}/libs!g |
| s!@includedir@!\$\{prefix\}/include!g |
| EOF |
| |
| # we want to enable static linking, do @ENABLE_STATIC_FALSE@ and @ENABLE_STATIC_TRUE@ |
| cat >> $TMPC <<EOF |
| s!@ENABLE_STATIC_FALSE@!\#!g |
| s!@ENABLE_STATIC_TRUE@!!g |
| s!@ENABLE_SHARED_TRUE@!\#!g |
| s!@ENABLE_SHARED_FALSE@!!g |
| EOF |
| |
| # set the version to 1.2.15 |
| cat >> $TMPC <<EOF |
| s!@SDL_VERSION@!1.2.15!g |
| EOF |
| |
| # |
| cat >> $TMPC <<EOF |
| s!@SDL_CFLAGS@!$SDL_CFLAGS!g |
| s!@SDL_STATIC_LIBS@!$SDL_STATIC_LIBS!g |
| EOF |
| |
| cat sdl-config.in | sed -f $TMPC > objs/sdl-config |
| chmod +x objs/sdl-config |
| } |
| |
| # copy a configuration file or perform auto-detection if one is not available |
| # or the --force-autodetect option was used |
| # $1: basename of config file |
| # $2: command to run to perform auto-detection/generation |
| # |
| copy_or_autodetect () |
| { |
| if [ "$OPTION_FORCE_AUTODETECT" != "yes" -a -f android/build/$OS/$1 ] ; then |
| log "Setup : Copying $1 from android/build/$OS" |
| cp -f android/build/$OS/$1 objs/$1 |
| else |
| log "Setup : Auto-generating $1" |
| eval $2 |
| fi |
| } |
| |
| generate_all () |
| { |
| copy_or_autodetect SDL_config.h generate_SDL_config_h |
| generate_sdl_config_mk |
| copy_or_autodetect sdl-config generate_sdl_config |
| } |
| |
| DRIVERS_LOADSO_default=DLOPEN |
| DRIVERS_LOADSO_darwin=DLCOMPAT |
| DRIVERS_LOADSO_windows=WIN32 |
| |
| # TODO: determine if PTHREAD_RECURSIVE or PTHREAD_RECURSIVE_NP is valid for the platform |
| DRIVERS_THREAD_default="PTHREAD PTHREAD_RECURSIVE_MUTEX" |
| DRIVERS_THREAD_linux="PTHREAD PTHREAD_RECURSIVE_MUTEX_NP" |
| DRIVERS_THREAD_windows=WIN32 |
| |
| DRIVERS_TIMER_default=UNIX |
| DRIVERS_TIMER_windows=WIN32 |
| |
| # TODO: actually compute this properly for X11 and dynamic loading !! |
| DRIVERS_VIDEO_default="X11 X11_DPMS X11_XINERAMA X11_XME" |
| DRIVERS_VIDEO_darwin="QUARTZ" |
| DRIVERS_VIDEO_windows="WINDIB" |
| |
| DRIVERS_MAIN_default=DUMMY |
| DRIVERS_MAIN_darwin=MACOSX |
| DRIVERS_MAIN_windows=WIN32 |
| |
| generate_all |