ViitorMake/functions/functions
kueller 12b322bfe5 Neue Funktionen GenDynLib und GenDynLib32.
Die Funktionen erzeugen aus lib*.a eine Dynamische Libs, sowie die passenden Links dazu.
Argumente: GenDynLib <Abs. Path and name to StaticLib> <LibVersion>
die Lib wird im Pfad der Staticlib erzeugt.



git-svn-id: svn://svn.compuextreme.de/Viitor/V962/ViitorMake@4702 504e572c-2e33-0410-9681-be2bf7408885
2009-05-19 07:36:00 +00:00

703 lines
16 KiB
Bash

#!/bin/bash
#Framework, welches ein komplettes Linux System aus den Sourcen erstellt
#dieses Framework wird im CVS Repository
#:pserver:cvs.tramp-bbs.de:/opt/cvs zur Verfügung gestellt
#
#Lage dieser Datei im Archiv: $HeadURL$
#
#(c) 2007 Harald Kueller, Germany
#This program is free software; you can redistribute it and/or
#modify ist under the terms of the GNU General Public License
#as published by the Free Software Foundation; either version
#2 of the License, or (at your option) any later version.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#See the GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program; if not write to the Free Software Foundation,
#Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
#Beschreibung:
#Funktionssammlung für genpkg script des ViitorMake Frameworks
#
#checkError():
#Beschreibung: Ueberpruefen des zuletzt gelaufenen Befehls. Bei Erfolgreicher
# Beendigung des Befehls wir keine Aktion vorgenommen.
# Ansonsten Ausgabe der Fehlermeldung <MESSAGE>, Aufräumen mit
# cleanup Funktion, und Beenden des Scriptes
#Argumente: MESSAGE
#MESSAGE : Auszugebene Fehlermeldung
#
#
#CleanUp():
#Beschreibung: Aufräumen des Systemes nach Erstellung eines Packetes, oder
#bei Abbruch des genpkg scriptes
#
#Argumente: Keine
#Steuervariablen: Diese Variablen muessen zum Aufrufzeitpunkt gesetzt sein
# und haben folgende Bedeutung:
#CLEANUP_FLAGS : 1=MAKEDIR aufräumen
# 2=TMPROOT aufräumen
#PROGNAME : Name des Programmpacketes, welches gerade
# erstellt wurde
#TMPROOT : Verzeichniss in welchem die binär
# Dateien zur Erstellung von Packeten
# erstellt werden.
#MAKEDIR : Verzeichniss in welchem die Sourcen
# Entpackt und Übersetzt werden
#
#
#GetSuffix()
#
#Beschreibung : Ermittlung des Datei Suffixes. Datei Suffix wird auf
# : stdout ausgegeben
#
#Argumente : FILENAME
#FILENAME : Name des Files, von welchem der Datei Suffix ermittelt
# : werden soll
#
#
#SrcPatch()
#Beschreibung : Anwenden eines Patches auf ein Verzeichniss (Recursiv)
#Argumente : DSTPATH, PATCHFILE
#DSTPATH : Verzeichniss in welchem der Patch angewendet werden soll
#PATCHFILE : Patchdatei die verwendet werden soll (nicht, gzip oder bzip2
# : comprimiert)
#
#UnPack()
#Beschreibung : Entpacken von tar Archiven. Dabei wird automatisch erkannt
# ob die Archive gzip, bzip2 oder gar nicht comprimiert sind
# und die entsprechend notwendigen Tar Optionen ermittelt
#Argumente : DSTPATH; FILENAME
#DSTPATH : Zielverzeichniss, in welchem das Archiv <FILENAME> entpackt
# werden soll.
#FILENAME : Dateiname des Archives welches nach <DSTPATH> entpackt werden
# soll
#
#ArchiveName()
#Beschreibung : Generiert den pkgname aus den Namen eines source Archives
# Der pkgname wird auf stdout ausgegeben
#Argumente : $FILENAME
#FILENAME : Name des SOURCE Archives
#
#
#GetSVN()
#Beschreibung : Einspielen eines SVN Projectes (Add On zu erstellten pkgs)
# in den pkgtree
#Steuervariablen: SVNURL
#CVSROOT : Angabe des Repositorys in welchem das Project zu finden ist
#
#Argumente : CVSPROJ, PKGROOT
#CVSPROJ : Name eines Projectes
#PKGROOT : Zielverzeichniss, in welchem das pkg entpackt vorliegt
#
#Argumente : CVSPROJ, PKGROOT
#CVSPROJ : Name eines Projectes
#PKGROOT : Zielverzeichniss, in welchem das pkg entpackt vorliegt
#
#
#GenDependics()
#Beschreibung : Abhängigkeiten zu anderen Programmpacketen ermitteln
# mit ldd werden sämtliche executable Dateien eines
# PKGROOT Verzeichnisses auf Abhängigkeiten untersucht. Aus
# Anhand der Ermittelten Dateien wird mittels der Filelisten
# unter /var/install ermittelt welche Packete diese Dateien
# enthalten, und so eine liste der Packete von welchen
# die files unter PKGROOT abhängig sind, erstellt.
#Argumente : PKGROOT
#PKGROOT : Verzeichniss in welchem die Abhängigkeiten ermittelt werden
# sollen
#
#StripPkg()
#Beschreibung : Entfernt unnötigen debugging overhead aus frisch übersetzten
# binarys. Die Funktion wirkt auf alle in einem Verzeichniss
# befindlichen executable files.
#Argumente : PKGPATH
#PKGPATH Verzeichniss in welchem die Binarys "gestript" werden sollen
#
#GetFlags()
#Beschreibung : rechnet einen ASCI Rechte String (drwsrwsrwt) in die
# entsprechende 4 stellige Octalziffer um
#Argumente : Rechte String in ASCII
#
#Letzte Änderung von: $Author$
#Datum der letzten Änderung: $Date$
#Version der Datei: $Revision$
#
#
CheckError() {
MESSAGE=$1
if [ ! "$?" == 0 ]; then
echo $MESSAGE
CleanUp
exit 1
fi
}
CleanUp() {
(( TESTFLAG = $CLEANUP_FLAGS & 1 ))
if [ ! "$TESTFLAG" == "0" ]; then
rm -r $MAKEDIR/$SRCDIR*
fi
(( TESTFLAG = $CLEANUP_FLAGS & 2 ))
if [ ! "$TESTFLAG" == "0" ]; then
rm -r $TMPROOT
if [ -d "$MANTMPROOT" ]; then
rm -r $MANTMPROOT
fi
if [ -d "$DEVTMPROOT" ]; then
rm -r $DEVTMPROOT
fi
fi
(( TESTFLAG = $CLEANUP_FLAGS & 4 ))
if [ ! "$TESTFLAG" == "0" ]; then
InstallOldKernelh 0
fi
(( TESTFLAG = $CLEANUP_FLAGS & 8 ))
if [ ! "$TESTFLAG" == "0" ]; then
UseOldGcc 0
fi
(( TESTFLAG = $CLEANUP_FLAGS & 16 ))
if [ ! "$TESTFLAG" == "0" ]; then
rm /usr/X11R6
fi
(( TESTFLAG = $CLEANUP_FLAGS & 32 ))
if [ ! "$TESTFLAG" == "0" ]; then
Fix_Input_h 0
fi
(( TESTFLAG = $CLEANUP_FLAGS & 64 ))
if [ ! "$TESTFLAG" == "0" ]; then
PKG_CONFIG_PATH=$STOREPKG_CONFIG_PATH
fi
if [ -d /usr/include/linux.orig ]; then
rm /usr/include/linux
mv /usr/include/linux.orig /usr/include/linux
fi
return 0
}
GetSuffix() {
FILENAME=$1
echo $1|awk -F. '{ print $NF }'
}
SrcPatch() {
DSTPATH=$1
PATCHFILE=$2
cd $DSTPATH
SUFFIX=`GetSuffix $PATCHFILE`
PATCHNAME=`echo $PATCHFILE|sed -e "s/\.$SUFFIX.*$//"`
case $SUFFIX in
gz)
gzip -d $PATCHFILE
CheckError "Could not ungzip $PATCHFILE"
;;
bz2)
bzip2 -d $PATCHFILE
CheckError "Could not unbzip2 $PATCHFILE"
;;
*)
PATCHNAME=$PATCHFILE
SUFFIX=bzip2
;;
esac
patch -Np1 -i $PATCHNAME
CheckError "Patch $PATCHNAME failed"
case $SUFFIX in
gz)
gzip $PATCHNAME
CheckError "Compression of $PATCHNAME with gzip failed"
;;
bz2)
bzip2 $PATCHNAME
CheckError "Compression of $PATCHNAME with bzip2 failed"
;;
esac
cd -
}
UnPack() {
DSTPATH=$1
FILENAME=$2
SUFFIX=`GetSuffix $FILENAME`
if [ "$SUFFIX" ]; then
case "$SUFFIX" in
gz|tgz|Z)
TAROPTS="zxvf"
;;
bz2|tbz)
if ( tar --version|grep 1.13.25 >/dev/null 2>&1 ); then
TAROPTS="jxvf"
else
TAROPTS="jxvf"
fi
;;
tar)
TAROPTS="xvf"
;;
*)
echo "Unknown Suffix for unpack()"
return 1
;;
esac
cd $DSTPATH
tar $TAROPTS $FILENAME
CheckError "Unpack of $FILENAME failed"
cd - >/dev/null
fi
return 0
}
ArchiveName() {
FILENAME=$1
SUFFIX=`GetSuffix $FILENAME`
BASENAME=`echo $FILENAME|sed -e "s/\.$SUFFIX.*$//"`
SUFFIX=`GetSuffix $BASENAME`
if [ "$SUFFIX" == "tar" ]; then
BASENAME=`echo $BASENAME|sed -e "s/\.$SUFFIX.*$//"`
fi
BASENAME=`basename $BASENAME`
ARCHIVENAME=`echo $BASENAME|sed -e "s/src/bin/"|sed -e "s/SRC/BIN/"| \
sed -e "s/source/binary/"|sed -e "s/SOURCE/BINARY/"`
echo $ARCHIVENAME.tbz
}
GetSVN() {
CDIR=`pwd`
SVNPROJ=$1
PKGROOT=$2
export ADDONPROJEKT=$1
mkdir /tmp/svntmp$$
cd /tmp/svntmp$$
if [ "$CVSASK" ]; then
echo "Zugriff auf $SVNURL wird benötigt"
echo "Bitte Internetverbindung herstellen"
echo "und beliebige Taste drücken"
read
fi
svn co $SVNURL/$SVNPROJ
cd $SVNPROJ
ADDONVERSION=`svn info .|grep Revision|awk '{print $2}'`
find . -name ".svn" -type d -exec rm -r {} \;
for i in `find . -type d`; do
case $i in
./etc)
chmod 644 `find etc -type f`
;;
./etc/init.d)
chmod 755 `find etc/init.d -type f`
;;
./etc/sysconfig)
chmod 644 `find etc/sysconfig -type f`
;;
./etc/sysconfig/profile.d)
chmod 755 `find etc/sysconfig/profile.d -type f`
;;
./locale)
for i in locale/*; do
BASE=`basename $i|cut -d "." -f 1`
CO=`basename $i|cut -d "." -f 3`
DSTDIR=$PKGROOT/usr/share/locale/$CO/LC_MESSAGES
if [ ! -d $DSTDIR ]; then
mkdir -p $DSTDIR
fi
msgfmt $i -o $DSTDIR/$BASE.mo
done
rm -r locale
;;
esac
done
if [ -f init/genpkg ]; then
source init/genpkg
rm -r init
fi
cp -rp * $PKGROOT
cd $CDIR
rm -r /tmp/svntmp$$
}
GenDependics() {
PKGROOT=$1
cd $PKGROOT
if [ -f /tmp/lddlist_tmp$$ ]; then
rm /tmp/lddlist_tmp$$
fi
if [ -f /tmp/lddlist$$ ]; then
rm /tmp/lddlist$$
fi
for execfile in `find -type f ! -type l -perm -u+rx,g+rx`; do
if file $execfile |grep "LSB executable" &>/dev/null; then
ldd $execfile|\
sed -e "/not a dynamic/d"|\
awk '{print $1}' >>/tmp/lddlist_tmp$$
elif file $execfile|grep "LSB shared object" &>/dev/null; then
ldd $execfile|\
sed -e "/not a dynamic/d"|\
awk '{print $1}' >>/tmp/lddlist_tmp$$
fi
done
if [ -f /tmp/lddlist_tmp$$ ]; then
cat /tmp/lddlist_tmp$$|sort -u >/tmp/lddlist$$
rm /tmp/lddlist_tmp$$
for i in `cat /tmp/lddlist$$`; do
grep "FN=$i;" $ROOT/var/install/contents|awk -F";" '{print $1}'|sed -e "s/PN=//" >>/tmp/packagelist$$
done
rm /tmp/lddlist$$
sort -u /tmp/packagelist$$
rm /tmp/packagelist$$
fi
cd - >/dev/null
}
StripPkg() {
PKGROOT=$1
cd $PKGROOT
for checkfile in `find . -perm -1 -type f `; do
if file $checkfile|grep "LSB executable" &>/dev/null; then
strip --strip-all $checkfile
elif file $checkfile|grep "LSB shared object" &>/dev/null; then
strip $checkfile
fi
done
cd -
}
ClearHostSysNameing32() {
DESTDIR=$1
CURDIR=`pwd`
cd $DESTDIR
for i in `find . -name "$TARGET32*"`; do
NEWNAME=`basename $i`
PATHNAME=`dirname $i`
NEWNAME=`echo $NEWNAME|sed -e "s/$TARGET32-//"`
mv $i $PATHNAME/$NEWNAME
done
find . -type l -ls|grep $TARGET32 >/tmp/linklist$$
exec 3</tmp/linklist$$
read <&3 LINE
while [ "$LINE" ]; do
LINKTO=`echo $LINE|awk '{print $13}'|sed -e "s/$TARGET32-//"`
LINKFROM=`echo $LINE|awk '{print $11}'`
FILELINK=`basename $LINKFROM`
DIRLINK=`dirname $LINKFROM`
cd $DIRLINK
rm $FILELINK
ln -s $LINKTO $FILELINK
cd -
read <&3 LINE
done
exec 3>&-
rm /tmp/linklist$$
for i in `find . -type l -ls|grep $HOSTSYS`; do
LINTO=`echo $i|awk '{print $10}'`
echo $LINTO
done
cd $CURDIR
}
ClearHostSysNameing() {
DESTDIR=$1
CURDIR=`pwd`
cd $DESTDIR
for i in `find . -name "$TARGET*"`; do
NEWNAME=`basename $i`
PATHNAME=`dirname $i`
NEWNAME=`echo $NEWNAME|sed -e "s/$TARGET-//"`
mv $i $PATHNAME/$NEWNAME
done
find . -type l -ls|grep $TARGET >/tmp/linklist$$
exec 3</tmp/linklist$$
read <&3 LINE
while [ "$LINE" ]; do
LINKTO=`echo $LINE|awk '{print $13}'|sed -e "s/$TARGET-//"`
LINKFROM=`echo $LINE|awk '{print $11}'`
FILELINK=`basename $LINKFROM`
DIRLINK=`dirname $LINKFROM`
cd $DIRLINK
rm $FILELINK
ln -s $LINKTO $FILELINK
cd -
read <&3 LINE
done
exec 3>&-
rm /tmp/linklist$$
for i in `find . -type l -ls|grep $HOSTSYS`; do
LINTO=`echo $i|awk '{print $10}'`
echo $LINTO
done
cd $CURDIR
}
MakeCheck() {
if [ "$CHECK" == "true" ]; then
make $*
fi
}
RestoreOpt() {
CFLAGS=$STCFLAGS
STCXXFLAGS=$CXXFLAGS
unset STCFLAGS STCXXFLAGS
}
CleanTextFiles() {
cd $TMPROOT
for i in `find . -type f`; do
sed -i -e "s%$TMPROOT%%" $i
done
cd -
}
CheckFlag() {
FLAG=$1
CHECK=$2
(( CHECKFLAG = $FLAG & $CHECK ))
if [ $CHECKFLAG == 0 ]; then
return 1
else
return 0
fi
}
GetFlags() {
RightString=$1
ReadBit[1]=`echo $1|cut -c2`
WriteBit[1]=`echo $1|cut -c3`
ExecBit[1]=`echo $1|cut -c4`
ReadBit[2]=`echo $1|cut -c5`
WriteBit[2]=`echo $1|cut -c6`
ExecBit[2]=`echo $1|cut -c7`
ReadBit[3]=`echo $1|cut -c8`
WriteBit[3]=`echo $1|cut -c9`
ExecBit[3]=`echo $1|cut -c10`
unset SetUID
for i in 1 2; do
if [ "${ExecBit[$i]}" == "s" ]; then
SetUID[$i]=1
ExecBit[$i]="x"
fi
if [ "${ExecBit[$i]}" == "S" ]; then
SetUID[$i]=1
ExecBit[$i]="-"
fi
done
if [ "${ExecBit[3]}" == "t" ]; then
SetUID[3]=1
ExecBit[3]="x"
fi
if [ "${ExecBit[3]}" == "T" ]; then
SetUID[3]=1
ExecBit[3]="-"
fi
NumSUID=0
AddSUID=1
for i in 3 2 1; do
if [ "${SetUID[$i]}" == "1" ]; then
(( NumSUID = $NumSUID + $AddSUID ))
fi
(( AddSUID = $AddSUID + $AddSUID ))
done
NumUID=`Asc2Oct ${ReadBit[1]} ${WriteBit[1]} ${ExecBit[1]}`
NumGID=`Asc2Oct ${ReadBit[2]} ${WriteBit[2]} ${ExecBit[2]}`
NumOTH=`Asc2Oct ${ReadBit[3]} ${WriteBit[3]} ${ExecBit[3]}`
echo "$NumSUID$NumUID$NumGID$NumOTH"
}
Asc2Oct() {
ReadBit=$1
WriteBit=$2
ExecBit=$3
NumRight=0
if [ "$ExecBit" == "x" ]; then
(( NumRight = $NumRight + 1 ))
fi
if [ "$WriteBit" == "w" ]; then
(( NumRight = $NumRight + 2 ))
fi
if [ "$ReadBit" == "r" ]; then
(( NumRight = NumRight + 4 ))
fi
echo $NumRight
}
MakeMgtFiles() {
FilePrefix=$1
find . -type f ! -type l -exec md5sum {} \;|\
sed -e "s/\.\//\//" >$TMPROOT/../$$/$FilePrefix.md5
find . -type d -ls|\
awk '{ if ( $11 != "." ) print $3,$5,$6,$11 }' |\
sed -e "s/\.\//\//" >/tmp/DirRight$$.$FilePrefix
exec 3</tmp/DirRight$$.$FilePrefix
while read <&3 RIGHTS USERID GROUPID NAME; do
echo "$NAME `GetFlags $RIGHTS` $USERID $GROUPID"
done >$TMPROOT/../$$/$FilePrefix.drg
exec 3>&-
find . -type f -ls|\
awk '{ print $3,$5,$6,$11 }' |\
sed -e "s/\.\//\//" >/tmp/FileRight$$.$FilePrefix
find . -type l -ls|\
awk '{ print $3,$5,$6,$11 }' |\
sed -e "s/\.\//\//" >>/tmp/FileRight$$.$FilePrefix
exec 3</tmp/FileRight$$.$FilePrefix
while read <&3 RIGHTS USERID GROUPID NAME; do
echo "$NAME `echo $RIGHTS|cut -c1` `GetFlags $RIGHTS` $USERID $GROUPID"
done >$TMPROOT/../$$/$FilePrefix.frg
exec 3>&-
rm /tmp/DirRight$$.$FilePrefix
rm /tmp/FileRight$$.$FilePrefix
}
X11R7_Fix() {
(( CLEANUP_FLAGS = $CLEANUP_FLAGS | 16 ))
cd /usr
ln -s X11R7 X11R6
cd -
}
SetConfig() {
SELECT=$1
case $SELECT in
32)
(( CLEANUP_FLAGS = $CLEANUP_FLAGS | 64 ))
STOREPKG_CONFIG_PATH=$PKG_CONFIG_PATH
PKG_CONFIG_PATH=`echo $STOREPKG_CONFIG_PATH|sed "s/lib64/lib/g"`
UARCH=32
LIBDIR=lib
;;
64)
(( CLEANUP_FLAGS = $CLEANUP_FLAGS | 64 ))
STOREPKG_CONFIG_PATH=$PKG_CONFIG_PATH
PKG_CONFIG_PATH=`echo $STOREPKG_CONFIG_PATH|sed "s/lib/lib64/g"`
UARCH=64
LIBDIR=lib64
;;
*)
PKG_CONFIG_PATH=$STOREPKG_CONFIG_PATH
;;
esac
}
MakeFifo() {
TMPFILE=`mktemp`
rm $TMPFILE
mkfifo --mode=600 $TMPFILE
echo $TMPFILE
return 0
}
ExecCommand() {
CMDNUM=$1
echo "$CMDNUM" >&8
while true; do
COMMAND=`cat ${CMDF[${CMDNUM}]}`
IFS=";"
for i in `echo $COMMAND|awk -F" && " '{print $1";"$2";"$3";"$4";"$5";"$6 }'`; do
unset IFS
if [[ "$i" == *wshutdown* ]]; then
rm ${CMDF[${CMDNUM}]}
return 0
fi
$i
IFS=";"
done
echo "$CMDNUM" >&8
done
}
InitDispatch() {
FREEF=`MakeFifo`
exec 8<>$FREEF
EXECPROCNUM=$NUMCPU
if [ ! $EXECPROCNUM ]; then
EXECPROCNUM=1
fi
NUMCMD=1
while [ ${NUMCMD} -le $EXECPROCNUM ]; do
CMDF[$NUMCMD]=`MakeFifo`
ExecCommand $NUMCMD&
(( NUMCMD++ ))
done
}
DispatchCMD() {
read <&8 FREE
NUM=1
while [ "$1" ]; do
if [ "$NUM" == "1" ]; then
CMDALL="$1"
NUM=0
else
CMDALL=$CMDALL" && $1"
fi
shift
done
echo $CMDALL >${CMDF[${FREE}]}
}
EndDispatch() {
NUMCMD=1
EXECPROCNUM=$NUMCPU
while [ ${NUMCMD} -le $EXECPROCNUM ]; do
cat >${CMDF[${NUMCMD}]} <<EOF
wshutdown
EOF
(( NUMCMD++ ))
done
wait
exec 8<&-
rm $FREEF
}
GenDynLib32() {
STATLIB=$1
DYNLIBVER=$2
BASEVER=`echo $DYNLIBVER|awk -F"." '{print $1}'`
LIBNAME=`basename $1|sed -e "s/\.a$//"`
DYNLIBDIR=`dirname $STATLIB`
echo "Generating Dynamic Lib $LIBNAME.so.$DYNLIBVER. BaseVersion = $BASEVER"
mkdir /tmp/libgen$$
cd /tmp/libgen$$
ar -x $STATLIB
gcc $BUILDOPTIONS32 -shared -Wl,-soname,$LIBNAME.so.$BASEVER -o $DYNLIBDIR/$LIBNAME.so.$DYNLIBVER
ln -s $LIBNAME.so.$DYNLIBVER $DYNLIBDIR/$LIBNAME.so.$BASEVER
ln -sf $LIBNAME.so.$DYNLIBVER $DYNLIBDIR/$LIBNAME.so
cd -
rm -r /tmp/libgen$$
}
GenDynLib() {
STATLIB=$1
DYNLIBVER=$2
BASEVER=`echo $DYNLIBVER|awk -F"." '{print $1}'`
LIBNAME=`basename $1|sed -e "s/\.a$//"`
DYNLIBDIR=`dirname $STATLIB`
echo "Generating Dynamic Lib $LIBNAME.so.$DYNLIBVER. BaseVersion = $BASEVER"
mkdir /tmp/libgen$$
cd /tmp/libgen$$
ar -x $STATLIB
gcc $BUILDOPTIONS -shared -Wl,-soname,$LIBNAME.so.$BASEVER -o $DYNLIBDIR/$LIBNAME.so.$DYNLIBVER
ln -s $LIBNAME.so.$DYNLIBVER $DYNLIBDIR/$LIBNAME.so.$BASEVER
ln -sf $LIBNAME.so.$DYNLIBVER $DYNLIBDIR/$LIBNAME.so
cd -
rm -r /tmp/libgen$$
}