1130803Smarcel#! /bin/sh 2130803Smarcel# mkinstalldirs --- make directory hierarchy 3130803Smarcel 4130803Smarcelscriptversion=2004-02-15.20 5130803Smarcel 6130803Smarcel# Original author: Noah Friedman <friedman@prep.ai.mit.edu> 7130803Smarcel# Created: 1993-05-16 8130803Smarcel# Public domain. 9130803Smarcel# 10130803Smarcel# This file is maintained in Automake, please report 11130803Smarcel# bugs to <bug-automake@gnu.org> or send patches to 12130803Smarcel# <automake-patches@gnu.org>. 13130803Smarcel 14130803Smarcelerrstatus=0 15130803Smarceldirmode="" 16130803Smarcel 17130803Smarcelusage="\ 18130803SmarcelUsage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... 19130803Smarcel 20130803SmarcelCreate each directory DIR (with mode MODE, if specified), including all 21130803Smarcelleading file name components. 22130803Smarcel 23130803SmarcelReport bugs to <bug-automake@gnu.org>." 24130803Smarcel 25130803Smarcel# process command line arguments 26130803Smarcelwhile test $# -gt 0 ; do 27130803Smarcel case $1 in 28130803Smarcel -h | --help | --h*) # -h for help 29130803Smarcel echo "$usage" 30130803Smarcel exit 0 31130803Smarcel ;; 32130803Smarcel -m) # -m PERM arg 33130803Smarcel shift 34130803Smarcel test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } 35130803Smarcel dirmode=$1 36130803Smarcel shift 37130803Smarcel ;; 38130803Smarcel --version) 39130803Smarcel echo "$0 $scriptversion" 40130803Smarcel exit 0 41130803Smarcel ;; 42130803Smarcel --) # stop option processing 43130803Smarcel shift 44130803Smarcel break 45130803Smarcel ;; 46130803Smarcel -*) # unknown option 47130803Smarcel echo "$usage" 1>&2 48130803Smarcel exit 1 49130803Smarcel ;; 50130803Smarcel *) # first non-opt arg 51130803Smarcel break 52130803Smarcel ;; 53130803Smarcel esac 54130803Smarceldone 55130803Smarcel 56130803Smarcelfor file 57130803Smarceldo 58130803Smarcel if test -d "$file"; then 59130803Smarcel shift 60130803Smarcel else 61130803Smarcel break 62130803Smarcel fi 63130803Smarceldone 64130803Smarcel 65130803Smarcelcase $# in 66130803Smarcel 0) exit 0 ;; 67130803Smarcelesac 68130803Smarcel 69130803Smarcel# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and 70130803Smarcel# mkdir -p a/c at the same time, both will detect that a is missing, 71130803Smarcel# one will create a, then the other will try to create a and die with 72130803Smarcel# a "File exists" error. This is a problem when calling mkinstalldirs 73130803Smarcel# from a parallel make. We use --version in the probe to restrict 74130803Smarcel# ourselves to GNU mkdir, which is thread-safe. 75130803Smarcelcase $dirmode in 76130803Smarcel '') 77130803Smarcel if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then 78130803Smarcel echo "mkdir -p -- $*" 79130803Smarcel exec mkdir -p -- "$@" 80130803Smarcel else 81130803Smarcel # On NextStep and OpenStep, the `mkdir' command does not 82130803Smarcel # recognize any option. It will interpret all options as 83130803Smarcel # directories to create, and then abort because `.' already 84130803Smarcel # exists. 85130803Smarcel test -d ./-p && rmdir ./-p 86130803Smarcel test -d ./--version && rmdir ./--version 87130803Smarcel fi 88130803Smarcel ;; 89130803Smarcel *) 90130803Smarcel if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && 91130803Smarcel test ! -d ./--version; then 92130803Smarcel echo "mkdir -m $dirmode -p -- $*" 93130803Smarcel exec mkdir -m "$dirmode" -p -- "$@" 94130803Smarcel else 95130803Smarcel # Clean up after NextStep and OpenStep mkdir. 96130803Smarcel for d in ./-m ./-p ./--version "./$dirmode"; 97130803Smarcel do 98130803Smarcel test -d $d && rmdir $d 99130803Smarcel done 100130803Smarcel fi 101130803Smarcel ;; 102130803Smarcelesac 103130803Smarcel 104130803Smarcelfor file 105130803Smarceldo 106130803Smarcel set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` 107130803Smarcel shift 108130803Smarcel 109130803Smarcel pathcomp= 110130803Smarcel for d 111130803Smarcel do 112130803Smarcel pathcomp="$pathcomp$d" 113130803Smarcel case $pathcomp in 114130803Smarcel -*) pathcomp=./$pathcomp ;; 115130803Smarcel esac 116130803Smarcel 117130803Smarcel if test ! -d "$pathcomp"; then 118130803Smarcel echo "mkdir $pathcomp" 119130803Smarcel 120130803Smarcel mkdir "$pathcomp" || lasterr=$? 121130803Smarcel 122130803Smarcel if test ! -d "$pathcomp"; then 123130803Smarcel errstatus=$lasterr 124130803Smarcel else 125130803Smarcel if test ! -z "$dirmode"; then 126130803Smarcel echo "chmod $dirmode $pathcomp" 127130803Smarcel lasterr="" 128130803Smarcel chmod "$dirmode" "$pathcomp" || lasterr=$? 129130803Smarcel 130130803Smarcel if test ! -z "$lasterr"; then 131130803Smarcel errstatus=$lasterr 132130803Smarcel fi 133130803Smarcel fi 134130803Smarcel fi 135130803Smarcel fi 136130803Smarcel 137130803Smarcel pathcomp="$pathcomp/" 138130803Smarcel done 139130803Smarceldone 140130803Smarcel 141130803Smarcelexit $errstatus 142130803Smarcel 143130803Smarcel# Local Variables: 144130803Smarcel# mode: shell-script 145130803Smarcel# sh-indentation: 2 146130803Smarcel# eval: (add-hook 'write-file-hooks 'time-stamp) 147130803Smarcel# time-stamp-start: "scriptversion=" 148130803Smarcel# time-stamp-format: "%:y-%02m-%02d.%02H" 149130803Smarcel# time-stamp-end: "$" 150130803Smarcel# End: 151