Bruce Dubbs wrote these words on 03/31/08 10:19 CST:

> Looks interesting.  Where do you put your DESTDIR?  Is it a part of the 
> chroot partition?  You said you use scripts. Can you post a typical script?

I suppose I should qualify "scripts". Actually, there is only one main
script I use to copy stuff from DESTDIR to /. I've attached it.
Note that it does nothing about the CMMI to destdir. That is in
individual scripts for each package. This attached script is
used after I determine that I like the way the DESTDIR files
are and I'm ready to install them.

Warning:

I am not an accomplished shell scripter. I know just enough to
get by. The script could probably be faster, more efficient,
smaller and much of it could be done better, I'm sure. However,
it works for me.

This was proof of concept most of all. It is not automated, but
I didn't want my first DESTDIR LFS to be. I purposely put user
interaction in it, so there wouldn't be goof-ups (I try to catch
the goof-ups anyway).

I realize I'm not good, so if anyone wants to comment that it
sucks, you could do better then it does and you probably can.
And if you think so, tell me what you think I should do to make
it better.

-- 
Randy

rmlscsi: [bogomips 1003.22] [GNU ld version 2.16.1] [gcc (GCC) 4.0.3]
[GNU C Library stable release version 2.3.6] [Linux 2.6.14.3 i686]
12:15:00 up 43 days, 3:03, 1 user, load average: 0.00, 0.03, 0.00
#! /bin/sh

getinput()
{
    userinput=""
    default="$2"
    echo
    echo -n "$1 [$2]: "
    read userinput
    if [ "$userinput" = "" ]; then
        userinput=$default
    fi
}

userabort()
{
    echo; echo "Okay, then...Fix the problem...Aborting..."; echo; echo
    exit 1
}

testcommand()
{
    if [ $? = 0 ]
    then          echo; echo "$1 process finished normally"
    else          echo; echo "$1 process failed...Aborting"; echo; echo; exit 1
    fi
}

#
# Check for any user/group ownership != root
#
if [ `find destdir !  -user root | wc -l` != 0    -o \
     `find destdir ! -group root | wc -l` != 0 ]
then
    echo; echo
    getinput "Warning - Not all files have root:root ownership - Continue? 
(Y,N)" "N"
    if [ $userinput = "n" -o $userinput = "N" ]; then userabort; fi
fi

#
# Check man, info and doc files ... move them if necessary
#
if [   -e destdir/usr/man -a ! -e destdir/usr/share/man ]; then
    if [ ! -d destdir/usr/share ]; then
        mkdir destdir/usr/share
        testcommand "Creating destdir/usr/share directory"
    fi
    mv -v destdir/usr/man destdir/usr/share >>fix_destdir.log 2>&1
    testcommand "Move man files"
elif [ -e destdir/usr/man -a   -e destdir/usr/share/man ]; then
    echo; echo "Man file structure in Destdir is screwed up...Aborting"; echo; 
exit 1
fi

if [   -e destdir/usr/info -a ! -e destdir/usr/share/info ]; then
    if [ ! -d destdir/usr/share ]; then
        mkdir destdir/usr/share
        testcommand "Creating destdir/usr/share directory"
    fi
    mv -v destdir/usr/info destdir/usr/share >>fix_destdir.log 2>&1
    testcommand "Move info files"
elif [ -e destdir/usr/info -a   -e destdir/usr/share/info ]; then
    echo; echo "Info file structure in Destdir is screwed up...Aborting"; echo; 
exit 1
fi

if [   -e destdir/usr/doc -a ! -e destdir/usr/share/doc ]; then
    if [ ! -d destdir/usr/share ]; then
        mkdir destdir/usr/share
        testcommand "Creating destdir/usr/share directory"
    fi
    mv -v destdir/usr/doc destdir/usr/share >>fix_destdir.log 2>&1
    testcommand "Move doc files"
elif [ -e destdir/usr/doc -a   -e destdir/usr/share/doc ]; then
    echo; echo "Doc file structure in Destdir is screwed up...Aborting"; echo; 
exit 1
fi

#
# Create and head/tail list of files in Destdir
#
find destdir | sort >destdir_filelist.log 2>&1
testcommand "Find Destdir files"
if [ `wc -l destdir_filelist.log | cut -d" " -f1` -gt 20 ]; then 
     head   destdir_filelist.log
     tail   destdir_filelist.log
else cat    destdir_filelist.log
fi

#
# Continue?
#
getinput "Does it look correct? (Y/N)" "Y"
if [ $userinput != "y" -a $userinput != "Y" ]; then userabort; fi

