Files
bpfire/make.sh
ms 6233f08fa9 OpenH323 hinzugefügt
git-svn-id: http://svn.ipfire.org/svn/ipfire/trunk@72 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8
2006-02-27 17:13:57 +00:00

1025 lines
34 KiB
Bash

#!/bin/bash
#
############################################################################
# #
# This file is part of the IPCop Firewall. #
# #
# IPCop is free software; you can redistribute it and/or modify #
# it 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. #
# #
# IPCop 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 IPCop; if not, write to the Free Software #
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
# #
# Copyright (C) 2001 Mark Wormgoor <mark@wormgoor.com>. #
# #
# (c) 2001 Eric S. Johansson <esj@harvee.billerica.ma.us> Check for Bash #
# (c) 2002 Thorsten Fischer <frosch@cs.tu-berlin.de> MD5Sum checking #
# #
############################################################################
#
# $Id: make.sh,v 1.129.2.145 2006/02/01 07:04:09 gespinasse Exp $
#
NAME="IPFire" # Software name
SNAME="ipfire" # Short name
VERSION="1.4" # Version number
PREVIOUSTAG=IPCOP_v1_4_10_FINAL
SLOGAN="We save your network" # Software slogan
CONFIG_ROOT=/var/ipfire # Configuration rootdir
NICE=10
MAX_RETRIES=3 # prefetch/check loop
KVER=`grep --max-count=1 VER lfs/linux | awk '{ print $3 }'`
MACHINE=`uname -m`
# Debian specific settings
if [ ! -e /etc/debian_version ]; then
FULLPATH=`which $0`
else
if [ -x /usr/bin/realpath ]; then
FULLPATH=`/usr/bin/realpath $0`
else
echo "ERROR: Need to do apt-get install realpath"
exit 1
fi
fi
PWD=`pwd`
BASENAME=`basename $0`
BASEDIR=`echo $FULLPATH | sed "s/\/$BASENAME//g"`
LOGFILE=$BASEDIR/log/_build.preparation.log
export BASEDIR LOGFILE
DIR_CHK=$BASEDIR/cache/check
mkdir $BASEDIR/log/ 2>/dev/null
if [ 'x86_64' = $MACHINE -o 'i686' = $MACHINE -o 'i586' = $MACHINE -o 'i486' = $MACHINE -o 'i386' = $MACHINE ]; then
echo "`date -u '+%b %e %T'`: Machine is ix86 (or equivalent)" | tee -a $LOGFILE
MACHINE=i386
BUILDTARGET=i386-pc-linux-gnu
CFLAGS="-O2 -mcpu=i386 -march=i386 -pipe -fomit-frame-pointer"
CXXFLAGS="-O2 -mcpu=i386 -march=i386 -pipe -fomit-frame-pointer"
elif [ 'alpha' = $MACHINE ]; then
echo "`date -u '+%b %e %T'`: Machine is Alpha AXP" | tee -a $LOGFILE
BUILDTARGET=alpha-unknown-linux-gnu
CFLAGS="-O2 -mcpu=ev4 -mieee -pipe"
CXXFLAGS="-O2 -mcpu=ev4 -mieee -pipe"
else
echo "`date -u '+%b %e %T'`: Can't determine your architecture - $MACHINE" | tee -a $LOGFILE
exit 1
fi
# Define immediately
stdumount() {
umount $BASEDIR/build/dev/pts 2>/dev/null;
umount $BASEDIR/build/proc 2>/dev/null;
umount $BASEDIR/build/install/mnt 2>/dev/null;
umount $BASEDIR/build/usr/src/cache 2>/dev/null;
umount $BASEDIR/build/usr/src/ccache 2>/dev/null;
umount $BASEDIR/build/usr/src/config 2>/dev/null;
umount $BASEDIR/build/usr/src/doc 2>/dev/null;
umount $BASEDIR/build/usr/src/html 2>/dev/null;
umount $BASEDIR/build/usr/src/langs 2>/dev/null;
umount $BASEDIR/build/usr/src/lfs 2>/dev/null;
umount $BASEDIR/build/usr/src/log 2>/dev/null;
umount $BASEDIR/build/usr/src/src 2>/dev/null;
}
exiterror() {
stdumount
for i in `seq 0 7`; do
if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
losetup -d /dev/loop${i} 2>/dev/null
fi;
done
echo "ERROR: $*"
echo " Check $LOGFILE for errors if applicable"
exit 1
}
entershell() {
if [ ! -e $BASEDIR/build/usr/src/lfs/ ]; then
exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/"
fi
echo "Entering to a shell inside LFS chroot, go out with exit"
chroot $LFS /tools/bin/env -i HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
VERSION=$VERSION CONFIG_ROOT=$CONFIG_ROOT \
NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" \
CCACHE_DIR=/usr/src/ccache \
CCACHE_HASHDIR=1 \
KVER=$KVER \
BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \
KGCC="ccache /usr/bin/gcc" \
/tools/bin/bash
if [ $? -ne 0 ]; then
exiterror "chroot error"
else
stdumount
fi
}
prepareenv() {
############################################################################
# #
# Are we running the right shell? #
# #
############################################################################
if [ ! "$BASH" ]; then
exiterror "BASH environment variable is not set. You're probably running the wrong shell."
fi
if [ -z "${BASH_VERSION}" ]; then
exiterror "Not running BASH shell."
fi
############################################################################
# #
# Trap on emergency exit #
# #
############################################################################
trap "exiterror 'Build process interrupted'" SIGINT SIGTERM SIGKILL SIGSTOP SIGQUIT
############################################################################
# #
# Resetting our nice level #
# #
############################################################################
echo "`date -u '+%b %e %T'`: Resetting our nice level to $NICE" | tee -a $LOGFILE
renice $NICE $$ > /dev/null
if [ `nice` != "$NICE" ]; then
exiterror "Failed to set correct nice level"
fi
############################################################################
# #
# Checking if running as root user #
# #
############################################################################
echo "`date -u '+%b %e %T'`: Checking if we're running as root user" | tee -a $LOGFILE
if [ `id -u` != 0 ]; then
exiterror "Not building as root"
fi
############################################################################
# #
# Checking for necessary temporary space #
# #
############################################################################
echo "`date -u '+%b %e %T'`: Checking for necessary space on disk $BASE_DEV" | tee -a $LOGFILE
BASE_DEV=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $1 }'`
BASE_ASPACE=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $4 }'`
if (( 2202000 > $BASE_ASPACE )); then
BASE_USPACE=`du -skx $BASEDIR | awk '{print $1}'`
if (( 2202000 - $BASE_USPACE > $BASE_ASPACE )); then
exiterror "Not enough temporary space available, need at least 2.1GB on $BASE_DEV"
fi
fi
############################################################################
# #
# Building Linux From Scratch system #
# #
############################################################################
echo "`date -u '+%b %e %T'`: Building Linux From Scratch system" | tee -a $LOGFILE
# Set umask
umask 022
# Set LFS Directory
LFS=$BASEDIR/build
# Check /tools symlink
if [ -h /tools ]; then
rm -f /tools
fi
if [ ! -a /tools ]; then
ln -s $BASEDIR/build/tools /
fi
if [ ! -h /tools ]; then
exiterror "Could not create /tools symbolic link."
fi
# Setup environment
set +h
LC_ALL=POSIX
export LFS LC_ALL CFLAGS CXXFLAGS
unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD
# Make some extra directories
mkdir -p $BASEDIR/build/{tools,etc,usr/src} 2>/dev/null
mkdir -p $BASEDIR/{cache,ccache} 2>/dev/null
mkdir -p $BASEDIR/build/dev/pts $BASEDIR/build/proc $BASEDIR/build/usr/src/{cache,config,doc,html,langs,lfs,log,src,ccache}
# Make all sources and proc available under lfs build
mount --bind /dev/pts $BASEDIR/build/dev/pts
mount --bind /proc $BASEDIR/build/proc
mount --bind $BASEDIR/cache $BASEDIR/build/usr/src/cache
mount --bind $BASEDIR/ccache $BASEDIR/build/usr/src/ccache
mount --bind $BASEDIR/config $BASEDIR/build/usr/src/config
mount --bind $BASEDIR/doc $BASEDIR/build/usr/src/doc
mount --bind $BASEDIR/html $BASEDIR/build/usr/src/html
mount --bind $BASEDIR/langs $BASEDIR/build/usr/src/langs
mount --bind $BASEDIR/lfs $BASEDIR/build/usr/src/lfs
mount --bind $BASEDIR/log $BASEDIR/build/usr/src/log
mount --bind $BASEDIR/src $BASEDIR/build/usr/src/src
# Run LFS static binary creation scripts one by one
export CCACHE_DIR=$BASEDIR/ccache
export CCACHE_HASHDIR=1
# Remove pre-install list of installed files in case user erase some files before rebuild
rm -f $BASEDIR/build/usr/src/lsalr 2>/dev/null
}
############################################################################
# #
# Necessary shell functions #
# #
############################################################################
lfsmake1() {
if [ -f $BASEDIR/lfs/$1 ]; then
echo "`date -u '+%b %e %T'`: Building $*" | tee -a $LOGFILE
cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t " download >> $LOGFILE 2>&1
if [ $? -ne 0 ]; then
exiterror "Download error in $1"
fi
cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t md5sum" md5 >> $LOGFILE 2>&1
if [ $? -ne 0 ]; then
exiterror "md5sum error in $1, check file in cache or signature"
fi
cd $BASEDIR/lfs && make -f $* BUILDTARGET=$BUILDTARGET \
MACHINE=$MACHINE \
LFS_BASEDIR=$BASEDIR \
ROOT=$LFS \
KVER=$KVER \
install >> $LOGFILE 2>&1
if [ $? -ne 0 ]; then
exiterror "Building $*";
fi
else
exiterror "No such file or directory: $BASEDIR/$1"
fi
return 0
}
lfsmake2() {
if [ -f $BASEDIR/build/usr/src/lfs/$1 ]; then
echo "`date -u '+%b %e %T'`: Building $*" | tee -a $LOGFILE
cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t " download >> $LOGFILE 2>&1
if [ $? -ne 0 ]; then
exiterror "Download error in $1"
fi
cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t md5sum" md5 >> $LOGFILE 2>&1
if [ $? -ne 0 ]; then
exiterror "md5sum error in $1, check file in cache or signature"
fi
chroot $LFS /tools/bin/env -i HOME=/root \
TERM=$TERM PS1='\u:\w\$ ' \
PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
VERSION=$VERSION \
CONFIG_ROOT=$CONFIG_ROOT \
NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" \
CCACHE_DIR=/usr/src/ccache CCACHE_HASHDIR=1 \
KVER=$KVER \
BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \
/tools/bin/bash -x -c "cd /usr/src/lfs && \
make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
if [ $? -ne 0 ]; then
exiterror "Building $*"
fi
else
exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/$1"
fi
return 0
}
ipcopmake() {
if [ -f $BASEDIR/build/usr/src/lfs/$1 ]; then
echo "`date -u '+%b %e %T'`: Building $*" | tee -a $LOGFILE
cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t " download >> $LOGFILE 2>&1
if [ $? -ne 0 ]; then
exiterror "Download error in $1"
fi
cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t md5sum" md5 >> $LOGFILE 2>&1
if [ $? -ne 0 ]; then
exiterror "md5sum error in $1, check file in cache or signature"
fi
chroot $LFS /tools/bin/env -i HOME=/root \
TERM=$TERM PS1='\u:\w\$ ' \
PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
VERSION=$VERSION \
CONFIG_ROOT=$CONFIG_ROOT \
NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" \
CCACHE_DIR=/usr/src/ccache CCACHE_HASHDIR=1 \
KVER=$KVER \
BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \
/bin/bash -x -c "cd /usr/src/lfs && \
make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
if [ $? -ne 0 ]; then
exiterror "Building $*"
fi
else
exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/$1"
fi
return 0
}
installmake() {
if [ -f $BASEDIR/build/usr/src/lfs/$1 ]; then
echo "`date -u '+%b %e %T'`: Building $*" | tee -a $LOGFILE
cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t " download >> $LOGFILE 2>&1
if [ $? -ne 0 ]; then
exiterror "Download error in $1"
fi
cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR MESSAGE="$1\t md5sum" md5 >> $LOGFILE 2>&1
if [ $? -ne 0 ]; then
exiterror "md5sum error in $1, check file in cache or signature"
fi
chroot $LFS /tools/bin/env -i HOME=/root \
TERM=$TERM PS1='\u:\w\$ ' \
PATH=/usr/local/bin:/opt/$MACHINE-uClibc/usr/bin:/bin:/usr/bin:/sbin:/usr/sbin \
VERSION=$VERSION \
CONFIG_ROOT=$CONFIG_ROOT \
LFS_PASS="install" \
NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
CFLAGS="-Os" CXXFLAGS="-Os" \
CCACHE_DIR=/usr/src/ccache CCACHE_HASHDIR=1 \
KVER=$KVER \
BUILDTARGET="$BUILDTARGET" MACHINE="$MACHINE" \
/bin/bash -x -c "cd /usr/src/lfs && \
make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
if [ $? -ne 0 ]; then
exiterror "Building $*"
fi
else
exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/$1"
fi
return 0
}
buildtoolchain() {
LOGFILE="$BASEDIR/log/_build.toolchain.log"
export LOGFILE
echo -ne "`date -u '+%b %e %T'`: Stage1 toolchain build \n" | tee -a $LOGFILE
# Build sed now, as we use some extensions
ORG_PATH=$PATH
NATIVEGCC=`gcc --version | grep GCC | awk {'print $3'}`
export NATIVEGCC GCCmajor=${NATIVEGCC:0:1} GCCminor=${NATIVEGCC:2:1} GCCrelease=${NATIVEGCC:4:1}
lfsmake1 ccache
lfsmake1 sed LFS_PASS=1
lfsmake1 m4 LFS_PASS=1
lfsmake1 bison LFS_PASS=1
lfsmake1 flex LFS_PASS=1
lfsmake1 binutils LFS_PASS=1
lfsmake1 gcc LFS_PASS=1
export PATH=$BASEDIR/build/usr/local/bin:$BASEDIR/build/tools/bin:$PATH
lfsmake1 linux
lfsmake1 tcl
lfsmake1 expect
lfsmake1 glibc
lfsmake1 dejagnu
lfsmake1 gcc LFS_PASS=2
lfsmake1 binutils LFS_PASS=2
lfsmake1 gawk
lfsmake1 coreutils
lfsmake1 bzip2
lfsmake1 gzip
lfsmake1 diffutils
lfsmake1 findutils
lfsmake1 make
lfsmake1 grep
lfsmake1 sed LFS_PASS=2
lfsmake1 m4 LFS_PASS=2
lfsmake1 bison LFS_PASS=2
lfsmake1 flex LFS_PASS=2
lfsmake1 gettext
lfsmake1 ncurses
lfsmake1 patch
lfsmake1 tar
lfsmake1 texinfo
lfsmake1 bash
lfsmake1 util-linux
lfsmake1 perl
export PATH=$ORG_PATH
}
buildbase() {
LOGFILE="$BASEDIR/log/_build.base.log"
export LOGFILE
echo -ne "`date -u '+%b %e %T'`: Stage2 linux base build \n" | tee -a $LOGFILE
# Run LFS dynamic binary creation scripts one by one
lfsmake2 stage2
lfsmake2 makedev
lfsmake2 linux
lfsmake2 man-pages
lfsmake2 glibc
lfsmake2 binutils
lfsmake2 gcc
lfsmake2 coreutils
lfsmake2 zlib
lfsmake2 mktemp
lfsmake2 iana-etc
lfsmake2 findutils
lfsmake2 gawk
lfsmake2 ncurses
lfsmake2 vim
lfsmake2 m4
lfsmake2 bison
lfsmake2 less
lfsmake2 groff
lfsmake2 sed
lfsmake2 flex
lfsmake2 gettext
lfsmake2 net-tools
lfsmake2 inetutils
lfsmake2 perl
lfsmake2 texinfo
lfsmake2 autoconf
lfsmake2 automake
lfsmake2 bash
lfsmake2 file
lfsmake2 libtool
lfsmake2 bzip2
lfsmake2 diffutils
lfsmake2 ed
lfsmake2 kbd
lfsmake2 e2fsprogs
lfsmake2 grep
if [ 'i386' = $MACHINE ]; then
lfsmake2 grub
elif [ 'alpha' = $MACHINE ]; then
lfsmake2 aboot
fi
lfsmake2 gzip
lfsmake2 man
lfsmake2 make
lfsmake2 modutils
lfsmake2 patch
lfsmake2 procinfo
lfsmake2 procps
lfsmake2 psmisc
lfsmake2 shadow
lfsmake2 sysklogd
lfsmake2 sysvinit
lfsmake2 tar
lfsmake2 util-linux
}
buildipcop() {
# Run IPCop make scripts one by one
LOGFILE="$BASEDIR/log/_build.ipcop.log"
export LOGFILE
echo -ne "`date -u '+%b %e %T'`: Stage3 $NAME build \n" | tee -a $LOGFILE
# Build these first as some of the kernel packages below rely on
# these for some of their client program functionality
ipcopmake configroot
ipcopmake dhcp
ipcopmake dhcpcd
ipcopmake libusb
ipcopmake libpcap
ipcopmake linux-atm
ipcopmake ppp
ipcopmake rp-pppoe
ipcopmake unzip
# Do SMP now
if [ 'i386' = $MACHINE ]; then
# abuse the SMP flag, and make an minimal installer kernel first
# so that the boot floppy always works.....
ipcopmake linux LFS_PASS=ipcop SMP=installer
ipcopmake linux LFS_PASS=ipcop SMP=1
ipcopmake 3cp4218 SMP=1
ipcopmake amedyn SMP=1
ipcopmake cxacru SMP=1
ipcopmake eagle SMP=1
# These are here because they have i386 only binary libraries
# included in the package.
ipcopmake cnx_pci SMP=1
ipcopmake fcdsl SMP=1
ipcopmake fcdsl2 SMP=1
ipcopmake fcdslsl SMP=1
ipcopmake fcdslusb SMP=1
ipcopmake fcdslslusb SMP=1
ipcopmake pulsar SMP=1
ipcopmake unicorn SMP=1
fi
ipcopmake linux LFS_PASS=ipcop
ipcopmake 3cp4218
ipcopmake amedyn
ipcopmake cxacru
ipcopmake eciadsl
ipcopmake eagle
ipcopmake speedtouch
if [ 'i386' = $MACHINE ]; then
# These are here because they have i386 only binary libraries
# included in the package.
ipcopmake cnx_pci
ipcopmake fcdsl
ipcopmake fcdsl2
ipcopmake fcdslsl
ipcopmake fcdslusb
ipcopmake fcdslslusb
ipcopmake pulsar
ipcopmake unicorn
fi
ipcopmake pcmcia-cs
ipcopmake expat
ipcopmake gdbm
ipcopmake gmp
ipcopmake openssl
ipcopmake python
ipcopmake libnet
ipcopmake libpng
ipcopmake gd
ipcopmake popt
ipcopmake slang
ipcopmake newt
ipcopmake libcap
ipcopmake pciutils
ipcopmake pcre
ipcopmake apache
ipcopmake arping
ipcopmake beep
ipcopmake bind
ipcopmake capi4k-utils
ipcopmake cdrtools
ipcopmake dnsmasq
ipcopmake dosfstools
ipcopmake ethtool
ipcopmake ez-ipupdate
ipcopmake fcron
ipcopmake perl-GD
ipcopmake gnupg
ipcopmake hdparm
ipcopmake ibod
ipcopmake initscripts
ipcopmake iptables
ipcopmake ipac-ng
ipcopmake ipaddr
ipcopmake iproute2
ipcopmake iptstate
ipcopmake iputils
ipcopmake isapnptools
ipcopmake isdn4k-utils
ipcopmake kudzu
ipcopmake logrotate
ipcopmake logwatch
ipcopmake mingetty
ipcopmake misc-progs
ipcopmake mtools
ipcopmake nano
ipcopmake nash
ipcopmake nasm
ipcopmake URI
ipcopmake HTML-Tagset
ipcopmake HTML-Parser
ipcopmake Compress-Zlib
ipcopmake Digest
ipcopmake Digest-SHA1
ipcopmake Digest-HMAC
ipcopmake libwww-perl
ipcopmake Net-DNS
ipcopmake Net-IPv4Addr
ipcopmake Net_SSLeay
ipcopmake noip_updater
ipcopmake ntp
ipcopmake oinkmaster
ipcopmake openssh
ipcopmake openswan
ipcopmake pptpclient
ipcopmake rrdtool
ipcopmake setserial
ipcopmake setup
ipcopmake snort
#ipcopmake speedycgi
ipcopmake squid
ipcopmake squid-graph
ipcopmake tcpdump
ipcopmake traceroute
ipcopmake vlan
ipcopmake wireless
ipcopmake libsafe
ipcopmake 3c5x9setup
ipcopmake stund
ipcopmake lpd
ipcopmake xampp
ipcopmake pam
ipcopmake pwlib
ipcopmake openh323
}
buildinstaller() {
# Run installer scripts one by one
LOGFILE="$BASEDIR/log/_build.installer.log"
export LOGFILE
echo -ne "`date -u '+%b %e %T'`: Stage4 installer build \n" | tee -a $LOGFILE
if [ 'i386' = $MACHINE ]; then
ipcopmake syslinux
ipcopmake as86
ipcopmake mbr
ipcopmake uClibc
fi
installmake busybox
installmake sysvinit
installmake e2fsprogs
installmake misc-progs
installmake slang
installmake util-linux
installmake newt
installmake pciutils
installmake pcmcia-cs
installmake kbd
installmake installer
installmake scsi.img
installmake driver.img
installmake initrd
installmake boot.img
}
buildpackages() {
LOGFILE="$BASEDIR/log/_build.packages.log"
export LOGFILE
echo "... see detailed log in _build.*.log files" >> $LOGFILE
echo -ne "`date -u '+%b %e %T'`: Stage5 packages build \n" | tee -a $LOGFILE
# Strip files
echo "`date -u '+%b %e %T'`: Stripping files" | tee -a $LOGFILE
find $LFS/lib $LFS/usr/lib $LFS/usr/share/rrdtool-* $LFS/install ! -type l \( -name '*.so' -o -name '*.so[\.0-9]*' \) \
! -name 'libc.so' ! -name 'libpthread.so' ! -name 'libcrypto.so.0.9.7.sha1' \
-exec $LFS/tools/bin/strip --strip-all {} \; >> $LOGFILE 2>&1
# add -ls before -exec if you want to verify what files are stripped
find $LFS/{,s}bin $LFS/usr/{,s}bin $LFS/usr/local/{,s}bin ! -type l \
-exec file {} \; | grep " ELF " | cut -f1 -d ':' | xargs $LFS/tools/bin/strip --strip-all >> $LOGFILE 2>&1
# there add -v to strip to verify
if [ 'i386' = $MACHINE ]; then
# Create fcdsl packages
echo "`date -u '+%b %e %T'`: Building fcdsl tgz" | tee -a $LOGFILE
cp $LFS/install/images/fcdsl/license.txt $LFS >> $LOGFILE 2>&1
touch $LFS/var/run/{need-depmod-$KVER,need-depmod-$KVER-smp}
cd $LFS && tar cvfz $LFS/install/images/$SNAME-fcdsl-$VERSION.$MACHINE.tgz \
lib/modules/$KVER/misc/fcdsl*.o.gz \
lib/modules/$KVER-smp/misc/fcdsl*.o.gz \
usr/lib/isdn/{fds?base.bin,fd?ubase.frm} \
etc/fcdsl/fcdsl*.conf \
etc/drdsl/{drdsl,drdsl.ini} \
license.txt \
var/run/{need-depmod-$KVER,need-depmod-$KVER-smp} >> $LOGFILE 2>&1
rm -f $LFS/license.txt >> $LOGFILE 2>&1
cd $BASEDIR
fi
# Create update for this version
# echo "`date -u '+%b %e %T'`: Building update $VERSION tgz" | tee -a $LOGFILE
# tar -cz -C $BASEDIR/build --files-from=$BASEDIR/updates/$VERSION/ROOTFILES.$MACHINE-$VERSION -f $BASEDIR/updates/$VERSION/patch.tar.gz --exclude='#*';
# chmod 755 $BASEDIR/updates/$VERSION/setup
# tar -cz -C $BASEDIR/updates/$VERSION -f $LFS/install/images/$SNAME-update-$VERSION.$MACHINE.tgz patch.tar.gz setup information
# rm -f $LFS/var/run/{need-depmod-$KVER,need-depmod-$KVER-smp}
# Generating list of packages used
echo "`date -u '+%b %e %T'`: Generating packages list from logs" | tee -a $LOGFILE
rm -f $BASEDIR/doc/packages-list
for i in `ls -1tr $BASEDIR/log/[^_]*`; do
if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
echo "* `basename $i`" >>$BASEDIR/doc/packages-list
fi
done
echo "!!! List of softwares used to build $NAME Version:$VERSION" > $BASEDIR/doc/packages-list.txt
grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|ipcop$\|setup$\|stage2$\|smp$\|tools$\|tools1$\|tools2$' \
$BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
rm -f $BASEDIR/doc/packages-list
# packages-list.txt is ready to be displayed for wiki page IPCopSoftwares
# Create ISO for CDRom and USB-superfloppy
ipcopmake cdrom
cp $LFS/install/images/{*.iso,*.tgz} $BASEDIR >> $LOGFILE 2>&1
# Cleanup
stdumount
rm -rf $BASEDIR/build/tmp/*
# Generating total list of files
echo "`date -u '+%b %e %T'`: Generating files list from logs" | tee -a $LOGFILE
rm -f $BASEDIR/log/FILES
for i in `ls -1tr $BASEDIR/log/[^_]*`; do
if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
echo "##" >>$BASEDIR/log/FILES
echo "## `basename $i`" >>$BASEDIR/log/FILES
echo "##" >>$BASEDIR/log/FILES
cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
fi
done
cd $PWD
}
# See what we're supposed to do
case "$1" in
build)
BUILDMACHINE=`uname -m`
PACKAGE=`ls -v -r $BASEDIR/cache/$SNAME-1.4.*-toolchain-$BUILDMACHINE.tar.gz 2> /dev/null | head -n 1`
#only restore on a clean disk
if [ ! -f log/perl-*-tools ]; then
if [ ! -n "$PACKAGE" ]; then
echo "`date -u '+%b %e %T'`: Full toolchain compilation" | tee -a $LOGFILE
prepareenv
buildtoolchain
else
PACKAGENAME=${PACKAGE%.tar.gz}
echo "`date -u '+%b %e %T'`: Restore from $PACKAGE" | tee -a $LOGFILE
if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
tar zxf $PACKAGE
prepareenv
else
exiterror "$PACKAGENAME md5 did not match, check downloaded package"
fi
fi
else
echo "`date -u '+%b %e %T'`: Using installed toolchain" | tee -a $LOGFILE
prepareenv
fi
buildbase
buildipcop
buildinstaller
buildpackages
;;
shell)
# enter a shell inside LFS chroot
# may be used to changed kernel settings
prepareenv
entershell
;;
changelog)
echo "Building doc/Changelog from CVS"
# cv2cl script come from http://www.red-bean.com/cvs2cl/
if [ ! -s $BASEDIR/doc/CVS/Tag ]; then
BRANCHOPTS=""
else
BRANCH=`cat $BASEDIR/doc/CVS/Tag`
BRANCH=${BRANCH:1}
BRANCHOPTS="--follow-only $BRANCH"
fi
$BASEDIR/tools/cvs2cl.pl --gmt --show-dead $BRANCHOPTS -f $BASEDIR/doc/ChangeLog
rm -f $BASEDIR/doc/ChangeLog.bak
echo
echo "Commit the change now to update CVS"
;;
check)
echo "Checking sources files availability on the web"
if [ ! -d $DIR_CHK ]; then
mkdir -p $DIR_CHK
fi
FINISHED=0
cd $BASEDIR/lfs
for c in `seq $MAX_RETRIES`; do
if (( FINISHED==1 )); then
break
fi
FINISHED=1
cd $BASEDIR/lfs
for i in *; do
if [ -f "$i" -a "$i" != "Config" ]; then
make -s -f $i MACHINE=$MACHINE LFS_BASEDIR=$BASEDIR ROOT=$BASEDIR/build \
MESSAGE="$i\t ($c/$MAX_RETRIES)" check
if [ $? -ne 0 ]; then
echo "Check : wget error in lfs/$i"
FINISHED=0
fi
fi
done
done
cd -
;;
checkclean)
echo "Erasing sources files availability tags"
rm -rf $DIR_CHK/*
;;
clean)
for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
$LOSETUP -d $i 2>/dev/null
done
for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
umount $i
done
stdumount
for i in `seq 0 7`; do
if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
umount /dev/loop${i} 2>/dev/null;
losetup -d /dev/loop${i} 2>/dev/null;
fi;
done
rm -rf $BASEDIR/build
rm -rf $BASEDIR/cdrom
rm -rf $BASEDIR/log
rm -f $BASEDIR/updates/$VERSION/patch.tar.gz;
if [ -h /tools ]; then
rm -f /tools
fi
;;
dist)
echo "Building source package from CVS, list of changed files, MD5 of release files"
if [ ! -s $BASEDIR/doc/CVS/Tag ]; then
BRANCH=""
BRANCHOPTS="-D `date +'%Y-%m-%d'`"
else
BRANCH=`cat $BASEDIR/doc/CVS/Tag`
BRANCH=${BRANCH:1}
BRANCHOPTS="-r $BRANCH"
fi
rm -rf $BASEDIR/build/tmp/$SNAME-$VERSION $BASEDIR/doc/release.txt
cd $BASEDIR/build/tmp
# build sources tgz
echo "Export tree $BRANCH $SNAME-$VERSION"
cvs -z3 -d `cat $BASEDIR/CVS/Root` export $BRANCHOPTS ipcop
if [ $? -eq 0 ]; then
mv ipcop $SNAME-$VERSION
tar cfz $BASEDIR/$SNAME-sources-$VERSION.tgz $SNAME-$VERSION
cd $BASEDIR
if [ ! -d $BASEDIR/build/tmp/$PREVIOUSTAG ]; then
# export previous version to be compared with actual, this help to check wich files need to go in update
cd $BASEDIR/build/tmp
echo "Export tree $PREVIOUSTAG"
cvs -z3 -d `cat $BASEDIR/CVS/Root` export -r $PREVIOUSTAG ipcop
mv ipcop $PREVIOUSTAG
fi
if [ -d $BASEDIR/build/tmp/$PREVIOUSTAG -o -d $BASEDIR/build/tmp/$SNAME-$VERSION ]; then
cd $BASEDIR/build/tmp
echo "diff $PREVIOUSTAG <> $BRANCH $SNAME-$VERSION >doc/updated-sources.txt"
diff -rq $PREVIOUSTAG $SNAME-$VERSION > $BASEDIR/doc/updated-sources.txt
mv $BASEDIR/doc/updated-sources.txt $BASEDIR/doc/updated-sources.bak
sed -e "s+Files $PREVIOUSTAG\/++" \
-e "s+ and .*$++" \
-e "s+src/rc.d+etc/rc.d+" \
-e "s+^langs/+var/ipcop/langs/+" \
-e "s+html/cgi-bin+home/httpd/cgi-bin+" $BASEDIR/doc/updated-sources.bak \
> $BASEDIR/doc/updated-sources.txt
rm -f $BASEDIR/doc/updated-sources.bak
fi
fi
;;
newupdate)
# create structure for $VERSION update
if [ ! -f "updates/$VERSION" ]; then
mkdir -p updates/$VERSION
cd updates/$VERSION
touch information
echo 'etc/issue' > ROOTFILES.alpha-$VERSION
echo 'etc/issue' > ROOTFILES.i386-$VERSION
echo 'patch.tar.gz' > .cvsignore
sed -e "s+^UPGRADEVERSION.*$+UPGRADEVERSION=$VERSION+" $BASEDIR/src/scripts/updatesetup > setup
chmod 755 setup
cd ..
echo "Adding directory $VERSION to cvs"
cvs add $VERSION
echo "Adding files to cvs"
cvs add $VERSION/ROOTFILES.alpha-$VERSION \
$VERSION/ROOTFILES.i386-$VERSION \
$VERSION/information \
$VERSION/setup \
$VERSION/.cvsignore
else
echo "update/$VERSION already exist"
fi
cd -
exit 0
;;
prefetch)
if [ ! -d $BASEDIR/cache ]; then
mkdir $BASEDIR/cache
fi
mkdir -p $BASEDIR/log
echo "`date -u '+%b %e %T'`:Preload all source files" | tee -a $LOGFILE
FINISHED=0
cd $BASEDIR/lfs
for c in `seq $MAX_RETRIES`; do
if (( FINISHED==1 )); then
break
fi
FINISHED=1
cd $BASEDIR/lfs
for i in *; do
if [ -f "$i" -a "$i" != "Config" ]; then
make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
if [ $? -ne 0 ]; then
echo "Prefetch : wget error in lfs/$i"
FINISHED=0
else
if [ $c -eq 1 ]; then
echo "Prefetch : lfs/$i files loaded"
fi
fi
fi
done
done
echo "Prefetch : verifying md5sum"
ERROR=0
for i in *; do
if [ -f "$i" -a "$i" != "Config" ]; then
make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
if [ $? -ne 0 ]; then
echo "md5 difference in lfs/$i"
ERROR=1
fi
fi
done
if [ $ERROR -eq 0 ]; then
echo "Prefetch : all files md5sum match"
fi
cd -
;;
rootfiles)
PREVIOUSVERSION=`echo $PREVIOUSTAG | sed -e 's/IPCOP_v//' -e 's/_FINAL//' -e 's/_/\./g'`
# make md5 list of actual build
# some packages include a timestamp (kernel/perl/python/vim and more), so md5 vary at each build
# anyway, it is sometime usable after a patch or a minor upgrade to know wich files include in update
if [ ! -f "$BASEDIR/build/install/cdrom/$SNAME-$VERSION.tgz" ]; then
echo "need cdrom be build to read include files list, use ./make.sh build before."
else
tar tzf $BASEDIR/build/install/cdrom/$SNAME-$VERSION.tgz > $BASEDIR/updates/$VERSION/FILES.tmp
cd $BASEDIR/build
rm -f $BASEDIR/updates/$VERSION/FILES-$MACHINE-$VERSION.md5
for line in `cat $BASEDIR/updates/$VERSION/FILES.tmp`; do
if [ -f "$line" -a ! -L "$line" ]; then
md5sum "$line" >> $BASEDIR/updates/$VERSION/FILES-$MACHINE-$VERSION.md5
fi
done
diff $BASEDIR/updates/$PREVIOUSVERSION/FILES-$MACHINE-$PREVIOUSVERSION.md5 \
$BASEDIR/updates/$VERSION/FILES-$MACHINE-$VERSION.md5 \
> $BASEDIR/updates/$VERSION/FILES-$MACHINE.diff
awk '$1==">" {print $3}' $BASEDIR/updates/$VERSION/FILES-$MACHINE.diff \
> $BASEDIR/updates/$VERSION/ROOTFILES.add.$MACHINE
awk '$1=="<" {print $3}' $BASEDIR/updates/$VERSION/FILES-$MACHINE.diff \
> $BASEDIR/updates/$VERSION/ROOTFILES.remove.$MACHINE.tmp
rm -f $BASEDIR/updates/$VERSION/ROOTFILES.remove.$MACHINE
for line in `cat $BASEDIR/updates/$VERSION/ROOTFILES.remove.$MACHINE.tmp`; do
# a file is only removed when not in add file
if ( ! grep -q "^$line$" $BASEDIR/updates/$VERSION/ROOTFILES.add.$MACHINE ); then
echo $line >> $BASEDIR/updates/$VERSION/ROOTFILES.remove.$MACHINE
fi
done
rm -f $BASEDIR/updates/$VERSION/{FILES.tmp,FILES-*.diff,ROOTFILES.remove.*.tmp}
fi
exit 0
;;
toolchain)
prepareenv
buildtoolchain
BUILDMACHINE=`uname -m`
echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
build/{bin,etc,usr/bin,usr/local} \
build/tools/{bin,etc,*-linux-gnu,include,lib,libexec,sbin,share,var} \
log >> $LOGFILE
md5sum cache/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
> cache/$SNAME-$VERSION-toolchain-$BUILDMACHINE.md5
stdumount
;;
gettoolchain)
BUILDMACHINE=`uname -m`
# arbitrary name to be updated in case of new toolchain package upload
PACKAGE=$SNAME-1.4.11-toolchain-$BUILDMACHINE
URL_SFNET=`grep URL_SFNET lfs/Config | awk '{ print $3 }'`
echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
cd $BASEDIR/cache
wget -c $URL_SFNET/ipcop/$PACKAGE.tar.gz $URL_SFNET/ipcop/$PACKAGE.md5
if [ $? -ne 0 ]; then
echo "`date -u '+%b %e %T'`: error downloading toolchain for $BUILDMACHINE machine" | tee -a $LOGFILE
else
if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
else
exiterror "$PACKAGE.md5 did not match, check downloaded package"
fi
fi
;;
*)
echo "Usage: $0 {build|changelog|check|checkclean|clean|dist|gettoolchain|newupdate|prefetch|rootfiles|shell|toolchain}"
cat doc/make.sh-usage
exit 1
;;
esac