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