sdl2.m4
author David Ludwig <dludwig@pobox.com>
Sat, 29 Nov 2014 10:09:30 -0500
changeset 9247 eddb899239fe
parent 7492 98de3e4f1c36
child 10382 9befd0acb9ef
permissions -rw-r--r--
WinRT: bug and data-integrity fixes for SDL_GetPrefPath()

This change does a few things, all with regards to the WinRT implementation of
SDL_GetPrefPath():

1. it fixes a bug whereby SDL_GetPrefPath() did not create the directory it
returned. On other SDL platforms, SDL_GetPrefPath() will create separate
directories for its 'org' and 'app' folders. Without this, attempts to create
files in the pref-path would fail, unless those directories were first created
by the app, or by some other library the app used. This change makes sure
that these directories get created, before SDL_GetPrefPath() returns to its
caller(s).


2. it defaults to having SDL_GetPrefPath() return a WinRT 'Local' folder
on all platforms. Previously, for Windows Store apps, it would have used a
different, 'Roaming' folder. Files in Roaming folders can be automatically,
and synchronized across multiple devices by Windows. This synchronization can
happen while the app runs, with new files being copied into a running app's
pref-path. Unless an app is specifically designed to handle this scenario,
there is a chance that save-data could be overwritten in unwanted or
unexpected ways.

The default is now to use a Local folder, which does not get synchronized, and
which is arguably a bit safer to use. Apps that wish to use Roaming folders
can do so by setting SDL_HINT_WINRT_PREF_PATH_ROOT to "roaming", however it
is recommended that one first read Microsoft's documentation for Roaming
files, a link to which is provided in README-winrt.md.

To preserve older pref-path selection behavior (found in SDL 2.0.3, as well as
many pre-2.0.4 versions of SDL from hg.libsdl.org), which uses a Roaming path
in Windows Store apps, and a Local path in Windows Phone, set
SDL_HINT_WINRT_PREF_PATH_ROOT to "old".

Please note that Roaming paths are not supported on Windows Phone 8.0, due to
limitations in the OS itself. Attempts to use this will fail.
(Windows Phone 8.1 does not have this limitation, however.)


