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