1189777a2SCristian Pallares#! /bin/sh 2189777a2SCristian Pallares# mkinstalldirs --- make directory hierarchy 3189777a2SCristian Pallares 4189777a2SCristian Pallaresscriptversion=2009-04-28.21; # UTC 5189777a2SCristian Pallares 6189777a2SCristian Pallares# Original author: Noah Friedman <[email protected]> 7189777a2SCristian Pallares# Created: 1993-05-16 8189777a2SCristian Pallares# Public domain. 9189777a2SCristian Pallares# 10189777a2SCristian Pallares# This file is maintained in Automake, please report 11189777a2SCristian Pallares# bugs to <[email protected]> or send patches to 12189777a2SCristian Pallares# <[email protected]>. 13189777a2SCristian Pallares 14189777a2SCristian Pallaresnl=' 15189777a2SCristian Pallares' 16189777a2SCristian PallaresIFS=" "" $nl" 17189777a2SCristian Pallareserrstatus=0 18189777a2SCristian Pallaresdirmode= 19189777a2SCristian Pallares 20189777a2SCristian Pallaresusage="\ 21189777a2SCristian PallaresUsage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... 22189777a2SCristian Pallares 23189777a2SCristian PallaresCreate each directory DIR (with mode MODE, if specified), including all 24189777a2SCristian Pallaresleading file name components. 25189777a2SCristian Pallares 26189777a2SCristian PallaresReport bugs to <[email protected]>." 27189777a2SCristian Pallares 28189777a2SCristian Pallares# process command line arguments 29189777a2SCristian Pallareswhile test $# -gt 0 ; do 30189777a2SCristian Pallares case $1 in 31189777a2SCristian Pallares -h | --help | --h*) # -h for help 32189777a2SCristian Pallares echo "$usage" 33189777a2SCristian Pallares exit $? 34189777a2SCristian Pallares ;; 35189777a2SCristian Pallares -m) # -m PERM arg 36189777a2SCristian Pallares shift 37189777a2SCristian Pallares test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } 38189777a2SCristian Pallares dirmode=$1 39189777a2SCristian Pallares shift 40189777a2SCristian Pallares ;; 41189777a2SCristian Pallares --version) 42189777a2SCristian Pallares echo "$0 $scriptversion" 43189777a2SCristian Pallares exit $? 44189777a2SCristian Pallares ;; 45189777a2SCristian Pallares --) # stop option processing 46189777a2SCristian Pallares shift 47189777a2SCristian Pallares break 48189777a2SCristian Pallares ;; 49189777a2SCristian Pallares -*) # unknown option 50189777a2SCristian Pallares echo "$usage" 1>&2 51189777a2SCristian Pallares exit 1 52189777a2SCristian Pallares ;; 53189777a2SCristian Pallares *) # first non-opt arg 54189777a2SCristian Pallares break 55189777a2SCristian Pallares ;; 56189777a2SCristian Pallares esac 57189777a2SCristian Pallaresdone 58189777a2SCristian Pallares 59189777a2SCristian Pallaresfor file 60189777a2SCristian Pallaresdo 61189777a2SCristian Pallares if test -d "$file"; then 62189777a2SCristian Pallares shift 63189777a2SCristian Pallares else 64189777a2SCristian Pallares break 65189777a2SCristian Pallares fi 66189777a2SCristian Pallaresdone 67189777a2SCristian Pallares 68189777a2SCristian Pallarescase $# in 69189777a2SCristian Pallares 0) exit 0 ;; 70189777a2SCristian Pallaresesac 71189777a2SCristian Pallares 72189777a2SCristian Pallares# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and 73189777a2SCristian Pallares# mkdir -p a/c at the same time, both will detect that a is missing, 74189777a2SCristian Pallares# one will create a, then the other will try to create a and die with 75189777a2SCristian Pallares# a "File exists" error. This is a problem when calling mkinstalldirs 76189777a2SCristian Pallares# from a parallel make. We use --version in the probe to restrict 77189777a2SCristian Pallares# ourselves to GNU mkdir, which is thread-safe. 78189777a2SCristian Pallarescase $dirmode in 79189777a2SCristian Pallares '') 80189777a2SCristian Pallares if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then 81189777a2SCristian Pallares echo "mkdir -p -- $*" 82189777a2SCristian Pallares exec mkdir -p -- "$@" 83189777a2SCristian Pallares else 84*1f13f311SSkyrpex # On NextStep and OpenStep, the 'mkdir' command does not 85189777a2SCristian Pallares # recognize any option. It will interpret all options as 86*1f13f311SSkyrpex # directories to create, and then abort because '.' already 87189777a2SCristian Pallares # exists. 88189777a2SCristian Pallares test -d ./-p && rmdir ./-p 89189777a2SCristian Pallares test -d ./--version && rmdir ./--version 90189777a2SCristian Pallares fi 91189777a2SCristian Pallares ;; 92189777a2SCristian Pallares *) 93189777a2SCristian Pallares if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && 94189777a2SCristian Pallares test ! -d ./--version; then 95189777a2SCristian Pallares echo "mkdir -m $dirmode -p -- $*" 96189777a2SCristian Pallares exec mkdir -m "$dirmode" -p -- "$@" 97189777a2SCristian Pallares else 98189777a2SCristian Pallares # Clean up after NextStep and OpenStep mkdir. 99189777a2SCristian Pallares for d in ./-m ./-p ./--version "./$dirmode"; 100189777a2SCristian Pallares do 101189777a2SCristian Pallares test -d $d && rmdir $d 102189777a2SCristian Pallares done 103189777a2SCristian Pallares fi 104189777a2SCristian Pallares ;; 105189777a2SCristian Pallaresesac 106189777a2SCristian Pallares 107189777a2SCristian Pallaresfor file 108189777a2SCristian Pallaresdo 109189777a2SCristian Pallares case $file in 110189777a2SCristian Pallares /*) pathcomp=/ ;; 111189777a2SCristian Pallares *) pathcomp= ;; 112189777a2SCristian Pallares esac 113189777a2SCristian Pallares oIFS=$IFS 114189777a2SCristian Pallares IFS=/ 115189777a2SCristian Pallares set fnord $file 116189777a2SCristian Pallares shift 117189777a2SCristian Pallares IFS=$oIFS 118189777a2SCristian Pallares 119189777a2SCristian Pallares for d 120189777a2SCristian Pallares do 121189777a2SCristian Pallares test "x$d" = x && continue 122189777a2SCristian Pallares 123189777a2SCristian Pallares pathcomp=$pathcomp$d 124189777a2SCristian Pallares case $pathcomp in 125189777a2SCristian Pallares -*) pathcomp=./$pathcomp ;; 126189777a2SCristian Pallares esac 127189777a2SCristian Pallares 128189777a2SCristian Pallares if test ! -d "$pathcomp"; then 129189777a2SCristian Pallares echo "mkdir $pathcomp" 130189777a2SCristian Pallares 131189777a2SCristian Pallares mkdir "$pathcomp" || lasterr=$? 132189777a2SCristian Pallares 133189777a2SCristian Pallares if test ! -d "$pathcomp"; then 134189777a2SCristian Pallares errstatus=$lasterr 135189777a2SCristian Pallares else 136189777a2SCristian Pallares if test ! -z "$dirmode"; then 137189777a2SCristian Pallares echo "chmod $dirmode $pathcomp" 138189777a2SCristian Pallares lasterr= 139189777a2SCristian Pallares chmod "$dirmode" "$pathcomp" || lasterr=$? 140189777a2SCristian Pallares 141189777a2SCristian Pallares if test ! -z "$lasterr"; then 142189777a2SCristian Pallares errstatus=$lasterr 143189777a2SCristian Pallares fi 144189777a2SCristian Pallares fi 145189777a2SCristian Pallares fi 146189777a2SCristian Pallares fi 147189777a2SCristian Pallares 148189777a2SCristian Pallares pathcomp=$pathcomp/ 149189777a2SCristian Pallares done 150189777a2SCristian Pallaresdone 151189777a2SCristian Pallares 152189777a2SCristian Pallaresexit $errstatus 153189777a2SCristian Pallares 154189777a2SCristian Pallares# Local Variables: 155189777a2SCristian Pallares# mode: shell-script 156189777a2SCristian Pallares# sh-indentation: 2 157189777a2SCristian Pallares# eval: (add-hook 'write-file-hooks 'time-stamp) 158189777a2SCristian Pallares# time-stamp-start: "scriptversion=" 159189777a2SCristian Pallares# time-stamp-format: "%:y-%02m-%02d.%02H" 160189777a2SCristian Pallares# time-stamp-time-zone: "UTC" 161189777a2SCristian Pallares# time-stamp-end: "; # UTC" 162189777a2SCristian Pallares# End: 163