Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • automake/install-sh

    r59310bf r00cc023  
    22# install - install a program, script, or datafile
    33
    4 scriptversion=2014-09-12.12; # UTC
     4scriptversion=2011-01-19.21; # UTC
    55
    66# This originates from X11R5 (mit/util/scripts/install.sh), which was
     
    3636#
    3737# Calling this script install-sh is preferred over install.sh, to prevent
    38 # 'make' implicit rules from creating a file called install from it
     38# `make' implicit rules from creating a file called install from it
    3939# when there is no Makefile.
    4040#
     
    4242# from scratch.
    4343
    44 tab='   '
    4544nl='
    4645'
    47 IFS=" $tab$nl"
    48 
    49 # Set DOITPROG to "echo" to test this script.
    50 
     46IFS=" ""        $nl"
     47
     48# set DOITPROG to echo to test this script
     49
     50# Don't use :- since 4.3BSD and earlier shells don't like it.
    5151doit=${DOITPROG-}
    52 doit_exec=${doit:-exec}
     52if test -z "$doit"; then
     53  doit_exec=exec
     54else
     55  doit_exec=$doit
     56fi
    5357
    5458# Put in absolute file names if you don't have them in your path;
     
    6569stripprog=${STRIPPROG-strip}
    6670
     71posix_glob='?'
     72initialize_posix_glob='
     73  test "$posix_glob" != "?" || {
     74    if (set -f) 2>/dev/null; then
     75      posix_glob=
     76    else
     77      posix_glob=:
     78    fi
     79  }
     80'
     81
    6782posix_mkdir=
    6883
     
    8398
    8499copy_on_change=false
    85 is_target_a_directory=possibly
     100no_target_directory=
    86101
    87102usage="\
     
    123138
    124139    -g) chgrpcmd="$chgrpprog $2"
    125         shift;;
     140        shift;;
    126141
    127142    --help) echo "$usage"; exit $?;;
    128143
    129144    -m) mode=$2
    130         case $mode in
    131           *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
    132             echo "$0: invalid mode: $mode" >&2
    133             exit 1;;
    134         esac
    135         shift;;
     145        case $mode in
     146          *' '* | *'    '* | *'
     147'*        | *'*'* | *'?'* | *'['*)
     148            echo "$0: invalid mode: $mode" >&2
     149            exit 1;;
     150        esac
     151        shift;;
    136152
    137153    -o) chowncmd="$chownprog $2"
    138         shift;;
     154        shift;;
    139155
    140156    -s) stripcmd=$stripprog;;
    141157
    142     -t)
    143         is_target_a_directory=always
    144         dst_arg=$2
    145         # Protect names problematic for 'test' and other utilities.
    146         case $dst_arg in
    147           -* | [=\(\)!]) dst_arg=./$dst_arg;;
    148         esac
    149         shift;;
    150 
    151     -T) is_target_a_directory=never;;
     158    -t) dst_arg=$2
     159        # Protect names problematic for `test' and other utilities.
     160        case $dst_arg in
     161          -* | [=\(\)!]) dst_arg=./$dst_arg;;
     162        esac
     163        shift;;
     164
     165    -T) no_target_directory=true;;
    152166
    153167    --version) echo "$0 $scriptversion"; exit $?;;
    154168
    155     --) shift
    156         break;;
    157 
    158     -*) echo "$0: invalid option: $1" >&2
    159         exit 1;;
     169    --) shift
     170        break;;
     171
     172    -*) echo "$0: invalid option: $1" >&2
     173        exit 1;;
    160174
    161175    *)  break;;
     
    163177  shift
    164178done
    165 
    166 # We allow the use of options -d and -T together, by making -d
    167 # take the precedence; this is for compatibility with GNU install.
    168 
    169 if test -n "$dir_arg"; then
    170   if test -n "$dst_arg"; then
    171     echo "$0: target directory not allowed when installing a directory." >&2
    172     exit 1
    173   fi
    174 fi
    175179
    176180if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
     
    187191    shift # arg
    188192    dst_arg=$arg
    189     # Protect names problematic for 'test' and other utilities.
     193    # Protect names problematic for `test' and other utilities.
    190194    case $dst_arg in
    191195      -* | [=\(\)!]) dst_arg=./$dst_arg;;
     
    199203    exit 1
    200204  fi
    201   # It's OK to call 'install-sh -d' without argument.
     205  # It's OK to call `install-sh -d' without argument.
    202206  # This can happen when creating conditional directories.
    203207  exit 0
    204 fi
    205 
    206 if test -z "$dir_arg"; then
    207   if test $# -gt 1 || test "$is_target_a_directory" = always; then
    208     if test ! -d "$dst_arg"; then
    209       echo "$0: $dst_arg: Is not a directory." >&2
    210       exit 1
    211     fi
    212   fi
    213208fi
    214209
     
    229224    *[0-7])
    230225      if test -z "$stripcmd"; then
    231         u_plus_rw=
     226        u_plus_rw=
    232227      else
    233         u_plus_rw='% 200'
     228        u_plus_rw='% 200'
    234229      fi
    235230      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
    236231    *)
    237232      if test -z "$stripcmd"; then
    238         u_plus_rw=
     233        u_plus_rw=
    239234      else
    240         u_plus_rw=,u+rw
     235        u_plus_rw=,u+rw
    241236      fi
    242237      cp_umask=$mode$u_plus_rw;;
     
    246241for src
    247242do
    248   # Protect names problematic for 'test' and other utilities.
     243  # Protect names problematic for `test' and other utilities.
    249244  case $src in
    250245    -* | [=\(\)!]) src=./$src;;
     
    275270    # if double slashes aren't ignored.
    276271    if test -d "$dst"; then
    277       if test "$is_target_a_directory" = never; then
    278         echo "$0: $dst_arg: Is a directory" >&2
    279         exit 1
     272      if test -n "$no_target_directory"; then
     273        echo "$0: $dst_arg: Is a directory" >&2
     274        exit 1
    280275      fi
    281276      dstdir=$dst
     
    283278      dstdir_status=0
    284279    else
    285       dstdir=`dirname "$dst"`
     280      # Prefer dirname, but fall back on a substitute if dirname fails.
     281      dstdir=`
     282        (dirname "$dst") 2>/dev/null ||
     283        expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
     284             X"$dst" : 'X\(//\)[^/]' \| \
     285             X"$dst" : 'X\(//\)$' \| \
     286             X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
     287        echo X"$dst" |
     288            sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
     289                   s//\1/
     290                   q
     291                 }
     292                 /^X\(\/\/\)[^/].*/{
     293                   s//\1/
     294                   q
     295                 }
     296                 /^X\(\/\/\)$/{
     297                   s//\1/
     298                   q
     299                 }
     300                 /^X\(\/\).*/{
     301                   s//\1/
     302                   q
     303                 }
     304                 s/.*/./; q'
     305      `
     306
    286307      test -d "$dstdir"
    287308      dstdir_status=$?
     
    294315    case $posix_mkdir in
    295316      '')
    296         # Create intermediate dirs using mode 755 as modified by the umask.
    297         # This is like FreeBSD 'install' as of 1997-10-28.
    298         umask=`umask`
    299         case $stripcmd.$umask in
    300           # Optimize common cases.
    301           *[2367][2367]) mkdir_umask=$umask;;
    302           .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
    303 
    304           *[0-7])
    305             mkdir_umask=`expr $umask + 22 \
    306               - $umask % 100 % 40 + $umask % 20 \
    307               - $umask % 10 % 4 + $umask % 2
    308             `;;
    309           *) mkdir_umask=$umask,go-w;;
    310         esac
    311 
    312         # With -d, create the new directory with the user-specified mode.
    313         # Otherwise, rely on $mkdir_umask.
    314         if test -n "$dir_arg"; then
    315           mkdir_mode=-m$mode
    316         else
    317           mkdir_mode=
    318         fi
    319 
    320         posix_mkdir=false
    321         case $umask in
    322           *[123567][0-7][0-7])
    323             # POSIX mkdir -p sets u+wx bits regardless of umask, which
    324             # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
    325             ;;
    326           *)
    327             # $RANDOM is not portable (e.g. dash);  use it when possible to
    328             # lower collision chance
    329             tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
    330             trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
    331 
    332             # As "mkdir -p" follows symlinks and we work in /tmp possibly;  so
    333             # create the $tmpdir first (and fail if unsuccessful) to make sure
    334             # that nobody tries to guess the $tmpdir name.
    335             if (umask $mkdir_umask &&
    336                 $mkdirprog $mkdir_mode "$tmpdir" &&
    337                 exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
    338             then
    339               if test -z "$dir_arg" || {
    340                    # Check for POSIX incompatibilities with -m.
    341                    # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
    342                    # other-writable bit of parent directory when it shouldn't.
    343                    # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
    344                    test_tmpdir="$tmpdir/a"
    345                    ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
    346                    case $ls_ld_tmpdir in
    347                      d????-?r-*) different_mode=700;;
    348                      d????-?--*) different_mode=755;;
    349                      *) false;;
    350                    esac &&
    351                    $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
    352                      ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
    353                      test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
    354                    }
    355                  }
    356               then posix_mkdir=:
    357               fi
    358               rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
    359             else
    360               # Remove any dirs left behind by ancient mkdir implementations.
    361               rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
    362             fi
    363             trap '' 0;;
    364         esac;;
     317        # Create intermediate dirs using mode 755 as modified by the umask.
     318        # This is like FreeBSD 'install' as of 1997-10-28.
     319        umask=`umask`
     320        case $stripcmd.$umask in
     321          # Optimize common cases.
     322          *[2367][2367]) mkdir_umask=$umask;;
     323          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
     324
     325          *[0-7])
     326            mkdir_umask=`expr $umask + 22 \
     327              - $umask % 100 % 40 + $umask % 20 \
     328              - $umask % 10 % 4 + $umask % 2
     329            `;;
     330          *) mkdir_umask=$umask,go-w;;
     331        esac
     332
     333        # With -d, create the new directory with the user-specified mode.
     334        # Otherwise, rely on $mkdir_umask.
     335        if test -n "$dir_arg"; then
     336          mkdir_mode=-m$mode
     337        else
     338          mkdir_mode=
     339        fi
     340
     341        posix_mkdir=false
     342        case $umask in
     343          *[123567][0-7][0-7])
     344            # POSIX mkdir -p sets u+wx bits regardless of umask, which
     345            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
     346            ;;
     347          *)
     348            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
     349            trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
     350
     351            if (umask $mkdir_umask &&
     352                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
     353            then
     354              if test -z "$dir_arg" || {
     355                   # Check for POSIX incompatibilities with -m.
     356                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
     357                   # other-writeable bit of parent directory when it shouldn't.
     358                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
     359                   ls_ld_tmpdir=`ls -ld "$tmpdir"`
     360                   case $ls_ld_tmpdir in
     361                     d????-?r-*) different_mode=700;;
     362                     d????-?--*) different_mode=755;;
     363                     *) false;;
     364                   esac &&
     365                   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
     366                     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
     367                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
     368                   }
     369                 }
     370              then posix_mkdir=:
     371              fi
     372              rmdir "$tmpdir/d" "$tmpdir"
     373            else
     374              # Remove any dirs left behind by ancient mkdir implementations.
     375              rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
     376            fi
     377            trap '' 0;;
     378        esac;;
    365379    esac
    366380
    367381    if
    368382      $posix_mkdir && (
    369         umask $mkdir_umask &&
    370         $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
     383        umask $mkdir_umask &&
     384        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
    371385      )
    372386    then :
     
    378392
    379393      case $dstdir in
    380         /*) prefix='/';;
    381         [-=\(\)!]*) prefix='./';;
    382         *)  prefix='';;
     394        /*) prefix='/';;
     395        [-=\(\)!]*) prefix='./';;
     396        *)  prefix='';;
    383397      esac
     398
     399      eval "$initialize_posix_glob"
    384400
    385401      oIFS=$IFS
    386402      IFS=/
    387       set -f
     403      $posix_glob set -f
    388404      set fnord $dstdir
    389405      shift
    390       set +f
     406      $posix_glob set +f
    391407      IFS=$oIFS
    392408
     
    395411      for d
    396412      do
    397         test X"$d" = X && continue
    398 
    399         prefix=$prefix$d
    400         if test -d "$prefix"; then
    401           prefixes=
    402         else
    403           if $posix_mkdir; then
    404             (umask=$mkdir_umask &&
    405              $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
    406             # Don't fail if two instances are running concurrently.
    407             test -d "$prefix" || exit 1
    408           else
    409             case $prefix in
    410               *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
    411               *) qprefix=$prefix;;
    412             esac
    413             prefixes="$prefixes '$qprefix'"
    414           fi
    415         fi
    416         prefix=$prefix/
     413        test X"$d" = X && continue
     414
     415        prefix=$prefix$d
     416        if test -d "$prefix"; then
     417          prefixes=
     418        else
     419          if $posix_mkdir; then
     420            (umask=$mkdir_umask &&
     421             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
     422            # Don't fail if two instances are running concurrently.
     423            test -d "$prefix" || exit 1
     424          else
     425            case $prefix in
     426              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
     427              *) qprefix=$prefix;;
     428            esac
     429            prefixes="$prefixes '$qprefix'"
     430          fi
     431        fi
     432        prefix=$prefix/
    417433      done
    418434
    419435      if test -n "$prefixes"; then
    420         # Don't fail if two instances are running concurrently.
    421         (umask $mkdir_umask &&
    422         eval "\$doit_exec \$mkdirprog $prefixes") ||
    423           test -d "$dstdir" || exit 1
    424         obsolete_mkdir_used=true
     436        # Don't fail if two instances are running concurrently.
     437        (umask $mkdir_umask &&
     438        eval "\$doit_exec \$mkdirprog $prefixes") ||
     439          test -d "$dstdir" || exit 1
     440        obsolete_mkdir_used=true
    425441      fi
    426442    fi
     
    457473    # If -C, don't bother to copy if it wouldn't change the file.
    458474    if $copy_on_change &&
    459        old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
    460        new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
    461        set -f &&
     475       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
     476       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
     477
     478       eval "$initialize_posix_glob" &&
     479       $posix_glob set -f &&
    462480       set X $old && old=:$2:$4:$5:$6 &&
    463481       set X $new && new=:$2:$4:$5:$6 &&
    464        set +f &&
     482       $posix_glob set +f &&
     483
    465484       test "$old" = "$new" &&
    466485       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
     
    475494      # support -f.
    476495      {
    477         # Now remove or move aside any old file at destination location.
    478         # We try this two ways since rm can't unlink itself on some
    479         # systems and the destination file might be busy for other
    480         # reasons.  In this case, the final cleanup might fail but the new
    481         # file should still install successfully.
    482         {
    483           test ! -f "$dst" ||
    484           $doit $rmcmd -f "$dst" 2>/dev/null ||
    485           { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
    486             { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
    487           } ||
    488           { echo "$0: cannot unlink or rename $dst" >&2
    489             (exit 1); exit 1
    490           }
    491         } &&
    492 
    493         # Now rename the file to the real destination.
    494         $doit $mvcmd "$dsttmp" "$dst"
     496        # Now remove or move aside any old file at destination location.
     497        # We try this two ways since rm can't unlink itself on some
     498        # systems and the destination file might be busy for other
     499        # reasons.  In this case, the final cleanup might fail but the new
     500        # file should still install successfully.
     501        {
     502          test ! -f "$dst" ||
     503          $doit $rmcmd -f "$dst" 2>/dev/null ||
     504          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
     505            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
     506          } ||
     507          { echo "$0: cannot unlink or rename $dst" >&2
     508            (exit 1); exit 1
     509          }
     510        } &&
     511
     512        # Now rename the file to the real destination.
     513        $doit $mvcmd "$dsttmp" "$dst"
    495514      }
    496515    fi || exit 1
Note: See TracChangeset for help on using the changeset viewer.