1*735d6239SKiyoung Kim#! /bin/sh 2*735d6239SKiyoung Kim# mkinstalldirs --- make directory hierarchy 3*735d6239SKiyoung Kim 4*735d6239SKiyoung Kimscriptversion=2009-04-28.21; # UTC 5*735d6239SKiyoung Kim 6*735d6239SKiyoung Kim# Original author: Noah Friedman <[email protected]> 7*735d6239SKiyoung Kim# Created: 1993-05-16 8*735d6239SKiyoung Kim# Public domain. 9*735d6239SKiyoung Kim# 10*735d6239SKiyoung Kim# This file is maintained in Automake, please report 11*735d6239SKiyoung Kim# bugs to <[email protected]> or send patches to 12*735d6239SKiyoung Kim# <[email protected]>. 13*735d6239SKiyoung Kim 14*735d6239SKiyoung Kimnl=' 15*735d6239SKiyoung Kim' 16*735d6239SKiyoung KimIFS=" "" $nl" 17*735d6239SKiyoung Kimerrstatus=0 18*735d6239SKiyoung Kimdirmode= 19*735d6239SKiyoung Kim 20*735d6239SKiyoung Kimusage="\ 21*735d6239SKiyoung KimUsage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... 22*735d6239SKiyoung Kim 23*735d6239SKiyoung KimCreate each directory DIR (with mode MODE, if specified), including all 24*735d6239SKiyoung Kimleading file name components. 25*735d6239SKiyoung Kim 26*735d6239SKiyoung KimReport bugs to <[email protected]>." 27*735d6239SKiyoung Kim 28*735d6239SKiyoung Kim# process command line arguments 29*735d6239SKiyoung Kimwhile test $# -gt 0 ; do 30*735d6239SKiyoung Kim case $1 in 31*735d6239SKiyoung Kim -h | --help | --h*) # -h for help 32*735d6239SKiyoung Kim echo "$usage" 33*735d6239SKiyoung Kim exit $? 34*735d6239SKiyoung Kim ;; 35*735d6239SKiyoung Kim -m) # -m PERM arg 36*735d6239SKiyoung Kim shift 37*735d6239SKiyoung Kim test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } 38*735d6239SKiyoung Kim dirmode=$1 39*735d6239SKiyoung Kim shift 40*735d6239SKiyoung Kim ;; 41*735d6239SKiyoung Kim --version) 42*735d6239SKiyoung Kim echo "$0 $scriptversion" 43*735d6239SKiyoung Kim exit $? 44*735d6239SKiyoung Kim ;; 45*735d6239SKiyoung Kim --) # stop option processing 46*735d6239SKiyoung Kim shift 47*735d6239SKiyoung Kim break 48*735d6239SKiyoung Kim ;; 49*735d6239SKiyoung Kim -*) # unknown option 50*735d6239SKiyoung Kim echo "$usage" 1>&2 51*735d6239SKiyoung Kim exit 1 52*735d6239SKiyoung Kim ;; 53*735d6239SKiyoung Kim *) # first non-opt arg 54*735d6239SKiyoung Kim break 55*735d6239SKiyoung Kim ;; 56*735d6239SKiyoung Kim esac 57*735d6239SKiyoung Kimdone 58*735d6239SKiyoung Kim 59*735d6239SKiyoung Kimfor file 60*735d6239SKiyoung Kimdo 61*735d6239SKiyoung Kim if test -d "$file"; then 62*735d6239SKiyoung Kim shift 63*735d6239SKiyoung Kim else 64*735d6239SKiyoung Kim break 65*735d6239SKiyoung Kim fi 66*735d6239SKiyoung Kimdone 67*735d6239SKiyoung Kim 68*735d6239SKiyoung Kimcase $# in 69*735d6239SKiyoung Kim 0) exit 0 ;; 70*735d6239SKiyoung Kimesac 71*735d6239SKiyoung Kim 72*735d6239SKiyoung Kim# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and 73*735d6239SKiyoung Kim# mkdir -p a/c at the same time, both will detect that a is missing, 74*735d6239SKiyoung Kim# one will create a, then the other will try to create a and die with 75*735d6239SKiyoung Kim# a "File exists" error. This is a problem when calling mkinstalldirs 76*735d6239SKiyoung Kim# from a parallel make. We use --version in the probe to restrict 77*735d6239SKiyoung Kim# ourselves to GNU mkdir, which is thread-safe. 78*735d6239SKiyoung Kimcase $dirmode in 79*735d6239SKiyoung Kim '') 80*735d6239SKiyoung Kim if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then 81*735d6239SKiyoung Kim echo "mkdir -p -- $*" 82*735d6239SKiyoung Kim exec mkdir -p -- "$@" 83*735d6239SKiyoung Kim else 84*735d6239SKiyoung Kim # On NextStep and OpenStep, the `mkdir' command does not 85*735d6239SKiyoung Kim # recognize any option. It will interpret all options as 86*735d6239SKiyoung Kim # directories to create, and then abort because `.' already 87*735d6239SKiyoung Kim # exists. 88*735d6239SKiyoung Kim test -d ./-p && rmdir ./-p 89*735d6239SKiyoung Kim test -d ./--version && rmdir ./--version 90*735d6239SKiyoung Kim fi 91*735d6239SKiyoung Kim ;; 92*735d6239SKiyoung Kim *) 93*735d6239SKiyoung Kim if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && 94*735d6239SKiyoung Kim test ! -d ./--version; then 95*735d6239SKiyoung Kim echo "mkdir -m $dirmode -p -- $*" 96*735d6239SKiyoung Kim exec mkdir -m "$dirmode" -p -- "$@" 97*735d6239SKiyoung Kim else 98*735d6239SKiyoung Kim # Clean up after NextStep and OpenStep mkdir. 99*735d6239SKiyoung Kim for d in ./-m ./-p ./--version "./$dirmode"; 100*735d6239SKiyoung Kim do 101*735d6239SKiyoung Kim test -d $d && rmdir $d 102*735d6239SKiyoung Kim done 103*735d6239SKiyoung Kim fi 104*735d6239SKiyoung Kim ;; 105*735d6239SKiyoung Kimesac 106*735d6239SKiyoung Kim 107*735d6239SKiyoung Kimfor file 108*735d6239SKiyoung Kimdo 109*735d6239SKiyoung Kim case $file in 110*735d6239SKiyoung Kim /*) pathcomp=/ ;; 111*735d6239SKiyoung Kim *) pathcomp= ;; 112*735d6239SKiyoung Kim esac 113*735d6239SKiyoung Kim oIFS=$IFS 114*735d6239SKiyoung Kim IFS=/ 115*735d6239SKiyoung Kim set fnord $file 116*735d6239SKiyoung Kim shift 117*735d6239SKiyoung Kim IFS=$oIFS 118*735d6239SKiyoung Kim 119*735d6239SKiyoung Kim for d 120*735d6239SKiyoung Kim do 121*735d6239SKiyoung Kim test "x$d" = x && continue 122*735d6239SKiyoung Kim 123*735d6239SKiyoung Kim pathcomp=$pathcomp$d 124*735d6239SKiyoung Kim case $pathcomp in 125*735d6239SKiyoung Kim -*) pathcomp=./$pathcomp ;; 126*735d6239SKiyoung Kim esac 127*735d6239SKiyoung Kim 128*735d6239SKiyoung Kim if test ! -d "$pathcomp"; then 129*735d6239SKiyoung Kim echo "mkdir $pathcomp" 130*735d6239SKiyoung Kim 131*735d6239SKiyoung Kim mkdir "$pathcomp" || lasterr=$? 132*735d6239SKiyoung Kim 133*735d6239SKiyoung Kim if test ! -d "$pathcomp"; then 134*735d6239SKiyoung Kim errstatus=$lasterr 135*735d6239SKiyoung Kim else 136*735d6239SKiyoung Kim if test ! -z "$dirmode"; then 137*735d6239SKiyoung Kim echo "chmod $dirmode $pathcomp" 138*735d6239SKiyoung Kim lasterr= 139*735d6239SKiyoung Kim chmod "$dirmode" "$pathcomp" || lasterr=$? 140*735d6239SKiyoung Kim 141*735d6239SKiyoung Kim if test ! -z "$lasterr"; then 142*735d6239SKiyoung Kim errstatus=$lasterr 143*735d6239SKiyoung Kim fi 144*735d6239SKiyoung Kim fi 145*735d6239SKiyoung Kim fi 146*735d6239SKiyoung Kim fi 147*735d6239SKiyoung Kim 148*735d6239SKiyoung Kim pathcomp=$pathcomp/ 149*735d6239SKiyoung Kim done 150*735d6239SKiyoung Kimdone 151*735d6239SKiyoung Kim 152*735d6239SKiyoung Kimexit $errstatus 153*735d6239SKiyoung Kim 154*735d6239SKiyoung Kim# Local Variables: 155*735d6239SKiyoung Kim# mode: shell-script 156*735d6239SKiyoung Kim# sh-indentation: 2 157*735d6239SKiyoung Kim# eval: (add-hook 'write-file-hooks 'time-stamp) 158*735d6239SKiyoung Kim# time-stamp-start: "scriptversion=" 159*735d6239SKiyoung Kim# time-stamp-format: "%:y-%02m-%02d.%02H" 160*735d6239SKiyoung Kim# time-stamp-time-zone: "UTC" 161*735d6239SKiyoung Kim# time-stamp-end: "; # UTC" 162*735d6239SKiyoung Kim# End: 163