181404Speter#! /bin/sh 217721Speter# mkinstalldirs --- make directory hierarchy 3177391Sobrien 4177391Sobrienscriptversion=2006-05-11.19 5177391Sobrien 6177391Sobrien# Original author: Noah Friedman <friedman@prep.ai.mit.edu> 717721Speter# Created: 1993-05-16 8177391Sobrien# Public domain. 9177391Sobrien# 10177391Sobrien# This file is maintained in Automake, please report 11177391Sobrien# bugs to <bug-automake@gnu.org> or send patches to 12177391Sobrien# <automake-patches@gnu.org>. 1317721Speter 14177391Sobriennl=' 15177391Sobrien' 16177391SobrienIFS=" "" $nl" 1717721Spetererrstatus=0 18177391Sobriendirmode= 1917721Speter 20177391Sobrienusage="\ 21177391SobrienUsage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... 22177391Sobrien 23177391SobrienCreate each directory DIR (with mode MODE, if specified), including all 24177391Sobrienleading file name components. 25177391Sobrien 26177391SobrienReport bugs to <bug-automake@gnu.org>." 27177391Sobrien 28177391Sobrien# process command line arguments 29177391Sobrienwhile test $# -gt 0 ; do 30177391Sobrien case $1 in 31177391Sobrien -h | --help | --h*) # -h for help 32177391Sobrien echo "$usage" 33177391Sobrien exit $? 34177391Sobrien ;; 35177391Sobrien -m) # -m PERM arg 36177391Sobrien shift 37177391Sobrien test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } 38177391Sobrien dirmode=$1 39177391Sobrien shift 40177391Sobrien ;; 41177391Sobrien --version) 42177391Sobrien echo "$0 $scriptversion" 43177391Sobrien exit $? 44177391Sobrien ;; 45177391Sobrien --) # stop option processing 46177391Sobrien shift 47177391Sobrien break 48177391Sobrien ;; 49177391Sobrien -*) # unknown option 50177391Sobrien echo "$usage" 1>&2 51177391Sobrien exit 1 52177391Sobrien ;; 53177391Sobrien *) # first non-opt arg 54177391Sobrien break 55177391Sobrien ;; 56177391Sobrien esac 57177391Sobriendone 58177391Sobrien 5981404Speterfor file 6081404Speterdo 61177391Sobrien if test -d "$file"; then 62177391Sobrien shift 63177391Sobrien else 64177391Sobrien break 65177391Sobrien fi 66177391Sobriendone 6717721Speter 68177391Sobriencase $# in 69177391Sobrien 0) exit 0 ;; 70177391Sobrienesac 7117721Speter 72177391Sobrien# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and 73177391Sobrien# mkdir -p a/c at the same time, both will detect that a is missing, 74177391Sobrien# one will create a, then the other will try to create a and die with 75177391Sobrien# a "File exists" error. This is a problem when calling mkinstalldirs 76177391Sobrien# from a parallel make. We use --version in the probe to restrict 77177391Sobrien# ourselves to GNU mkdir, which is thread-safe. 78177391Sobriencase $dirmode in 79177391Sobrien '') 80177391Sobrien if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then 81177391Sobrien echo "mkdir -p -- $*" 82177391Sobrien exec mkdir -p -- "$@" 83177391Sobrien else 84177391Sobrien # On NextStep and OpenStep, the `mkdir' command does not 85177391Sobrien # recognize any option. It will interpret all options as 86177391Sobrien # directories to create, and then abort because `.' already 87177391Sobrien # exists. 88177391Sobrien test -d ./-p && rmdir ./-p 89177391Sobrien test -d ./--version && rmdir ./--version 90177391Sobrien fi 91177391Sobrien ;; 92177391Sobrien *) 93177391Sobrien if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && 94177391Sobrien test ! -d ./--version; then 95177391Sobrien echo "mkdir -m $dirmode -p -- $*" 96177391Sobrien exec mkdir -m "$dirmode" -p -- "$@" 97177391Sobrien else 98177391Sobrien # Clean up after NextStep and OpenStep mkdir. 99177391Sobrien for d in ./-m ./-p ./--version "./$dirmode"; 100177391Sobrien do 101177391Sobrien test -d $d && rmdir $d 102177391Sobrien done 103177391Sobrien fi 104177391Sobrien ;; 105177391Sobrienesac 10681404Speter 107177391Sobrienfor file 108177391Sobriendo 109177391Sobrien case $file in 110177391Sobrien /*) pathcomp=/ ;; 111177391Sobrien *) pathcomp= ;; 112177391Sobrien esac 113177391Sobrien oIFS=$IFS 114177391Sobrien IFS=/ 115177391Sobrien set fnord $file 116177391Sobrien shift 117177391Sobrien IFS=$oIFS 11881404Speter 119177391Sobrien for d 120177391Sobrien do 121177391Sobrien test "x$d" = x && continue 12217721Speter 123177391Sobrien pathcomp=$pathcomp$d 124177391Sobrien case $pathcomp in 125177391Sobrien -*) pathcomp=./$pathcomp ;; 126177391Sobrien esac 127177391Sobrien 128177391Sobrien if test ! -d "$pathcomp"; then 129177391Sobrien echo "mkdir $pathcomp" 130177391Sobrien 131177391Sobrien mkdir "$pathcomp" || lasterr=$? 132177391Sobrien 133177391Sobrien if test ! -d "$pathcomp"; then 134177391Sobrien errstatus=$lasterr 135177391Sobrien else 136177391Sobrien if test ! -z "$dirmode"; then 137177391Sobrien echo "chmod $dirmode $pathcomp" 138177391Sobrien lasterr= 139177391Sobrien chmod "$dirmode" "$pathcomp" || lasterr=$? 140177391Sobrien 141177391Sobrien if test ! -z "$lasterr"; then 142177391Sobrien errstatus=$lasterr 143177391Sobrien fi 144177391Sobrien fi 145177391Sobrien fi 146177391Sobrien fi 147177391Sobrien 148177391Sobrien pathcomp=$pathcomp/ 149177391Sobrien done 15017721Speterdone 15117721Speter 15217721Speterexit $errstatus 15317721Speter 154177391Sobrien# Local Variables: 155177391Sobrien# mode: shell-script 156177391Sobrien# sh-indentation: 2 157177391Sobrien# eval: (add-hook 'write-file-hooks 'time-stamp) 158177391Sobrien# time-stamp-start: "scriptversion=" 159177391Sobrien# time-stamp-format: "%:y-%02m-%02d.%02H" 160177391Sobrien# time-stamp-end: "$" 161177391Sobrien# End: 162