Donnie Berkholz wrote:
Brian Paul wrote:

"make install" uses two tools to install files: $(INSTALL) and
$(COPY_LIBS).  $INSTALL is 'install' but $COPY_LIBS is "cp -f -d" (on
linux anyway).

We need COPY_LIBS because 'install' doesn't preserve symbolic links.
Unfortunately, not all versions of 'cp' support the -d option either.
Kind of a mess.

To fix all this I've written a shell script that replaces install.  It
supports the -d and -m options and keeps symbolic links in tact.  This
script will eliminate the need for INSTALL and COPY_LIBS.

I thought I'd post it here for review first.  I'm not a bash script
expert by any means.


Some suggestions inline, mostly for portability and allowing spaces in
the destination or target paths.

Thanks for the tips, Donnie!  New version attached.

How does one get the "Nth" command line parameter when N is a variable? I wasn't able to figure that out.

As for the portability of 'ln -s', the Mesa Makefile system isn't used on Windows and the mklib script uses ln -s on quite a few systems (no problems reported so far).

-Brian

#!/bin/sh


# A minimal replacement for 'install' that supports installing symbolic links.
# Only a limited number of options are supported:
# -d dir          Create a directory
# -m mode         Sets a file's mode when installing


# If these commands aren't portable, we'll need some "if (arch)" type stuff
SYMLINK="ln -s"
MKDIR="mkdir -p"

MODE=""

if [ "$1" = "-d" ] ; then
        # make a directory path
        $MKDIR $2
        exit 0
fi

if [ "$1" = "-m" ] ; then
        # set file mode
        MODE=$2
        shift 2
fi

# install file(s) into destination
if [ $# -ge 2 ] ; then

        # Find last cmd line arg, it's the dest dir
        for v in $@ ; do
                DEST=$v
        done
        #echo dest is $DEST

        # Loop over args, moving them to DEST directory
        I=1
        for FILE in $@ ; do
                if [ $I = $# ] ; then
                        # stop, don't want to install $DEST into $DEST
                        exit 0
                fi

                # determine file's type
                if [ -h "$FILE" ] ; then
                        #echo $FILE is a symlink
                        # Unfortunately, cp -d isn't universal so we have to
                        # use a work-around.

                        # Use ls -l to find the target that the link points to
                        LL=`ls -l "$FILE"`
                        for L in $LL ; do
                                TARGET=$L
                        done
                        #echo $FILE is a symlink pointing to $TARGET

                        FILE=`basename "$FILE"`
                        # Go to $DEST and make the link
                        PWDSAVE="$PWD"
                        cd "$DEST"        # pushd
                                $SYMLINK "$TARGET" "$FILE"
                        cd "$PWDSAVE"     # popd

                elif [ -f "$FILE" ] ; then
                        #echo "$FILE" is a regular file
                        cp "$FILE" "$DEST"
                        if [ $MODE ] ; then
                                chmod $MODE "$DEST/$FILE"
                        fi
                else
                        echo "Unknown type of argument: " "$FILE"
                        exit 1
                fi

                I=`expr $I + 1`
        done

        exit 0
fi

# If we get here, we didn't find anything to do
echo "Usage:"
echo "  install -d dir                      Create named directory"
echo "  install [-m mode] file [...] dest   Install files in destination"

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Mesa3d-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to