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