build-scripts/iosbuild.sh
author Sam Lantinga <slouken@libsdl.org>
Sun, 17 Aug 2014 14:57:52 -0700
changeset 9086 c5e33f9a0d03
parent 6334 85b8778a05c2
child 10904 4dbd025c4eb9
permissions -rwxr-xr-x
Fixed bug 2655 - OSX: Window position and global mouse coord spaces are different

Tim McDaniel

On OSX, with revision 8729, the coordinate space for window position and the coordinate space for global mouse position don't match. For a non-fullscreen window, the window position is global relative to the bottom of the menubar. The global mouse position is relative to the top of the screen. This affects Cocoa_WarpMouse and potentially other things as well. Further, the coordinate system for window position is now affected by what screen it is on. For example, if I have two equal size screens oriented side by side such that the tops of the screens are equal in global space, with the menubar on one screen, and a window straddles the two screens, the window's y position makes no sense. The window's y position depends on what screen "most" of the window is on. So if I move the window horizontally just a bit, the y position of my window is now different by the size of the menubar, even though the window was not moved vertically.

I'd like to reiterate that this was a fairly fundamental change (and a breaking change for us). If SDL OSX is to really support multi-display configurations, this is especially problematic.

If the real concern is preventing windows from going under the menubar, then perhaps a solution involving something like overriding [NSWindow constrainFrameRect] would be less problematic than redefining the global window coord space for the main display.
     1 #!/bin/sh
     2 #
     3 # Build a fat binary for iOS
     4 # Based on fatbuild.sh and code from the Ignifuga Game Engine
     5 
     6 # Number of CPUs (for make -j)
     7 NCPU=`sysctl -n hw.ncpu`
     8 if test x$NJOB = x; then
     9     NJOB=$NCPU
    10 fi
    11 
    12 # SDK path
    13 XCODE_PATH=`xcode-select --print-path`
    14 if [ -z "$XCODE_PATH" ]; then
    15     echo "Could not find XCode location (use xcode-select -switch to set the correct path)"
    16     exit 1
    17 fi
    18 
    19 prepare_environment() {
    20     ARCH=$1
    21     
    22     if test x$SDK_VERSION = x; then
    23       export SDK_VERSION=`xcodebuild -showsdks | grep iphoneos | sed "s|.*iphoneos||"`
    24       if [ -z "$XCODE_PATH" ]; then
    25           echo "Could not find a valid iOS SDK"
    26           exit 1
    27       fi  
    28     fi
    29     
    30     case $ARCH in
    31         armv6)
    32             DEV_PATH="$XCODE_PATH/Platforms/iPhoneOS.platform/Developer"
    33             SDK_PATH="$DEV_PATH/SDKs/iPhoneOS$SDK_VERSION.sdk"
    34             ;;
    35         armv7)
    36             DEV_PATH="$XCODE_PATH/Platforms/iPhoneOS.platform/Developer"
    37             SDK_PATH="$DEV_PATH/SDKs/iPhoneOS$SDK_VERSION.sdk"
    38             ;;
    39         i386)
    40             DEV_PATH="$XCODE_PATH/Platforms/iPhoneSimulator.platform/Developer"
    41             SDK_PATH="$DEV_PATH/SDKs/iPhoneSimulator$SDK_VERSION.sdk"
    42             ;;
    43         *)
    44             echo "Unknown Architecture $ARCH"
    45             exit 1
    46             ;;
    47     esac
    48 
    49     if [ ! -d "$SDK_PATH" ]; then
    50         echo "Could not find iOS SDK at $SDK_PATH"
    51         exit 1
    52     fi
    53 
    54     if test x$MIN_OS_VERSION = x; then
    55         export MIN_OS_VERSION="3.0"
    56     fi
    57     
    58     # Environment flags
    59     CFLAGS="-g -O2 -pipe -no-cpp-precomp -isysroot $SDK_PATH \
    60             -miphoneos-version-min=$MIN_OS_VERSION -I$SDK_PATH/usr/include/"
    61     LDFLAGS="-L$SDK_PATH/usr/lib/ -isysroot $SDK_PATH \
    62              -miphoneos-version-min=$MIN_OS_VERSION -static-libgcc"
    63     export CXXFLAGS="$CFLAGS"
    64     export CXXCPP="$DEV_PATH/usr/bin/llvm-cpp-4.2"
    65     export CPP="$CXXCPP"
    66     export CXX="$DEV_PATH/usr/bin/llvm-g++-4.2"
    67     export CC="$DEV_PATH/usr/bin/llvm-gcc-4.2"
    68     export LD="$DEV_PATH/usr/bin/ld"
    69     export AR="$DEV_PATH/usr/bin/ar"
    70     export AS="$DEV_PATH/usr/bin/ls"
    71     export NM="$DEV_PATH/usr/bin/nm"
    72     export RANLIB="$DEV_PATH/usr/bin/ranlib"
    73     export STRIP="$DEV_PATH/usr/bin/strip"
    74     
    75     # We dynamically load X11, so using the system X11 headers is fine.
    76     CONFIG_FLAGS="--disable-shared --enable-static"
    77     
    78     case $ARCH in
    79         armv6)
    80             export CONFIG_FLAGS="$CONFIG_FLAGS --host=armv6-apple-darwin"
    81             export CFLAGS="$CFLAGS -arch armv6"
    82             export LDFLAGS="$LDFLAGS -arch armv6"
    83             ;;
    84         armv7)
    85             export CONFIG_FLAGS="$CONFIG_FLAGS --host=armv7-apple-darwin"
    86             export CFLAGS="$CFLAGS -arch armv7"
    87             export LDFLAGS="$LDFLAGS -arch armv7"
    88             ;;
    89         i386)
    90             export CONFIG_FLAGS="$CONFIG_FLAGS --host=i386-apple-darwin"
    91             export CFLAGS="$CFLAGS -arch i386"
    92             export LDFLAGS="$LDFLAGS -arch i386"
    93             ;;
    94         *)
    95             echo "Unknown Architecture $ARCH"
    96             exit 1
    97             ;;
    98     esac
    99 }
   100 
   101 prepare_environment "armv6"
   102 echo "Building with iOS SDK v$SDK_VERSION for iOS >= $MIN_OS_VERSION"
   103 
   104 #
   105 # Find the configure script
   106 #
   107 srcdir=`dirname $0`/..
   108 srcdir=`cd $srcdir && pwd`
   109 auxdir=$srcdir/build-scripts
   110 cd $srcdir
   111 
   112 #
   113 # Figure out which phase to build:
   114 # all,
   115 # configure, configure-armv6, configure-armv7, configure-i386
   116 # make, make-armv6, make-armv7, make-i386, merge
   117 # clean
   118 if test x"$1" = x; then
   119     phase=all
   120 else
   121     phase="$1"
   122 fi
   123 case $phase in
   124     all)
   125         configure_armv6="yes"
   126         configure_armv7="yes"
   127         configure_i386="yes"
   128         make_armv6="yes"
   129         make_armv7="yes"
   130         make_i386="yes"
   131         merge="yes"
   132         ;;
   133     configure)
   134         configure_armv6="yes"
   135         configure_armv7="yes"
   136         configure_i386="yes"
   137         ;;
   138     configure-armv6)
   139         configure_armv6="yes"
   140         ;;
   141     configure-armv7)
   142         configure_armv7="yes"
   143         ;;
   144     configure-i386)
   145         configure_i386="yes"
   146         ;;
   147     make)
   148         make_armv6="yes"
   149         make_armv7="yes"
   150         make_i386="yes"
   151         merge="yes"
   152         ;;
   153     make-armv6)
   154         make_armv6="yes"
   155         ;;
   156     make-armv7)
   157         make_armv7="yes"
   158         ;;
   159     make-i386)
   160         make_i386="yes"
   161         ;;
   162     merge)
   163         merge="yes"
   164         ;;
   165     clean)
   166         clean_armv6="yes"
   167         clean_armv7="yes"
   168         clean_i386="yes"
   169         ;;
   170     clean-armv6)
   171         clean_armv6="yes"
   172         ;;
   173     clean-armv7)
   174         clean_armv7="yes"
   175         ;;
   176     clean-i386)
   177         clean_i386="yes"
   178         ;;
   179     *)
   180         echo "Usage: $0 [all|configure[-armv6|-armv7|-i386]|make[-armv6|-armv7|-i386]|merge|clean[-armv6|-armv7|-i386]]"
   181         exit 1
   182         ;;
   183 esac
   184 
   185 #
   186 # Create the build directories
   187 #
   188 for dir in build build/armv6 build/armv7 build/i386; do
   189     if test -d $dir; then
   190         :
   191     else
   192         mkdir $dir || exit 1
   193     fi
   194 done
   195 
   196 #
   197 # Build the armv6 binary
   198 #
   199 prepare_environment "armv6"
   200 if test x$configure_armv6 = xyes; then
   201     (cd build/armv6 && \
   202      sh ../../configure $CONFIG_FLAGS CC="$CC" CXX="$CXX" CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS") || exit 2
   203      # configure is not yet fully ready for iOS, some manual patching is required
   204      cp include/* build/armv6/include
   205      cp include/SDL_config_iphoneos.h build/armv6/include/SDL_config.h || exit 2
   206      sed -i "" -e "s|^EXTRA_CFLAGS.*|EXTRA_CFLAGS=-I./include|g" build/armv6/Makefile || exit 2
   207      sed -i "" -e "s|^EXTRA_LDFLAGS.*|EXTRA_LDFLAGS=-lm|g" build/armv6/Makefile || exit 2
   208 fi
   209 if test x$make_armv6 = xyes; then
   210     (cd build/armv6 && make -j$NJOB) || exit 3
   211 fi
   212 #
   213 # Build the armv7 binary
   214 #
   215 prepare_environment "armv7"
   216 if test x$configure_armv7 = xyes; then
   217     (cd build/armv7 && \
   218      sh ../../configure $CONFIG_FLAGS CC="$CC" CXX="$CXX" CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS") || exit 2
   219      # configure is not yet fully ready for iOS, some manual patching is required
   220      cp include/* build/armv7/include
   221      cp include/SDL_config_iphoneos.h build/armv7/include/SDL_config.h || exit 2
   222      sed -i "" -e "s|^EXTRA_CFLAGS.*|EXTRA_CFLAGS=-I./include|g" build/armv7/Makefile || exit 2
   223      sed -i "" -e "s|^EXTRA_LDFLAGS.*|EXTRA_LDFLAGS=-lm|g" build/armv7/Makefile || exit 2
   224 fi
   225 if test x$make_armv7 = xyes; then
   226     (cd build/armv7 && make -j$NJOB) || exit 3
   227 fi
   228 #
   229 # Build the i386 binary
   230 #
   231 prepare_environment "i386"
   232 if test x$configure_i386 = xyes; then
   233     (cd build/i386 && \
   234      sh ../../configure $CONFIG_FLAGS CC="$CC" CXX="$CXX" CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS") || exit 2
   235      # configure is not yet fully ready for iOS, some manual patching is required
   236      cp include/* build/i386/include
   237      cp include/SDL_config_iphoneos.h build/i386/include/SDL_config.h || exit 2
   238      sed -i "" -e "s|^EXTRA_CFLAGS.*|EXTRA_CFLAGS=-I./include|g" build/i386/Makefile || exit 2
   239      sed -i "" -e "s|^EXTRA_LDFLAGS.*|EXTRA_LDFLAGS=-lm|g" build/i386/Makefile || exit 2
   240 fi
   241 if test x$make_i386 = xyes; then
   242     (cd build/i386 && make -j$NJOB) || exit 3
   243 fi
   244 
   245 #
   246 # Combine into fat binary
   247 #
   248 if test x$merge = xyes; then
   249     output=ios/lib
   250     sh $auxdir/mkinstalldirs build/$output
   251     cd build
   252     target=`find . -mindepth 4 -maxdepth 4 -type f -name '*.dylib' | head -1 | sed 's|.*/||'`
   253     (lipo -create -o $output/libSDL2.a armv6/build/.libs/libSDL2.a armv7/build/.libs/libSDL2.a i386/build/.libs/libSDL2.a &&
   254      lipo -create -o $output/libSDL2main.a armv6/build/libSDL2main.a armv7/build/libSDL2main.a i386/build/libSDL2main.a &&
   255      cp -r armv6/include ios
   256      echo "Build complete!" &&
   257      echo "Files can be found under the build/ios directory.") || exit 4
   258     cd ..
   259 fi
   260 
   261 #
   262 # Clean up
   263 #
   264 do_clean()
   265 {
   266     echo $*
   267     $* || exit 6
   268 }
   269 if test x$clean_armv6 = xyes; then
   270     do_clean rm -r build/armv6
   271 fi
   272 if test x$clean_armv7 = xyes; then
   273     do_clean rm -r build/armv7
   274 fi
   275 if test x$clean_i386 = xyes; then
   276     do_clean rm -r build/i386
   277 fi