]> git.ipfire.org Git - ipfire-3.x.git/blobdiff - tools/make-include
Added new package: dosfstools.
[ipfire-3.x.git] / tools / make-include
index 044a31b5a694a919f60741421c7df3467ea9076f..e23faab7f60b85d19bb44df2976135f0d38816d4 100644 (file)
 #
 ###############################################################################
 
-CONFIG_ROOT=/etc/$SNAME                # Configuration rootdir
-NICE=10                                # Nice level
-TARGET=i686                    # Default target
-KVER=`grep --max-count=1 VER lfs/linux | awk '{ print $3 }' | tr -d '\n'; grep --max-count=1 LOCALVERSION lfs/linux | awk '{ print $3 }' | tail -1`
-MACHINE_REAL=`uname -m`
-GIT_TAG=$(git tag | tail -1)
-
-# Security options
-SSP=1
-PIE=1
-PAX=1
-
-# Parallelism flag
-PARALLELISMFLAGS=-j$(( $(grep processor < /proc/cpuinfo | wc -l) * 2 + 1 ))
-DISTCC_HOSTS=localhost
-
-PWD=`pwd`
-BASENAME=`basename $0`
+PWD=$(pwd)
+BASENAME=$(basename $0)
 
 # Debian specific settings
 if [ ! -e /etc/debian_version ]; then
-       FULLPATH=`which $0`
+       FULLPATH=$(which $0)
 else
        if [ -x /usr/bin/realpath ]; then
-               FULLPATH=`/usr/bin/realpath $0`
+               FULLPATH=$(/usr/bin/realpath $0)
        else
                echo "ERROR: Need to do apt-get install realpath"
                exit 1
        fi
 fi
 
-BASEDIR=`echo $FULLPATH | sed "s/\/$BASENAME//g"`
+BASEDIR=$(echo $FULLPATH | sed "s/\/$BASENAME//g")
 export BASEDIR
 
-. $BASEDIR/tools/make-beautify # Load this very early
-
-###############################################################################
-#
-# Read the local configuration to override the environment variables
-#
-###############################################################################
-
-if ! [ -e .config ]; then
-       sed -e "s/@UUID@/$(uuidgen 2>/dev/null || cat /proc/sys/kernel/random/uuid)/" \
-           -e "s/^#UUID=/UUID=/" < $BASEDIR/.config-default > $BASEDIR/.config
-fi
-
-. $BASEDIR/.config
-
-###############################################################################
-#
-# Variables that are not modifyable by .config
-#
-###############################################################################
-
-if [ 'i686' = $MACHINE_REAL \
-       -o 'i586' = $MACHINE_REAL \
-       -o 'i486' = $MACHINE_REAL \
-       -o 'x86_64' = $MACHINE_REAL ]; then
-       IFS_HOST="$(echo $MACHTYPE | sed "s/$(echo $MACHTYPE | cut -d- -f2)/cross/")"
-else
-       beautify message FAIL
-       echo "Can't determine your architecture - $MACHINE_REAL"
-       exit 1
-fi
-
-if [ 'i686' = $TARGET -o 'i586' = $TARGET \
-       -o 'i486' = $TARGET ]; then
-       MACHINE=${TARGET}
-       MACHINE_REAL=${MACHINE_REAL}
-       LINKER=/lib/ld-linux.so.2
-       IFS_TARGET="${MACHINE}-pc-linux-gnu"
-       CFLAGS="-march=${MACHINE} -O2 -pipe -fomit-frame-pointer"
-       CXXFLAGS="${CFLAGS}"
-       UCLIBC_TARGET=${MACHINE}-pc-linux-uclibc
-       UCLIBC_CFLAGS="-march=${MACHINE} -Os -pipe"
-elif [ 'via-c7' = $TARGET ]; then
-       MACHINE=i686
-       MACHINE_REAL=${MACHINE_REAL}
-       LINKER=/lib/ld-linux.so.2
-       IFS_TARGET="${MACHINE}-pc-linux-gnu"
-       CFLAGS="-march=${MACHINE} -mmmx -msse -msse2 -msse3 -O2 -pipe"
-       CXXFLAGS="${CFLAGS}"
-       UCLIBC_TARGET=${MACHINE}-pc-linux-uclibc
-       UCLIBC_CFLAGS="-march=i386 -Os -pipe"
-elif [ 'via-c3' = $TARGET ]; then
-       MACHINE=i586
-       MACHINE_REAL=${MACHINE_REAL}
-       LINKER=/lib/ld-linux.so.2
-       IFS_TARGET="${MACHINE}-pc-linux-gnu"
-       CFLAGS="-march=c3 -m3dnow -O2 -pipe -fomit-frame-pointer"
-       CXXFLAGS="${CFLAGS}"
-       UCLIBC_TARGET=${MACHINE}-pc-linux-uclibc
-       UCLIBC_CFLAGS="-march=${MACHINE} -Os -pipe"
-elif [ 'geodelx' = $TARGET ]; then
-       MACHINE=i586
-       MACHINE_REAL=${MACHINE_REAL}
-       LINKER=/lib/ld-linux.so.2
-       IFS_TARGET="${MACHINE}-pc-linux-gnu"
-       CFLAGS="-march=geode -Os -pipe -fomit-frame-pointer"
-       CXXFLAGS="${CFLAGS}"
-       UCLIBC_TARGET=${MACHINE}-pc-linux-uclibc
-       UCLIBC_CFLAGS="-march=geode -Os -pipe"
-else
-       beautify message FAIL
-       echo "Not a valid target arch (i686|i586|i486|via-c7|via-c3|geodelx) - $TARGET"
-       exit 1
-fi
-
-mkdir $BASEDIR/log_${MACHINE}/ 2>/dev/null
-
-# Set up what used to be /tools
-TOOLS_DIR=/tools_${MACHINE}
-
-# Set up /installer
-INSTALLER_DIR=/installer
-
-# A place to build the iso
-CDROM_DIR=/cdrom
-
-# A place to keep the images
-IMAGES_DIR=/images
-
-# include machine in TOOLCHAINNAME
-TOOLCHAINNAME=$SNAME-$TOOLCHAINVERSION-toolchain-t${TARGET}-m${MACHINE}
-
-# The place where all uclibc files are stored in
-UCLIBC_DIR=/usr/${UCLIBC_TARGET}
-UCLIBC_CC_CORE_STATIC_DIR=${UCLIBC_DIR}/gcc-core-static
-
-#UCLIBC_SYSROOT_DIR=${UCLIBC_DIR}/${UCLIBC_TARGET}/sys-root
-UCLIBC_SYSROOT_DIR=${INSTALLER_DIR}
+. $BASEDIR/tools/make-constants        # Load this very early
+. $BASEDIR/tools/make-beautify
 
