I appreciate there are only a few people actively using Matthias's approach and scripts, but the effects of this one have bugged me for ages whenever I come to install Xen from a Package User account. I have even asked about it on the xen-devel list, but yesterday, after mentioning it again, had an epiphany!
The problem, as seen within the Xen code base, is that a 'make world' does a 'make clean' which removes four directories from the docs directory - man1, man5 man7 and man8 - but those not being there causes the man page creation to fail later on and, until yesterday, I have never worked out why, going so far to splilt the 'make world' into it's constituent parts, vis make clean mkdir -p docs/man{1,5,7,8} make ... So here's what happens. The Xen build tries to do this, install -d -m0755 -p man1 and so on, in the docs directory, however although /usr/bin/install would do the right thing /usr/lib/pkgusr/install which is the 'install' that a Package User user's $PATH will find SILENTLY fails to create directories that don't have some form of a path in them, so, for example, this does work install -d -m0755 -p ./man1 but without the dot-slash it just fails, and worse still fails silently, leaving people like me to wonder, for quite a few years now, just what was going on. The relevant code in /usr/lib/pkgusr/install ia #********** test if we create directories ******************** if [ \( z"$1" = z"-d" \) -o \( z"$1" = z"-m" -a z"$3" = z"-d" \) ]; then locdirs="" notify=0 havedir=0 for((i=$#; $i>0; )) do a="$1" shift 1; i=$(($i-1)) case "$a" in -o|-g|--owner|--group) notify=1 shift 1; i=$(($i-1)) set -- "$@" ;; $localedir/*) if [ ! -d "$a" ]; then locdirs="$locdirs ""`expr $a : "$localedir/\(.*\)"`" set -- "$@" "$a" havedir=1 else notify=1 set -- "$@" fi ;; */*|/sbin) if [ ! -d "$a" ]; then set -- "$@" "$a" havedir=1 else notify=1 set -- "$@" fi ;; *) set -- "$@" "$a" ;; esac done test $notify -eq 1 -o z"$locdirs" != z && \ echo 1>&2 '***' install "$cmdline" test $havedir -eq 0 && exit 0 $DAISY_CHAIN "$@" || exit $? and the thing to note is that even though that stanza starts with the check for the -d, havedir is initialised to 0, and only gets set to 1 if the target filename has a slash in it. My solution has been to turn the logic around so that havedir is initialised to 1 and then only gets set to 0 in the else clauses of the places where it was being set to 1 before. This seems to work, but can anyone see any issues in doing it that way? #********** test if we create directories ******************** if [ \( z"$1" = z"-d" \) -o \( z"$1" = z"-m" -a z"$3" = z"-d" \) ]; then locdirs="" notify=0 # We are in a block that knows we have found a -d, so we havedir havedir=1 for((i=$#; $i>0; )) do a="$1" shift 1; i=$(($i-1)) case "$a" in -o|-g|--owner|--group) notify=1 shift 1; i=$(($i-1)) set -- "$@" ;; $localedir/*) if [ ! -d "$a" ]; then locdirs="$locdirs ""`expr $a : "$localedir/\(.*\)"`" set -- "$@" "$a" else havedir=0 notify=1 set -- "$@" fi ;; */*|/sbin) if [ ! -d "$a" ]; then set -- "$@" "$a" else havedir=0 notify=1 set -- "$@" fi ;; *) set -- "$@" "./$a" ;; esac done test $notify -eq 1 -o z"$locdirs" != z && \ echo 1>&2 '***' install "$cmdline" test $havedir -eq 0 && exit 0 I don't suppose Matthias is stiil around ? And yes, you can invoke the Xen 'make world' as 'make INSTALL=/usr/bin/install world' instead. Kevin -- http://lists.linuxfromscratch.org/listinfo/lfs-dev FAQ: http://www.linuxfromscratch.org/faq/ Unsubscribe: See the above information page