3. It makes SDL_GetPrefPath(), when on Windows Phone 8.0, and when
SDL_HINT_WINRT_PREF_PATH_ROOT is set to "roaming", return NULL, rather than
silently defaulting to a Local path (then switching to a Roaming path if and
when the user upgraded to Windows Phone 8.1).
     1 # Configure paths for SDL
     2 # Sam Lantinga 9/21/99
     3 # stolen from Manish Singh
     4 # stolen back from Frank Belew
     5 # stolen from Manish Singh
     6 # Shamelessly stolen from Owen Taylor
     7 
     8 # serial 1
     9 
    10 dnl AM_PATH_SDL2([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
    11 dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS
    12 dnl
    13 AC_DEFUN([AM_PATH_SDL2],
    14 [dnl 
    15 dnl Get the cflags and libraries from the sdl2-config script
    16 dnl
    17 AC_ARG_WITH(sdl-prefix,[  --with-sdl-prefix=PFX   Prefix where SDL is installed (optional)],
    18             sdl_prefix="$withval", sdl_prefix="")
    19 AC_ARG_WITH(sdl-exec-prefix,[  --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)],
    20             sdl_exec_prefix="$withval", sdl_exec_prefix="")
    21 AC_ARG_ENABLE(sdltest, [  --disable-sdltest       Do not try to compile and run a test SDL program],
    22 		    , enable_sdltest=yes)
    23 
    24   min_sdl_version=ifelse([$1], ,2.0.0,$1)
    25 
    26   if test "x$sdl_prefix$sdl_exec_prefix" = x ; then
    27     PKG_CHECK_MODULES([SDL], [sdl2 >= $min_sdl_version],
    28            [sdl_pc=yes],
    29            [sdl_pc=no])
    30   else
    31     sdl_pc=no
    32     if test x$sdl_exec_prefix != x ; then
    33       sdl_config_args="$sdl_config_args --exec-prefix=$sdl_exec_prefix"
    34       if test x${SDL2_CONFIG+set} != xset ; then
    35         SDL2_CONFIG=$sdl_exec_prefix/bin/sdl2-config
    36       fi
    37     fi
    38     if test x$sdl_prefix != x ; then
    39       sdl_config_args="$sdl_config_args --prefix=$sdl_prefix"
    40       if test x${SDL2_CONFIG+set} != xset ; then
    41         SDL2_CONFIG=$sdl_prefix/bin/sdl2-config
    42       fi
    43     fi
    44   fi
    45 
    46   if test "x$sdl_pc" = xyes ; then
    47     no_sdl=""
    48     SDL2_CONFIG="pkg-config sdl2"
    49   else
    50     as_save_PATH="$PATH"
    51     if test "x$prefix" != xNONE && test "$cross_compiling" != yes; then
    52       PATH="$prefix/bin:$prefix/usr/bin:$PATH"
    53     fi
    54     AC_PATH_PROG(SDL2_CONFIG, sdl2-config, no, [$PATH])
    55     PATH="$as_save_PATH"
    56     AC_MSG_CHECKING(for SDL - version >= $min_sdl_version)
    57     no_sdl=""
    58 
    59     if test "$SDL2_CONFIG" = "no" ; then
    60       no_sdl=yes
    61     else
    62       SDL_CFLAGS=`$SDL2_CONFIG $sdl_config_args --cflags`
    63       SDL_LIBS=`$SDL2_CONFIG $sdl_config_args --libs`
    64 
    65       sdl_major_version=`$SDL2_CONFIG $sdl_config_args --version | \
    66              sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
    67       sdl_minor_version=`$SDL2_CONFIG $sdl_config_args --version | \
    68              sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
    69       sdl_micro_version=`$SDL2_CONFIG $sdl_config_args --version | \
    70              sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
    71       if test "x$enable_sdltest" = "xyes" ; then
    72         ac_save_CFLAGS="$CFLAGS"
    73         ac_save_CXXFLAGS="$CXXFLAGS"
    74         ac_save_LIBS="$LIBS"
    75         CFLAGS="$CFLAGS $SDL_CFLAGS"
    76         CXXFLAGS="$CXXFLAGS $SDL_CFLAGS"
    77         LIBS="$LIBS $SDL_LIBS"
    78 dnl
    79 dnl Now check if the installed SDL is sufficiently new. (Also sanity
    80 dnl checks the results of sdl2-config to some extent
    81 dnl
    82       rm -f conf.sdltest
    83       AC_TRY_RUN([
    84 #include <stdio.h>
    85 #include <stdlib.h>
    86 #include <string.h>
    87 #include "SDL.h"
    88 
    89 char*
    90 my_strdup (char *str)
    91 {
    92   char *new_str;
    93   
    94   if (str)
    95     {
    96       new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char));
    97       strcpy (new_str, str);
    98     }
    99   else
   100     new_str = NULL;
   101   
   102   return new_str;
   103 }
   104 
   105 int main (int argc, char *argv[])
   106 {
   107   int major, minor, micro;
   108   char *tmp_version;
   109 
   110   /* This hangs on some systems (?)
   111   system ("touch conf.sdltest");
   112   */
   113   { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); }
   114 
   115   /* HP/UX 9 (%@#!) writes to sscanf strings */
   116   tmp_version = my_strdup("$min_sdl_version");
   117   if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
   118      printf("%s, bad version string\n", "$min_sdl_version");
   119      exit(1);
   120    }
   121 
   122    if (($sdl_major_version > major) ||
   123       (($sdl_major_version == major) && ($sdl_minor_version > minor)) ||
   124       (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro)))
   125     {
   126       return 0;
   127     }
   128   else
   129     {
   130       printf("\n*** 'sdl2-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version);
   131       printf("*** of SDL required is %d.%d.%d. If sdl2-config is correct, then it is\n", major, minor, micro);
   132       printf("*** best to upgrade to the required version.\n");
   133       printf("*** If sdl2-config was wrong, set the environment variable SDL2_CONFIG\n");
   134       printf("*** to point to the correct copy of sdl2-config, and remove the file\n");
   135       printf("*** config.cache before re-running configure\n");
   136       return 1;
   137     }
   138 }
   139 
   140 ],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
   141         CFLAGS="$ac_save_CFLAGS"
   142         CXXFLAGS="$ac_save_CXXFLAGS"
   143         LIBS="$ac_save_LIBS"
   144       fi
   145     fi
   146     if test "x$no_sdl" = x ; then
   147       AC_MSG_RESULT(yes)
   148     else
   149       AC_MSG_RESULT(no)
   150     fi
   151   fi
   152   if test "x$no_sdl" = x ; then
   153      ifelse([$2], , :, [$2])
   154   else
   155      if test "$SDL2_CONFIG" = "no" ; then
   156        echo "*** The sdl2-config script installed by SDL could not be found"
   157        echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in"
   158        echo "*** your path, or set the SDL2_CONFIG environment variable to the"
   159        echo "*** full path to sdl2-config."
   160      else
   161        if test -f conf.sdltest ; then
   162         :
   163        else
   164           echo "*** Could not run SDL test program, checking why..."
   165           CFLAGS="$CFLAGS $SDL_CFLAGS"
   166           CXXFLAGS="$CXXFLAGS $SDL_CFLAGS"
   167           LIBS="$LIBS $SDL_LIBS"
   168           AC_TRY_LINK([
   169 #include <stdio.h>
   170 #include "SDL.h"
   171 
   172 int main(int argc, char *argv[])
   173 { return 0; }
   174 #undef  main
   175 #define main K_and_R_C_main
   176 ],      [ return 0; ],
   177         [ echo "*** The test program compiled, but did not run. This usually means"
   178           echo "*** that the run-time linker is not finding SDL or finding the wrong"
   179           echo "*** version of SDL. If it is not finding SDL, you'll need to set your"
   180           echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
   181           echo "*** to the installed location  Also, make sure you have run ldconfig if that"
   182           echo "*** is required on your system"
   183 	  echo "***"
   184           echo "*** If you have an old version installed, it is best to remove it, although"
   185           echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
   186         [ echo "*** The test program failed to compile or link. See the file config.log for the"
   187           echo "*** exact error that occured. This usually means SDL was incorrectly installed"
   188           echo "*** or that you have moved SDL since it was installed. In the latter case, you"
   189           echo "*** may want to edit the sdl2-config script: $SDL2_CONFIG" ])
   190           CFLAGS="$ac_save_CFLAGS"
   191           CXXFLAGS="$ac_save_CXXFLAGS"
   192           LIBS="$ac_save_LIBS"
   193        fi
   194      fi
   195      SDL_CFLAGS=""
   196      SDL_LIBS=""
   197      ifelse([$3], , :, [$3])
   198   fi
   199   AC_SUBST(SDL_CFLAGS)
   200   AC_SUBST(SDL_LIBS)
   201   rm -f conf.sdltest
   202 ])