-# Files that indicates that we are running or failed
-RUNNING=$BASEDIR/.running
-FAILED=$BASEDIR/.failed
+mkdir $BASEDIR/log_${TARGET}/ 2>/dev/null
 
 ################################################################################
 #                                                                              #
@@ -172,6 +58,10 @@ FAILED=$BASEDIR/.failed
 . $BASEDIR/tools/make-batch
 . $BASEDIR/tools/make-compilers
 . $BASEDIR/tools/make-git
+. $BASEDIR/tools/make-packages
+. $BASEDIR/tools/make-rootfiles
+. $BASEDIR/tools/make-vm
+. $BASEDIR/tools/make-cron
 
 evaluate() {
        RETVAL=$?
@@ -185,20 +75,36 @@ evaluate() {
 
 stdumount() {
        sleep 0.3 # Wait one second for finish of processes
-       for fs in `mount | grep $BASEDIR/build_${MACHINE} | awk '{print $3}'`; do
-               umount $fs #2>/dev/null;
+       for fs in $(mount | grep $BASEDIR/build_${TARGET} | awk '{print $3}'); do
+               umount $fs 2>/dev/null;
        done
 } # End of stdumount()
 
 exiterror() {
        stdumount
        dialogerror $*
-       build_spy error
+       build_spy state error
+       if [ -n "$LOGFILE" ]; then
+               echo "$(date -u '+%b %e %T') ERROR: $*" >> $LOGFILE
+               build_spy log $(tail -n16 $LOGFILE | $BASEDIR/tools/base64)
+       fi
+       build_spy exit
        touch $FAILED
        rm -f $RUNNING 2>/dev/null
        exit 1
 } # End of exiterror()
 
+logger() {
+       local logfile=$LOGFILE
+       case "$1" in
+               --distcc)
+                       logfile=$BASEDIR/log_$TARGET/_build.00-distcc.log
+                       shift
+                       ;;
+       esac
+       echo "$(date -u '+%b %e %T') $*" >> $logfile
+}
+
 ################################################################################
 # This is the function that sets the environment of a chroot and enters it     #
 ################################################################################
@@ -208,6 +114,8 @@ entershell() {
        if [ ! -e $LFS/usr/src/lfs/ ]; then
                exiterror "No such file or directory: $LFS/usr/src/lfs/"
        fi
+
+       COMMAND=${@-bash} # Run command, given as parameters.
        
        echo -ne "Entering ${BOLD}$MACHINE${NORMAL} LFS chroot, type exit to return to host environment\n"
        
@@ -238,8 +146,8 @@ entershell() {
                KVER=$KVER \
                STAGE=$STAGE \
                STAGE_ORDER=$STAGE_ORDER \
-               LOGFILE=`echo $LOGFILE | sed "s,$BASEDIR,/usr/src,g"` \
-               bash
+               LOGFILE=$(echo $LOGFILE | sed "s,$BASEDIR,/usr/src,g") \
+               $COMMAND
 
        if [ $? -ne 0 ]; then
                exiterror "chroot error"
@@ -258,32 +166,76 @@ entershell() {
 ################################################################################
 lfsmakecommoncheck()
 {
+       logger "Building $*"
+       build_spy package $1
+
        # Script present?
        if [ ! -f $BASEDIR/lfs/$1 ]; then
                exiterror "No such file or directory: $BASEDIR/lfs/$1"
        fi
 
-       local PKG_VER=`get_pkg_ver $BASEDIR/lfs/$1`
+       local PKG_VER=$(get_pkg_ver $BASEDIR/lfs/$1)
        beautify make_pkg "$PKG_VER $*"
 
        # Script slipped?
        local i
-       for i in $SKIP_PACKAGE_LIST
-       do
+       for i in $SKIP_PACKAGE_LIST; do
                if [ "$i" == "$1" ]; then
                        beautify result SKIP
-                       return 1;
+                       return 1
                fi
        done
 
-       echo -e "`date -u '+%b %e %T'`: Building $* " >> $LOGFILE
+       # On debug build, we don't strip
+       if [ "$STAGE" != "toolchain" -a \
+                       "$1" == "strip" -a "$BUILD_DEBUG" == "1" ]; then
+               beautify result SKIP
+               return 1
+       fi
+
+       # Don't create addons?
+       local EXTRA=$(grep ^EXTRA $BASEDIR/lfs/$1 | awk '{print $3}')
+       if [ "$EXTRA" == "yes" ] && [ "$BUILD_EXTRAS" == "0" ]; then
+                       beautify result SKIP
+                       return 1
+       fi
+
+       # Don't create debugging tools?
+       local DEBUG=$(grep ^DEBUG $BASEDIR/lfs/$1 | awk '{print $3}')
+       if [ "$DEBUG" == "yes" ] && [ "$BUILD_DEBUG" == "0" ]; then
+                       beautify result SKIP
+                       return 1
+       fi
+
+       # Searching for dependencies
+       local found message
+       for dep in $(pkg_deps $1); do
+               found=0
+               for package in $PACKAGES_DONE; do
+                       if [ "$dep" = "$package" ]; then
+                               found=1
+                               break
+                       fi
+               done
+               [ "$found" = "0" ] && message="$message $dep"
+       done
+       if [ "$message" != "" ]; then
+               message="Deps are missing: $message"
+               if [ "$EXTRA" = "yes" ]; then
+                       echo -ne "${WARN}${message}${NORMAL}"
+                       beautify message SKIP
+                       return 1
+               else
+                       exiterror "$message"
+               fi
+       fi
 
        cd $BASEDIR/lfs && make -s -f $* MACHINE=$MACHINE LFS_BASEDIR=$BASEDIR MESSAGE="$1\t " download  >> $LOGFILE 2>&1
        if [ $? -ne 0 ]; then
                exiterror "Download error in $1"
        fi
 
-       build_spy set package $1 &
+       distcc_reload &
 
        return 0        # pass all!
 } # End of lfsmakecommoncheck()
@@ -295,11 +247,11 @@ toolchain_make() {
        lfsmakecommoncheck $*
        [ $? == 1 ] && return 0
 
-       local PKG_VER=`get_pkg_ver $BASEDIR/lfs/$1`
+       local PKG_VER=$(get_pkg_ver $BASEDIR/lfs/$1)
 
        local EXTRA_MAKE=$EXTRA_MAKE
 
-       local PKG_TIME_START=`date +%s`
+       local PKG_TIME_START=$(date +%s)
        cd $BASEDIR/lfs && $EXTRA_MAKE make -f $* \
                CONFIG_ROOT=$CONFIG_ROOT \
                LINKER=$LINKER \
@@ -308,6 +260,7 @@ toolchain_make() {
                MACHINE_REAL="$MACHINE_REAL" \
                IFS_HOST="$IFS_HOST" \
                IFS_TARGET="$IFS_TARGET" \
+               TARGET="$TARGET" \
                LFS_BASEDIR=$BASEDIR \
                LFS=$LFS \
                INSTALLER_DIR=$INSTALLER_DIR \
@@ -315,19 +268,17 @@ toolchain_make() {
                KVER=$KVER \
                STAGE=$STAGE \
                STAGE_ORDER=$STAGE_ORDER \
-               SSP=$SSP \
-               PIE=$PIE \
-               PAX=$PAX \
                install >> $LOGFILE 2>&1
 
        local COMPILE_SUCCESS=$?
-       local PKG_TIME_END=`date +%s`
+       local PKG_TIME_END=$(date +%s)
 
        if [ $COMPILE_SUCCESS -ne 0 ]; then
                beautify result FAIL $[ $PKG_TIME_END - $PKG_TIME_START ] $1 $PKG_VER $STAGE_ORDER $STAGE
-               exiterror "Building $*";
+               exiterror "Building $*"
        else
                beautify result DONE $[ $PKG_TIME_END - $PKG_TIME_START ] $1 $PKG_VER $STAGE_ORDER $STAGE
+               PACKAGES_DONE="$PACKAGES_DONE $1"
        fi
 
        return 0
@@ -340,7 +291,7 @@ ipfire_make() {
        lfsmakecommoncheck $*
        [ $? == 1 ] && return 0
 
-       local PKG_VER=`get_pkg_ver $BASEDIR/lfs/$1`
+       local PKG_VER=$(get_pkg_ver $BASEDIR/lfs/$1)
 
        local EXTRA_MAKE=$EXTRA_MAKE
        # When cross-compiling, make sure the kernel is compiled for the target
@@ -350,17 +301,8 @@ ipfire_make() {
        if grep -qEi 'KERNEL_MOD = yes' $1 ; then
                unset EXTRA_MAKE
        fi
-       
-       local MYCFLAGS MYCXXFLAGS
-       if [ "${STAGE}" = "installer" ]; then
-               MYCFLAGS=${UCLIBC_CFLAGS}
-               MYCXXFLAGS=${UCLIBC_CFLAGS}
-       else
-               MYCFLAGS=${CFLAGS}
-               MYCXXFLAGS=${CXXFLAGS}
-       fi
 
-       local PKG_TIME_START=`date +%s`
+       local PKG_TIME_START=$(date +%s)
        chroot $LFS $TOOLS_DIR/bin/env -i \
                HOME=/root \
                TERM=$TERM \
@@ -381,34 +323,33 @@ ipfire_make() {
                INSTALLER_DIR=$INSTALLER_DIR \
                CDROM_DIR=$CDROM_DIR \
                IMAGES_DIR=$IMAGES_DIR \
-               UCLIBC_DIR=$UCLIBC_DIR \
-               UCLIBC_SYSROOT_DIR=$UCLIBC_SYSROOT_DIR \
-               UCLIBC_TARGET=$UCLIBC_TARGET \
-               UCLIBC_CC_CORE_STATIC_DIR=${UCLIBC_CC_CORE_STATIC_DIR} \
                MACHINE="$MACHINE" \
                MACHINE_REAL="$MACHINE_REAL" \
-               CFLAGS="$MYCFLAGS" \
-               CXXFLAGS="$MYCXXFLAGS" \
+               CFLAGS="$CFLAGS" \
+               CXXFLAGS="$CXXFLAGS" \
                IFS_HOST="$IFS_HOST" \
                IFS_TARGET="$IFS_TARGET" \
+               TARGET="$TARGET" \
+               BUILD_DEBUG=$BUILD_DEBUG \
+               BUILD_EXTRAS=$BUILD_EXTRAS \
                KVER=$KVER \
                STAGE=$STAGE \
                STAGE_ORDER=$STAGE_ORDER \
-               SSP=$SSP \
-               PIE=$PIE \
-               PAX=$PAX \
-               LOGFILE=`echo $LOGFILE | sed "s,$BASEDIR,/usr/src,g"` \
+               EMB=$EMB \
+               IMAGENAME=$IMAGENAME \
+               LOGFILE=$(echo $LOGFILE | sed "s,$BASEDIR,/usr/src,g") \
                bash -x -c "cd /usr/src/lfs && \
                $EXTRA_MAKE make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
 
        local COMPILE_SUCCESS=$?
-       local PKG_TIME_END=`date +%s`
+       local PKG_TIME_END=$(date +%s)
 
        if [ $COMPILE_SUCCESS -ne 0 ]; then
                beautify result FAIL $[ $PKG_TIME_END - $PKG_TIME_START ] $1 $PKG_VER $STAGE_ORDER $STAGE
-               exiterror "Building $*";
+               exiterror "Building $*"
        else
                beautify result DONE $[ $PKG_TIME_END - $PKG_TIME_START ] $1 $PKG_VER $STAGE_ORDER $STAGE
+               PACKAGES_DONE="$PACKAGES_DONE $1"
        fi
 
        return 0
@@ -418,14 +359,14 @@ ipfire_make() {
 # This prepares the build environment                                          #
 ################################################################################
 prepareenv() {
-       LOGFILE=$BASEDIR/log_${MACHINE}/_build.00-preparation.log
+       LOGFILE=$BASEDIR/log_${TARGET}/_build.00-preparation.log
        export LOGFILE
-       mkdir -p $BASEDIR/log_${MACHINE}/01_toolchain 2>/dev/null
-       mkdir -p $BASEDIR/log_${MACHINE}/02_base 2>/dev/null
-       mkdir -p $BASEDIR/log_${MACHINE}/03_${SNAME} 2>/dev/null
-       mkdir -p $BASEDIR/log_${MACHINE}/04_misc 2>/dev/null
-       mkdir -p $BASEDIR/log_${MACHINE}/05_installer 2>/dev/null
-       mkdir -p $BASEDIR/log_${MACHINE}/06_packages 2>/dev/null
+       mkdir -p $BASEDIR/log_${TARGET}/01_toolchain 2>/dev/null
+       mkdir -p $BASEDIR/log_${TARGET}/02_base 2>/dev/null
+       mkdir -p $BASEDIR/log_${TARGET}/03_${SNAME} 2>/dev/null
+       mkdir -p $BASEDIR/log_${TARGET}/04_misc 2>/dev/null
+       mkdir -p $BASEDIR/log_${TARGET}/05_installer 2>/dev/null
+       mkdir -p $BASEDIR/log_${TARGET}/06_packages 2>/dev/null
   
        #############################################################################
        # Are we running the right shell?                                           #
@@ -450,7 +391,7 @@ prepareenv() {
        #############################################################################
        echo -ne "Resetting our nice level to $NICE"
        renice $NICE $$ > /dev/null
-       if [ `nice` != "$NICE" ]; then
+       if [ $(nice) != "$NICE" ]; then
                beautify message FAIL
                exiterror "Failed to set correct nice level"
        else
@@ -459,11 +400,9 @@ prepareenv() {
        
        # Set SCHED_BATCH
        if [ -x /usr/bin/schedtool ]; then
-               echo -ne "Setting kernel schedular to SCHED_BATCH"
                /usr/bin/schedtool -B $$
-               if [ $? -eq 0 ]; then
-                       beautify message DONE
-               else
+               if [ $? -ne 0 ]; then
+                       echo -ne "Setting kernel schedular to SCHED_BATCH"
                        beautify message FAIL
                fi
        fi
@@ -471,58 +410,47 @@ prepareenv() {
        ##############################################################################
        # Checking if running as root user                                           #
        ##############################################################################
-       echo -ne "Checking if we're running as root user"
-       if [ `id -u` != 0 ]; then
+       if [ $(id -u) != 0 ]; then
+               echo -ne "Checking if we're running as root user"
                beautify message FAIL
                exiterror "Not building as root"
-       else
-               beautify message DONE
        fi
 
 
        ##############################################################################
        # Checking for necessary temporary space                                     #
        ##############################################################################
-       echo -ne "Checking for necessary space on disk $BASE_DEV"
-       BASE_DEV=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $1 }'`
-       BASE_ASPACE=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $4 }'`
+       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 (( 2048000 > $BASE_ASPACE )); then
-               BASE_USPACE=`du -skx $BASEDIR | awk '{print $1}'`
+               BASE_USPACE=$(du -skx $BASEDIR | awk '{print $1}')
                if (( 2048000 - $BASE_USPACE > $BASE_ASPACE )); then
+                       echo -ne "Checking for necessary space on disk $BASE_DEV"
                        beautify message FAIL
                        exiterror "Not enough temporary space available, need at least 2GB on $BASE_DEV"
                fi
-               beautify message DONE
-       else
-               beautify message DONE
        fi
 
        ##############################################################################
-       # Setting security features                                                  #
+       # Embedded build                                                             #
        ##############################################################################
 
-       echo -ne "Stack smashing protector (SSP)"
-       if [ $SSP -eq 1 ]; then
+       echo -ne "Embedded build"
+       if [ $EMB -eq 1 ]; then
                beautify message ON
+               check_loop || exiterror "Can't build flash images on this machine."
        else
                beautify message OFF
        fi
 
-       echo -ne "Position independent executeables (PIE)"
-       if [ $PIE -eq 1 ]; then
-               beautify message ON
-       else
-               beautify message OFF
-       fi
+       export EMB
 
-       echo -ne "GRSecurity (PAX)"
-       if [ $PAX -eq 1 ]; then
-               beautify message ON
-       else
-               beautify message OFF
-       fi
+       ##############################################################################
+       # Checking CPU features                                                      #
+       ##############################################################################
 
-       export SSP PIE PAX
+       check_supported_target $TARGET || \
+               exiterror "Your host doesn't have all needed cpu features for building \"$TARGET\""
 
        ##############################################################################
        # Building Linux From Scratch system configuration                           #
@@ -532,14 +460,14 @@ prepareenv() {
        umask 022
 
        # Set LFS Directory
-       LFS=$BASEDIR/build_${MACHINE}/${SNAME}
+       LFS=$BASEDIR/build_${TARGET}/${SNAME}
        
        # Check /tools symlink
        if [ -h $TOOLS_DIR ]; then
                rm -f $TOOLS_DIR
        fi
        if [ ! -a $TOOLS_DIR ]; then
-               ln -s $BASEDIR/build_${MACHINE}/$TOOLS_DIR /
+               ln -s $BASEDIR/build_${TARGET}/$TOOLS_DIR /
        fi
        if [ ! -h $TOOLS_DIR ]; then
                exiterror "Could not create $TOOLS_DIR symbolic link."
@@ -552,15 +480,14 @@ prepareenv() {
        unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD
 
        # Make some extra directories
-       mkdir -p $BASEDIR/build_${MACHINE}/{$TOOLS_DIR,cdrom} 2>/dev/null
+       mkdir -p $BASEDIR/build_${TARGET}/{$TOOLS_DIR,cdrom,$INSTALLER_DIR,$IMAGES_DIR} 2>/dev/null
        mkdir -p $BASEDIR/{cache,ccache,distcc} 2>/dev/null
        mkdir -p $BASEDIR/cache/{toolchains,patches,tarballs} 2>/dev/null
        mkdir -p $LFS/{$TOOLS_DIR,usr/src} 2>/dev/null
-       mkdir -p $LFS/dev/pts
-       mkdir -p $LFS/proc
-       mkdir -p $LFS/usr/src/{cache,config,doc,lfs,log_${MACHINE},src,ccache,distcc}
-       mkdir -p $LFS/{$INSTALLER_DIR,cdrom,images}
-       mkdir -p $LFS/etc
+       mkdir -p $LFS/{dev,etc,proc,sys} 2>/dev/null
+       mkdir -p $LFS/dev/pts 2>/dev/null
+       mkdir -p $LFS/usr/src/{cache,config,doc,lfs,log_${TARGET},src,ccache,distcc} 2>/dev/null
+       mkdir -p $LFS/{$INSTALLER_DIR,cdrom,images} 2>/dev/null
 
        mknod -m 600 $BASEDIR/build/dev/console c 5 1 2>/dev/null
        mknod -m 666 $BASEDIR/build/dev/null c 1 3 2>/dev/null
@@ -568,50 +495,50 @@ prepareenv() {
        # Make all sources and proc available under lfs build
        mount --bind /dev                                       $LFS/dev
        mount --bind /proc                                      $LFS/proc
+       mount --bind /sys                                       $LFS/sys
        mount --bind $BASEDIR/cache                             $LFS/usr/src/cache
        mount --bind $BASEDIR/ccache                            $LFS/usr/src/ccache
        mount --bind $BASEDIR/distcc                            $LFS/usr/src/distcc
        mount --bind $BASEDIR/config                            $LFS/usr/src/config
        mount --bind $BASEDIR/doc                               $LFS/usr/src/doc
        mount --bind $BASEDIR/lfs                               $LFS/usr/src/lfs
-       mount --bind $BASEDIR/log_${MACHINE}                    $LFS/usr/src/log_${MACHINE}
+       mount --bind $BASEDIR/log_${TARGET}                     $LFS/usr/src/log_${TARGET}
        mount --bind $BASEDIR/src                               $LFS/usr/src/src
-       mount --bind $BASEDIR/build_${MACHINE}/$TOOLS_DIR       $LFS/$TOOLS_DIR
-       mount --bind $BASEDIR/build_${MACHINE}/$CDROM_DIR       $LFS/$CDROM_DIR
+       mount --bind $BASEDIR/build_${TARGET}/$TOOLS_DIR        $LFS/$TOOLS_DIR
+       mount --bind $BASEDIR/build_${TARGET}/$CDROM_DIR        $LFS/$CDROM_DIR
+       mount --bind $BASEDIR/build_${TARGET}/$INSTALLER_DIR    $LFS/$INSTALLER_DIR
+       mount --bind $BASEDIR/build_${TARGET}/$IMAGES_DIR       $LFS/$IMAGES_DIR
 
        # Run LFS static binary creation scripts one by one
        export CCACHE_DIR=$BASEDIR/ccache
        export CCACHE_HASHDIR=1
-       if [ ! -z "$DISTCC_HOSTS" ]; then
-               export CCACHE_PREFIX="distcc"
-               export DISTCC_DIR=$BASEDIR/distcc
-       fi
-       
-       [ -z "$DISTCC_HOSTS" ] || echo "$DISTCC_HOSTS" > $DISTCC_DIR/hosts
+       export CCACHE_PREFIX="distcc"
+       export DISTCC_DIR=$BASEDIR/distcc
 
        # Remove pre-install list of installed files in case user erase some files before rebuild
        rm -f $LFS/usr/src/lsalr 2>/dev/null
 }
 
 build() {
-       clear
        #a prebuilt toolchain package is only used if found in cache
        if [ ! -d $BASEDIR/cache ]; then
-               exiterror "Use make.sh downloadsrc first!"
+               exiterror "Use make.sh source get first!"
        fi
        cd $BASEDIR/cache/toolchains
-       PACKAGE=`ls -v -r $TOOLCHAINNAME.tar.bz2 2> /dev/null | head -n 1`
+       PACKAGE=$(ls -v -r $TOOLCHAINNAME.tar.bz2 2>/dev/null | head -n 1)
        #only restore on a clean disk
 
-       local BLD_TIME_START=`date +%s`
-       touch $RUNNING; rm -f $FAILED 2>/dev/null
+       local BLD_TIME_START=$(date +%s)
+       touch $RUNNING; rm -f $FAILED $BUILD_SPY_FILENAME 2>/dev/null
 
        echo -ne "Building for ${BOLD}${TARGET} (${MACHINE}) on ${MACHINE_REAL}${NORMAL}\n"
 
-       build_spy_send_profile &
-       build_spy compiling
+       build_spy_send_profile
+       build_spy state compiling
+       build_spy start
+       distcc_get_hosts
 
-       if [ -f $BASEDIR/log_${MACHINE}/02_base/stage2-LFS ]; then
+       if [ -f $BASEDIR/log_${TARGET}/02_base/stage2-LFS ]; then
                prepareenv
                echo "Using installed toolchain" >> $LOGFILE
                beautify message DONE "Stage toolchain already built or extracted"
@@ -630,7 +557,10 @@ build() {
                        prepareenv
                fi
        fi
-       
+
+       # Run distcc daemon
+       distccd_start
+
        beautify build_stage "Building base"
        base_build
 
@@ -640,30 +570,35 @@ build() {
        beautify build_stage "Building miscellaneous"
        misc_build
 
+if [ "${EMB}" -eq "0" ]; then
        beautify build_stage "Building installer"
        installer_build
+fi
 
        beautify build_stage "Building packages"
        packages_build
        
        echo ""
        echo "... and all this hard work for this:"
-       ls -sh $BASEDIR/${SNAME}-${VERSION}.${MACHINE}.iso
+       ls -sh $BASEDIR/${IMAGENAME}.iso
 
-       local BLD_TIME_END=`date +%s`
-       build_spy set duration $[ $BLD_TIME_END - $BLD_TIME_START ]
-       build_spy idle
+       local BLD_TIME_END=$(date +%s)
+       build_spy duration $[ $BLD_TIME_END - $BLD_TIME_START ]
+       build_spy state idle
+       build_spy exit
        rm -f $RUNNING
 }
 
 gettoolchain() {
        check_user
+       DIR_TOOLCHAIN="$BASEDIR/cache/toolchains"
+       [ -d "${DIR_TOOLCHAIN}" ] || mkdir -p ${DIR_TOOLCHAIN}
        if [ ! -f $BASEDIR/cache/toolchains/$TOOLCHAINNAME.tar.bz2 ]; then
                URL_TOOLCHAIN=$(grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }')
                DIR_TOOLCHAIN="$BASEDIR/cache/toolchains"
 
-               echo "Loading toolchain for $MACHINE"
-               scp -2C ${IPFIRE_USER}@${URL_TOOLCHAIN}/$TOOLCHAINNAME.tar.bz2 \
+               echo "Loading toolchain for $TARGET"
+               scp -2 ${IPFIRE_USER}@${URL_TOOLCHAIN}/$TOOLCHAINNAME.tar.bz2 \
                        ${DIR_TOOLCHAIN}
        else
                echo -n "Toolchain \"$TOOLCHAINNAME\" is already existing"
@@ -677,8 +612,8 @@ puttoolchain() {
                URL_TOOLCHAIN=$(grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }')
                DIR_TOOLCHAIN="$BASEDIR/cache/toolchains"
 
-               echo "Pushing toolchain for $MACHINE"
-               scp -2C ${DIR_TOOLCHAIN}/$TOOLCHAINNAME.tar.bz2 \
+               echo "Pushing toolchain for $TARGET"
+               scp -2 ${DIR_TOOLCHAIN}/$TOOLCHAINNAME.tar.bz2 \
                        ${IPFIRE_USER}@${URL_TOOLCHAIN}
        else
                echo -n "Toolchain \"$TOOLCHAINNAME\" is not existing. "
@@ -691,7 +626,7 @@ getsource() {
        if [ ! -d $BASEDIR/cache ]; then
                mkdir -p $BASEDIR/cache/{tarballs,patches}
        fi
-       mkdir -p $BASEDIR/log_${MACHINE}
+       mkdir -p $BASEDIR/log_${TARGET}
        echo -e "${BOLD}Preload all source files${NORMAL}"
        cd $BASEDIR/lfs
        for i in *; do
@@ -699,9 +634,7 @@ getsource() {
                        make -s -f $i \
                        LFS_BASEDIR=$BASEDIR \
                        MESSAGE="$i\t" \
-                       SSP=$SSP \
-                       PIE=$PIE \
-                       PAX=$PAX download 2>> $LOGFILE
+                       download 2>> $LOGFILE
                        [ $? -ne 0 ] && beautify message FAIL
                fi
        done
@@ -718,6 +651,32 @@ putsource() {
                grep -q "$file" <<<$REMOTE_FILES && continue
                NEW_FILES="$NEW_FILES $file"
        done
-       [ -n "$NEW_FILES" ] && scp -2C $NEW_FILES ${IPFIRE_USER}@${URL_SOURCE}
+       [ -n "$NEW_FILES" ] && scp -2 $NEW_FILES ${IPFIRE_USER}@${URL_SOURCE}
        cd $BASEDIR
 }
+
+puttarget() {
+       check_user
+       URL_TARGET=$(grep URL_TARGET lfs/Config | awk '{ print $3 }')
+       DIR="${BASEDIR}/${HOSTNAME}/$(date '+%Y%m%d-%0k')-${TARGET}/"
+
+       # If there is no iso, we do nothing.
+       ls ${BASEDIR}/${IMAGENAME}.* &>/dev/null || return 0
+
+       rm -rf ${BASEDIR}/${HOSTNAME} 2>/dev/null
+       mkdir -p ${DIR}
+
+       [ -e "${BASEDIR}/packages" ] && cp -al ${BASEDIR}/packages ${DIR}
+       [ -e "${BATCHLOG}" ] && \
+               python ${BASEDIR}/tools/alog2html < ${BATCHLOG} > ${DIR}/build_log.html
+       pkg_list_packages > ${DIR}/packages-list.txt
+       git_log >/dev/null; cp -l ${BASEDIR}/doc/ChangeLog ${DIR}
+       git_export; cp -l ${BASEDIR}/${SNAME}-${VERSION}.source.tar.gz ${DIR}
+       git_diff >/dev/null && cp -l ${DIFF_NAME} ${DIR}
+       cp -l ${BASEDIR}/${IMAGENAME}.* ${DIR}
+
+       cd $BASEDIR && \
+               scp -2 -r ${HOSTNAME} ${IPFIRE_USER}@${URL_TARGET} || :
+
+       rm -rf ${BASEDIR}/${HOSTNAME} 2>/dev/null
+}