#
# Find duplicate files (will be overwritten on destination)
#
for FILENAME in `cat destdir_filelist.log`; do
    if [ -e $(echo ${FILENAME} | sed 's/destdir//') ]; then
        if [ ! -d ${FILENAME} ]; then
            echo $(echo ${FILENAME} | sed 's/destdir//') >>overwrite_files.log 
2>&1
        elif [ ${FILENAME} = "destdir/usr/share/info/dir" ]; then
            echo "Bypassing /usr/share/info/dir"
        else
            echo ${FILENAME} >>dirfiles.log 2>&1
        fi
    fi
done
testcommand "Find duplicate files"

#
# Display the overwrite filelist
#
if [ ! -e overwrite_files.log ]; then
    touch overwrite_files.log
    testcommand "Touch overwrite_files.log"
    echo; echo "No files will be overwritten"
else
    echo; echo "The following files will be overwritten:"
    cat overwrite_files.log
fi

#
# Continue?
#
getinput "Copy Destdir files to Destination? (Y/N)" "Y"
if [ $userinput != "y" -a $userinput != "Y" ]; then userabort; fi

#
# Get disk space of Destdir
#
du -scxk destdir >du_destdir.log 2>&1
testcommand "Find Destdir disk space"
cat               du_destdir.log

#
# Copy the files
#
cp -vbpr -S .Overwritten_By_${PACKAGE_NAME} destdir/* / >>final_install.log 2>&1
testcommand "Copy to destination"
echo
if [ `wc -l final_install.log | cut -d" " -f1` -gt 20 ]; then
     head   final_install.log
     tail   final_install.log
else cat    final_install.log
fi
echo

#
# Creating new info dir file (if applicable)
#
if [ -e /usr/share/info/dir.Overwritten_By_${PACKAGE_NAME} ]; then
    OLDPATH=${PWD}
    cd /usr/share/info
    echo "The current path is ${PWD}"
    echo "Moving old 'dir' file and dir.Overwritten_By file"; echo

    mv -v dir \
          ${OLDPATH}/../${PACKAGE_LOGDIR}                         
>>${OLDPATH}/fix_info_dir_file.log 2>&1
    testcommand "Moving info dir                file"
    mv -v dir.Overwritten_By_${PACKAGE_NAME} \
          ${OLDPATH}/../${PACKAGE_LOGDIR}                         
>>${OLDPATH}/fix_info_dir_file.log 2>&1
    testcommand "Moving info dir.Overwritten... file"

    echo; echo "Creating new 'dir' file"
    for FILENAME in *; do
        if [ -e /tmp/install-info.error ]; then rm -f /tmp/install-info.error; 
fi
        echo "Installing ${FILENAME}"                             
>>${OLDPATH}/fix_info_dir_file.log 2>&1
        install-info ${FILENAME} dir 2>/tmp/install-info.error
        if [ $? != 0 ]; then
            grep -q " already exists, for file " /tmp/install-info.error
            if [ $? != 0 ]; then
                echo "Problem adding ${FILENAME}"
                echo "Problem adding ${FILENAME}"                 
>>${OLDPATH}/fix_info_dir_file.log 2>&1
            else
                cat /tmp/install-info.error                       
>>${OLDPATH}/fix_info_dir_file.log 2>&1
            fi
        fi
    done
    grep -q "^Problem adding" ${OLDPATH}/fix_info_dir_file.log
    if [ $? = 0 ]; then echo; echo; echo; echo "There were problems creating 
the info dir file"; echo; fi

    ls -l dir; echo
    cd ${OLDPATH}
else
    echo "${PACKAGE_NAME} package did not have a /usr/share/info/dir file"; echo
fi

#
# Remove the owerwritten files
#
if [ -s overwrite_files.log ]; then
    getinput "Move the old overwritten files? (Y/N)" "Y"
    if [ $userinput != "y" -a $userinput != "Y" ]; then userabort; fi

    for FILENAME in `cat overwrite_files.log`; do
        if   [ ${FILENAME} = "/usr/share/info/dir" ]; then
            echo "Skipping ${FILENAME}"
            echo "Skipping ${FILENAME}"                      
>>move_overwrittens.log 2>&1
        else
            mv -v ${FILENAME}.Overwritten_By_${PACKAGE_NAME} \
                  ../${PACKAGE_LOGDIR}                       
>>move_overwrittens.log 2>&1
            testcommand "Moving ${FILENAME}"
        fi
    done
fi

-- 
http://linuxfromscratch.org/mailman/listinfo/lfs-dev
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page

Reply via email to