build-scripts/install-sh
author Sam Lantinga
Tue, 10 Jan 2017 08:54:33 -0800
changeset 10806 36f40b8cc979
parent 1361 19418e4422cb
child 12335 5e68900d2232
permissions -rwxr-xr-x
Fixed bugs 2570, 3145, improved OpenGL ES context support on Windows and X11

Mark Callow

The attached patch does the following for the X11 and Windows platforms, the only ones where SDL attempts to use context_create_es_profile:

- Adds SDL_HINT_OPENGL_ES_DRIVER by which the application can
say to use the OpenGL ES driver & EGL rather than the Open GL
driver. (For bug #2570)
- Adds code to {WIN,X11}_GL_InitExtensions to determine the maximum
OpenGL ES version supported by the OpenGL driver (for bug #3145)
- Modifies the test that determines whether to use the OpenGL
driver or the real OpenGL ES driver to take into account the
hint, the requested and supported ES version and whether ES 1.X
is being requested. (For bug #2570 & bug #3145)
- Enables the testgles2 test for __WINDOWS__ and __LINUX__ and adds
the test to the VisualC projects.

With the fix in place I have run testdraw2, testgl and testgles2 without any issues and have run my own apps that use OpenGL, OpenGL ES 3 and OpenGL ES 1.1.
     1 #!/bin/sh
     2 # install - install a program, script, or datafile
     3 
     4 scriptversion=2005-02-02.21
     5 
     6 # This originates from X11R5 (mit/util/scripts/install.sh), which was
     7 # later released in X11R6 (xc/config/util/install.sh) with the
     8 # following copyright and license.
     9 #
    10 # Copyright (C) 1994 X Consortium
    11 #
    12 # Permission is hereby granted, free of charge, to any person obtaining a copy
    13 # of this software and associated documentation files (the "Software"), to
    14 # deal in the Software without restriction, including without limitation the
    15 # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
    16 # sell copies of the Software, and to permit persons to whom the Software is
    17 # furnished to do so, subject to the following conditions:
    18 #
    19 # The above copyright notice and this permission notice shall be included in
    20 # all copies or substantial portions of the Software.
    21 #
    22 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    23 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    24 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
    25 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
    26 # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
    27 # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    28 #
    29 # Except as contained in this notice, the name of the X Consortium shall not
    30 # be used in advertising or otherwise to promote the sale, use or other deal-
    31 # ings in this Software without prior written authorization from the X Consor-
    32 # tium.
    33 #
    34 #
    35 # FSF changes to this file are in the public domain.
    36 #
    37 # Calling this script install-sh is preferred over install.sh, to prevent
    38 # `make' implicit rules from creating a file called install from it
    39 # when there is no Makefile.
    40 #
    41 # This script is compatible with the BSD install script, but was written
    42 # from scratch.  It can only install one file at a time, a restriction
    43 # shared with many OS's install programs.
    44 
    45 # set DOITPROG to echo to test this script
    46 
    47 # Don't use :- since 4.3BSD and earlier shells don't like it.
    48 doit="${DOITPROG-}"
    49 
    50 # put in absolute paths if you don't have them in your path; or use env. vars.
    51 
    52 mvprog="${MVPROG-mv}"
    53 cpprog="${CPPROG-cp}"
    54 chmodprog="${CHMODPROG-chmod}"
    55 chownprog="${CHOWNPROG-chown}"
    56 chgrpprog="${CHGRPPROG-chgrp}"
    57 stripprog="${STRIPPROG-strip}"
    58 rmprog="${RMPROG-rm}"
    59 mkdirprog="${MKDIRPROG-mkdir}"
    60 
    61 chmodcmd="$chmodprog 0755"
    62 chowncmd=
    63 chgrpcmd=
    64 stripcmd=
    65 rmcmd="$rmprog -f"
    66 mvcmd="$mvprog"
    67 src=
    68 dst=
    69 dir_arg=
    70 dstarg=
    71 no_target_directory=
    72 
    73 usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
    74    or: $0 [OPTION]... SRCFILES... DIRECTORY
    75    or: $0 [OPTION]... -t DIRECTORY SRCFILES...
    76    or: $0 [OPTION]... -d DIRECTORIES...
    77 
    78 In the 1st form, copy SRCFILE to DSTFILE.
    79 In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
    80 In the 4th, create DIRECTORIES.
    81 
    82 Options:
    83 -c         (ignored)
    84 -d         create directories instead of installing files.
    85 -g GROUP   $chgrpprog installed files to GROUP.
    86 -m MODE    $chmodprog installed files to MODE.
    87 -o USER    $chownprog installed files to USER.
    88 -s         $stripprog installed files.
    89 -t DIRECTORY  install into DIRECTORY.
    90 -T         report an error if DSTFILE is a directory.
    91 --help     display this help and exit.
    92 --version  display version info and exit.
    93 
    94 Environment variables override the default commands:
    95   CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
    96 "
    97 
    98 while test -n "$1"; do
    99   case $1 in
   100     -c) shift
   101         continue;;
   102 
   103     -d) dir_arg=true
   104         shift
   105         continue;;
   106 
   107     -g) chgrpcmd="$chgrpprog $2"
   108         shift
   109         shift
   110         continue;;
   111 
   112     --help) echo "$usage"; exit $?;;
   113 
   114     -m) chmodcmd="$chmodprog $2"
   115         shift
   116         shift
   117         continue;;
   118 
   119     -o) chowncmd="$chownprog $2"
   120         shift
   121         shift
   122         continue;;
   123 
   124     -s) stripcmd=$stripprog
   125         shift
   126         continue;;
   127 
   128     -t) dstarg=$2
   129 	shift
   130 	shift
   131 	continue;;
   132 
   133     -T) no_target_directory=true
   134 	shift
   135 	continue;;
   136 
   137     --version) echo "$0 $scriptversion"; exit $?;;
   138 
   139     *)  # When -d is used, all remaining arguments are directories to create.
   140 	# When -t is used, the destination is already specified.
   141 	test -n "$dir_arg$dstarg" && break
   142         # Otherwise, the last argument is the destination.  Remove it from $@.
   143 	for arg
   144 	do
   145           if test -n "$dstarg"; then
   146 	    # $@ is not empty: it contains at least $arg.
   147 	    set fnord "$@" "$dstarg"
   148 	    shift # fnord
   149 	  fi
   150 	  shift # arg
   151 	  dstarg=$arg
   152 	done
   153 	break;;
   154   esac
   155 done
   156 
   157 if test -z "$1"; then
   158   if test -z "$dir_arg"; then
   159     echo "$0: no input file specified." >&2
   160     exit 1
   161   fi
   162   # It's OK to call `install-sh -d' without argument.
   163   # This can happen when creating conditional directories.
   164   exit 0
   165 fi
   166 
   167 for src
   168 do
   169   # Protect names starting with `-'.
   170   case $src in
   171     -*) src=./$src ;;
   172   esac
   173 
   174   if test -n "$dir_arg"; then
   175     dst=$src
   176     src=
   177 
   178     if test -d "$dst"; then
   179       mkdircmd=:
   180       chmodcmd=
   181     else
   182       mkdircmd=$mkdirprog
   183     fi
   184   else
   185     # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
   186     # might cause directories to be created, which would be especially bad
   187     # if $src (and thus $dsttmp) contains '*'.
   188     if test ! -f "$src" && test ! -d "$src"; then
   189       echo "$0: $src does not exist." >&2
   190       exit 1
   191     fi
   192 
   193     if test -z "$dstarg"; then
   194       echo "$0: no destination specified." >&2
   195       exit 1
   196     fi
   197 
   198     dst=$dstarg
   199     # Protect names starting with `-'.
   200     case $dst in
   201       -*) dst=./$dst ;;
   202     esac
   203 
   204     # If destination is a directory, append the input filename; won't work
   205     # if double slashes aren't ignored.
   206     if test -d "$dst"; then
   207       if test -n "$no_target_directory"; then
   208 	echo "$0: $dstarg: Is a directory" >&2
   209 	exit 1
   210       fi
   211       dst=$dst/`basename "$src"`
   212     fi
   213   fi
   214 
   215   # This sed command emulates the dirname command.
   216   dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
   217 
   218   # Make sure that the destination directory exists.
   219 
   220   # Skip lots of stat calls in the usual case.
   221   if test ! -d "$dstdir"; then
   222     defaultIFS='
   223 	 '
   224     IFS="${IFS-$defaultIFS}"
   225 
   226     oIFS=$IFS
   227     # Some sh's can't handle IFS=/ for some reason.
   228     IFS='%'
   229     set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
   230     shift
   231     IFS=$oIFS
   232 
   233     pathcomp=
   234 
   235     while test $# -ne 0 ; do
   236       pathcomp=$pathcomp$1
   237       shift
   238       if test ! -d "$pathcomp"; then
   239         $mkdirprog "$pathcomp"
   240 	# mkdir can fail with a `File exist' error in case several
   241 	# install-sh are creating the directory concurrently.  This
   242 	# is OK.
   243 	test -d "$pathcomp" || exit
   244       fi
   245       pathcomp=$pathcomp/
   246     done
   247   fi
   248 
   249   if test -n "$dir_arg"; then
   250     $doit $mkdircmd "$dst" \
   251       && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
   252       && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
   253       && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
   254       && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
   255 
   256   else
   257     dstfile=`basename "$dst"`
   258 
   259     # Make a couple of temp file names in the proper directory.
   260     dsttmp=$dstdir/_inst.$$_
   261     rmtmp=$dstdir/_rm.$$_
   262 
   263     # Trap to clean up those temp files at exit.
   264     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
   265     trap '(exit $?); exit' 1 2 13 15
   266 
   267     # Copy the file name to the temp name.
   268     $doit $cpprog "$src" "$dsttmp" &&
   269 
   270     # and set any options; do chmod last to preserve setuid bits.
   271     #
   272     # If any of these fail, we abort the whole thing.  If we want to
   273     # ignore errors from any of these, just make sure not to ignore
   274     # errors from the above "$doit $cpprog $src $dsttmp" command.
   275     #
   276     { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
   277       && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
   278       && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
   279       && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
   280 
   281     # Now rename the file to the real destination.
   282     { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
   283       || {
   284 	   # The rename failed, perhaps because mv can't rename something else
   285 	   # to itself, or perhaps because mv is so ancient that it does not
   286 	   # support -f.
   287 
   288 	   # Now remove or move aside any old file at destination location.
   289 	   # We try this two ways since rm can't unlink itself on some
   290 	   # systems and the destination file might be busy for other
   291 	   # reasons.  In this case, the final cleanup might fail but the new
   292 	   # file should still install successfully.
   293 	   {
   294 	     if test -f "$dstdir/$dstfile"; then
   295 	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
   296 	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
   297 	       || {
   298 		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
   299 		 (exit 1); exit 1
   300 	       }
   301 	     else
   302 	       :
   303 	     fi
   304 	   } &&
   305 
   306 	   # Now rename the file to the real destination.
   307 	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
   308 	 }
   309     }
   310   fi || { (exit 1); exit 1; }
   311 done
   312 
   313 # The final little trick to "correctly" pass the exit status to the exit trap.
   314 {
   315   (exit 0); exit 0
   316 }
   317 
   318 # Local variables:
   319 # eval: (add-hook 'write-file-hooks 'time-stamp)
   320 # time-stamp-start: "scriptversion="
   321 # time-stamp-format: "%:y-%02m-%02d.%02H"
   322 # time-stamp-end: "$"
   323 # End: