1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- #
- # MKDIRS logic
- #
- # This generates rules for all intermediate directories as well as
- # the directories listed. (That is, if you say MKDIRS=/usr/bin/foo
- # you get rules for /usr and /usr/bin as well as /usr/bin/foo.)
- #
- # Variable for complete list of dirs. Start empty.
- _MKDIRS_=
- # For each dir in the list...
- .for _DIR_ in $(MKDIRS)
- #
- # Initialize some temporaries.
- # _HEAD_ contains / if the path was absolute.
- # _INCR_DIR_ accumulates the full directory name incrementally.
- #
- # Use := to force full evaluation of the RHS of each expression while
- # still in the loop, instead of when the variables are used later.
- #
- _HEAD_:=$(_DIR_:M/*:C/..*/\//)
- _INCR_DIR_:=
- # For each component in the directory, split on slashes...
- .for _COMPONENT_ in $(_DIR_:S/\// /g)
- # Add the component to _INCR_DIR_.
- _INCR_DIR_:=$(_INCR_DIR_)$(_COMPONENT_)/
- # Add the current partial directory to the main list.
- # Lose the trailing slash.
- _MKDIRS_:=$(_MKDIRS_) $(_HEAD_)$(_INCR_DIR_:S/\/$//)
- .endfor # _COMPONENT_
- .endfor # _DIR_
- #
- # Now issue a rule for each directory in the expanded list,
- # ordering and uniquifying it.
- #
- # XXX use /dev/null to suppress curious messages like "../../.. is up
- # to date". This scheme probably ought to be reworked.
- #
- .for _DIR_ in $(_MKDIRS_:O:u)
- .if !target($(_DIR_))
- $(_DIR_):
- .for _PRE_ in $(_DIR_:M*/*:H:N..)
- @$(MAKE) $(_PRE_) >/dev/null 2>&1
- .endfor
- mkdir $(_DIR_)
- .endif
- .endfor
- # Clear MKDIRS in case we're included again.
- MKDIRS=
- # End.
|