haiku/build/scripts/build_haiku_image
François Revol ef9aa9a756 Finally got a fix for attribute errors when building on linux without xattr.
After copying the mime db or packages the files were removed, but not the corresponding attribute storage files.
So when an inode got reused the file inherited those leftover attributes.
We now remove them before removing the files.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22940 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-11-17 22:26:17 +00:00

209 lines
4.5 KiB
Bash
Executable File

#!/bin/sh
# The first argument is the shell script that initializes the variables:
# sourceDir
# outputDir
# tmpDir
# installDir
# isImage
# imagePath
# imageSize
# addBuildCompatibilityLibDir
# sourceDirsToCopy
# updateOnly
# dontClearImage
#
# bfsShell
# copyattr
# fsShellCommand
# makebootable
# resattr
# rc
# unzip
#
if [ $# -gt 0 ]; then
. $1
shift
fi
# this adds the build library dir to LD_LIBRARY_PATH
eval "$addBuildCompatibilityLibDir"
# map the shell commands
if [ $isImage ]; then
sPrefix=:
tPrefix=/myfs/
cd="$fsShellCommand cd"
scd="$fsShellCommand cd"
cp="$fsShellCommand cp"
copyAttrs="$fsShellCommand cp -a"
ln="$fsShellCommand ln"
mkdir="$fsShellCommand mkdir"
rm="$fsShellCommand rm"
mkindex="$fsShellCommand mkindex"
else
sPrefix=
# TODO: This should come from the environment.
tPrefix="$installDir/"
cd=cd
scd=:
cp="$copyattr -d"
copyAttrs="$copyattr"
ln=ln
mkdir=mkdir
rm=rm
mkindex=mkindex
fi
# attribute-safe rm -rf
# This makes sure there are no leftover attribute file before removing each file
attrrmrf()
{
test -e "$1" || return
find "$1" -print0 | xargs -0 stat -c %i | awk "{ print \"$outputDir/attributes/\" \$1 }" | xargs rm -rf
rm -rf "$1"
}
unzipFile()
{
# unzipFile <archive> <directory>
zipFile=$1
targetUnzipDir=$2
echo "Unzipping $zipFile ..."
if [ $isImage ]; then
unzipDir=$tmpDir/unzip
attrrmrf $unzipDir
mkdir -p $unzipDir
$unzip -q -d $unzipDir $zipFile
$cp -r ${sPrefix}$unzipDir/. ${tPrefix}$targetUnzipDir
attrrmrf $unzipDir
else
$unzip -q -d ${tPrefix}$targetUnzipDir ${sPrefix}$zipFile
fi
}
# create the image and mount it
if [ $isImage ]; then
echo
if [ ! $updateOnly ]; then
echo "Creating image ..."
if [ ! -e $imagePath -o ! "$dontClearImage" ]; then
dd if=/dev/zero of=$imagePath bs=1048576 count=$imageSize
fi
$bfsShell --initialize $imagePath Haiku
$makebootable $imagePath
fi
$bfsShell -n $imagePath > /dev/null &
sleep 1
fi
# create BEOS:APP_SIG index -- needed to launch apps via signature
if [ ! $updateOnly ]; then
$mkindex BEOS:APP_SIG
fi
echo "Populating image ..."
while [ $# -gt 0 ]; do
. $1
shift
done
# install MIME database
# TODO: It should be possible to do that in the build system too.
if [ ! $updateOnly ]; then
mimeDBSource=$sourceDir/src/data/beos_mime
mimeDBDest=${tPrefix}home/config/settings/beos_mime
echo "Deleting old MIME database ..."
$rm -rf $mimeDBDest
$mkdir -p $mimeDBDest
mkdir -p $tmpDir
mimeTmpDir=$tmpDir/mime
mimeTmpIndex=0
# create tmp dir for the MIME conversion stuff
mkdir -p $mimeTmpDir
echo "Installing MIME database ..."
for inSuperFile in $mimeDBSource/*.super; do
superType=$(basename $inSuperFile .super)
outSuperDir=$mimeDBDest/$superType
# compile rdef to rsrc file and the rsrc file to attributes
mimeTmpIndex=$(($mimeTmpIndex + 1))
tmpFile=$mimeTmpDir/mimedb$$_${mimeTmpIndex}.rsrc
tmpFile2=$mimeTmpDir/mimedb$$_${mimeTmpIndex}.mime
$rc -o $tmpFile $inSuperFile
mkdir -p $tmpFile2
$resattr -O -o $tmpFile2 $tmpFile
$cp -r ${sPrefix}$tmpFile2 $outSuperDir
# iterate through the sub types
for inSubFile in $mimeDBSource/$superType/*; do
# check, if the type exists
if test -f $inSubFile && grep META:TYPE $inSubFile > /dev/null 2>&1 ; then
subType=$(basename $inSubFile)
outSubFile=$outSuperDir/$subType
# compile rdef to rsrc file and the rsrc file to attributes
mimeTmpIndex=$(($mimeTmpIndex + 1))
tmpFile=$mimeTmpDir/mimedb$$_${mimeTmpIndex}.rsrc
tmpFile2=$mimeTmpDir/mimedb$$_${mimeTmpIndex}.mime
$rc -o $tmpFile $inSubFile
$resattr -O -o $tmpFile2 $tmpFile
$cp ${sPrefix}$tmpFile2 $outSubFile
fi
done
done
# cleanup tmp dir
attrrmrf $mimeTmpDir
fi # ! updateOnly
# install sources
sourcesDest=${tPrefix}home/HaikuSources
# create sources directory
if [ -n "${sourceDirsToCopy}" ]; then
echo "Installing Haiku Sources ..."
$mkdir -p ${sourcesDest}
fi
for sourcesDir in ${sourceDirsToCopy}; do
echo " sources dir: ${sourcesDir}"
# create all subdirectories
subDirs=$(find ${sourcesDir} -type d | grep -v '.svn' |
sed -e "s@^${sourceDir}@${sourcesDest}@")
$mkdir -p ${subDirs}
# get all files and copy each one individually
sourceFiles=$(find $sourcesDir -type f | grep -v '.svn')
for sourceFile in $sourceFiles; do
destSourceFile=$(echo $sourceFile |
sed -e "s@^${sourceDir}@${sourcesDest}@")
$cp ${sPrefix}$sourceFile $destSourceFile
done
done
# unmount
if [ $isImage ]; then
echo "Unmounting ..."
$fsShellCommand sync
$fsShellCommand quit
fi