]> git.ipfire.org Git - ipfire-3.x.git/blobdiff - tools/make-include
Added new package: dosfstools.
[ipfire-3.x.git] / tools / make-include
index ac33deb49726c9c3aa495d2cbf18b14ae076f2f6..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 FULLVER lfs/linux | awk '{ print $3 }' | cut -c 7-| tail -1`
-MACHINE_REAL=`uname -m`
-GIT_TAG=$(git tag | tail -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
 
-###############################################################################
-#
-# Read the local configuration to override the environment variables
-#
-###############################################################################
-
-if [ -e .config ]; then
-       . $BASEDIR/.config
-fi
-
-
-###############################################################################
-#
-# 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"
-else
-       beautify message FAIL
-       echo "Not a valid target arch (i686|i586|i486|i386|via-c7|via-c3) - $TARGET"
-       exit 1
-fi
-
-mkdir $BASEDIR/log_${MACHINE}/ 2>/dev/null
-
-# Set up what used to be /tools
-TOOLS_DIR=/tools_${MACHINE}
-CTOOLS_DIR=/cross-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}
-
-###############################################################################
-#
-# Beautifying variables & presentation & input output interface
-#
-###############################################################################
-
-## Screen Dimentions
-# Find current screen size
-if [ -z "${COLUMNS}" ]; then
-       COLUMNS=$(stty size)
-       COLUMNS=${COLUMNS##* }
-fi
-
-# When using remote connections, such as a serial port, stty size returns 0
-if [ "${COLUMNS}" = "0" ]; then
-       COLUMNS=80
-fi
-
-## Measurements for positioning result messages
-RESULT_WIDTH=4
-TIME_WIDTH=8
-OPT_WIDTH=7
-VER_WIDTH=10
-RESULT_COL=$((${COLUMNS} - $RESULT_WIDTH - 4))
-TIME_COL=$((${RESULT_COL} - $TIME_WIDTH - 5))
-VER_COL=$((${TIME_COL} - $VER_WIDTH - 5))
-OPT_COL=$((${VER_COL} - $OPT_WIDTH - 5))
-
-## Set Cursur Position Commands, used via echo -e
-SET_RESULT_COL="\\033[${RESULT_COL}G"
-SET_TIME_COL="\\033[${TIME_COL}G"
-SET_VER_COL="\\033[${VER_COL}G"
-SET_OPT_COL="\\033[${OPT_COL}G"
-
-# Define color for messages
-BOLD="\\033[1;39m"
-DONE="\\033[1;32m"
-SKIP="\\033[1;34m"
-WARN="\\033[1;35m"
-FAIL="\\033[1;31m"
-NORMAL="\\033[0;39m"
+. $BASEDIR/tools/make-constants        # Load this very early
+. $BASEDIR/tools/make-beautify
 
+mkdir $BASEDIR/log_${TARGET}/ 2>/dev/null
 
 ################################################################################
 #                                                                              #
@@ -189,164 +53,58 @@ NORMAL="\\033[0;39m"
 #                                                                              #
 ################################################################################
 
+. $BASEDIR/tools/make-buildspy
+. $BASEDIR/tools/make-check
+. $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() {
-       if [ "$?" -eq "0" ]; then
+       RETVAL=$?
+       if [ "$RETVAL" -eq "0" ]; then
                beautify message DONE
        else
-               EXITCODE=$1
-               shift 1
                beautify message FAIL
-               $*
-               if [ $EXITCODE -ne "0" ]; then
-                       exit $EXITCODE
-               fi
        fi
+       (exit $RETVAL)
 }
 
-position_cursor()
-{
-       # ARG1=starting position on screen
-       # ARG2=string to be printed
-       # ARG3=offset, negative for left movement, positive for right movement, relative to ARG1
-       # For example if your starting position is column 50 and you want to print Hello three columns to the right
-       # of your starting position, your call will look like this:
-       # position_cursor 50 "Hello" 3 (you'll get the string Hello at position 53 (= 50 + 3)
-       # If on the other hand you want your string "Hello" to end three columns to the left of position 50,
-       # your call will look like this:
-       # position_cursor 50 "Hello" -3 (you'll get the string Hello at position 42 (= 50 - 5 -3)
-       # If you want to start printing at the exact starting location, use offset 0
-
-       START=$1
-       STRING=$2
-       OFFSET=$3
-
-       STRING_LENGTH=${#STRING}
-
-       if [ ${OFFSET} -lt 0 ]; then
-               COL=$((${START} + ${OFFSET} - ${STRING_LENGTH}))
-       else
-               COL=$((${START} + ${OFFSET}))
-       fi
-
-       SET_COL="\\033[${COL}G"
-
-       echo $SET_COL
-} # End of position_cursor()
-
-
-beautify()
-{
-       # Commands: build_stage, make_pkg, message, result
-       case "$1" in
-               message)
-                       MESSAGE="$3"
-                       case "$2" in
-                               DONE)
-                                       echo -ne "${BOLD}${MESSAGE}${NORMAL}${SET_RESULT_COL}[${DONE} DONE ${NORMAL}]\n"
-                                       ;;
-                               WARN)
-                                       echo -ne "${WARN}${MESSAGE}${NORMAL}${SET_RESULT_COL}[${WARN} WARN ${NORMAL}]\n"
-                                       ;;      
-                               FAIL)
-                                       echo -ne "${BOLD}${MESSAGE}${NORMAL}${SET_RESULT_COL}[${FAIL} FAIL ${NORMAL}]\n"
-                                       ;;
-                               SKIP)
-                                       echo -ne "${BOLD}${MESSAGE}${NORMAL}${SET_RESULT_COL}[${SKIP} SKIP ${NORMAL}]\n"
-                                       ;;
-                       esac
-                       ;;
-               build_stage)
-                       MESSAGE=$2
-                       echo -ne "${BOLD}*** ${MESSAGE}${SET_OPT_COL}  options${SET_VER_COL}     version "
-                       echo -ne "${SET_TIME_COL} time (sec)${SET_RESULT_COL} status${NORMAL}\n"
-                       ;;
-               make_pkg)
-                       echo "$2" | while read PKG_VER PROGRAM OPTIONS
-                       do
-                               SET_VER_COL_REAL=`position_cursor $TIME_COL $PKG_VER -3`
-
-                               echo -ne "${PROGRAM}"
-                               if ! [ "$OPTIONS" == "" ]; then
-                                       echo -ne "${SET_OPT_COL}[ ${BOLD}${OPTIONS}${NORMAL} ]"
-                               fi
-
-                               if [ "${PKG_VER}" == "${SNAME}" ] || [ "${PKG_VER}" == "LFS" ]; then
-                                       echo -ne "${SET_RESULT_COL}"
-                               else
-                                       echo -ne "${SET_VER_COL}[ ${BOLD}${SET_VER_COL_REAL}${PKG_VER}"
-                                       echo -ne "${NORMAL} ]${SET_RESULT_COL}"
-                               fi
-                       done
-                       ;;
-               result)
-                       RESULT=$2
-
-                       if [ ! $3 ]; then
-                               PKG_TIME=0
-                       else
-                               PKG_TIME=$3
-                       fi
-
-                       SET_TIME_COL_REAL=`position_cursor $RESULT_COL $PKG_TIME -3`
-                       case "$RESULT" in
-                               DONE)
-                                       echo -ne "${SET_TIME_COL}[ ${BOLD}${SET_TIME_COL_REAL}$PKG_TIME${NORMAL} ]"
-                                       echo -ne "${SET_RESULT_COL}[${DONE} DONE ${NORMAL}]\n"
-                                       ;;
-                               FAIL)
-                                       echo -ne "${SET_TIME_COL}[ ${BOLD}${SET_TIME_COL_REAL}$PKG_TIME${NORMAL} ]"
-                                       echo -ne "${SET_RESULT_COL}[${FAIL} FAIL ${NORMAL}]\n"
-                                       ;;
-                               SKIP)
-                                       echo -ne "${SET_TIME_COL}[ ${BOLD}${SET_TIME_COL_REAL}$PKG_TIME${NORMAL} ]"
-                                       echo -ne "${SET_RESULT_COL}[${SKIP} SKIP ${NORMAL}]\n"
-                                       ;;
-                       esac
-                       ;;
-       esac
-} # End of beautify()
-
-
-get_pkg_ver()
-{
-       PKG_VER=`grep ^VER $1 | awk '{print $3}'`
-
-       if [ -z $PKG_VER ]; then
-               PKG_VER=`grep "Exp " $1 | awk '{print $4}'`
-       fi
-
-       if [ ${#PKG_VER} -gt $VER_WIDTH ]; then
-               # If a package version number is greater than $VER_WIDTH, we keep the first 4 characters
-               # and replace enough characters to fit the resulting string on the screen.  We'll replace
-               # the extra character with .. (two dots).  That's why the "+ 2" in the formula below.
-               # Example: if we have a 21-long version number that we want to fit into a 10-long space,
-               # we have to remove 11 characters.  But if we replace 11 characters with 2 characters, we'll
-               # end up with a 12-character long string.  That's why we replace 12 characters with ..
-               REMOVE=`expr substr "$PKG_VER" 4 $[ ${#PKG_VER} - $VER_WIDTH + 2 ]`
-               PKG_VER=`echo ${PKG_VER/$REMOVE/..}`
-       fi
-
-       echo "$PKG_VER"
-} # End of get_pkg_ver()
-
 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
-       
-       beautify message FAIL
-       echo -ne "${FAIL}ERROR${NORMAL}: ${BOLD}$*${NORMAL}\n"
-       [ -z "$LOGFILE" ] || \
-       echo "       Check $LOGFILE for errors if applicable"
+       dialogerror $*
+       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     #
 ################################################################################
@@ -356,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"
        
@@ -386,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"
@@ -406,31 +166,77 @@ 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
 
+       distcc_reload &
+
        return 0        # pass all!
 } # End of lfsmakecommoncheck()
 
@@ -441,20 +247,20 @@ 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 \
                TOOLS_DIR=$TOOLS_DIR \
-               CTOOLS_DIR=$CTOOLS_DIR \
                MACHINE="$MACHINE" \
                MACHINE_REAL="$MACHINE_REAL" \
                IFS_HOST="$IFS_HOST" \
                IFS_TARGET="$IFS_TARGET" \
+               TARGET="$TARGET" \
                LFS_BASEDIR=$BASEDIR \
                LFS=$LFS \
                INSTALLER_DIR=$INSTALLER_DIR \
@@ -465,13 +271,14 @@ toolchain_make() {
                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
@@ -484,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
@@ -494,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 \
@@ -525,31 +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 \
-               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
@@ -559,15 +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?                                           #
@@ -592,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
@@ -600,45 +399,58 @@ prepareenv() {
        fi
        
        # 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
-               beautify message FAIL
-       fi
-  fi
+       if [ -x /usr/bin/schedtool ]; then
+               /usr/bin/schedtool -B $$
+               if [ $? -ne 0 ]; then
+                       echo -ne "Setting kernel schedular to SCHED_BATCH"
+                       beautify message FAIL
+               fi
+       fi
 
        ##############################################################################
        # 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
+       fi
+
+       ##############################################################################
+       # Embedded build                                                             #
+       ##############################################################################
+
+       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 DONE
+               beautify message OFF
        fi
 
+       export EMB
+
+       ##############################################################################
+       # Checking CPU features                                                      #
+       ##############################################################################
+
+       check_supported_target $TARGET || \
+               exiterror "Your host doesn't have all needed cpu features for building \"$TARGET\""
 
        ##############################################################################
        # Building Linux From Scratch system configuration                           #
@@ -648,29 +460,18 @@ 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 /
+       if [ ! -a $TOOLS_DIR ]; then
+               ln -s $BASEDIR/build_${TARGET}/$TOOLS_DIR /
        fi
        if [ ! -h $TOOLS_DIR ]; then
                exiterror "Could not create $TOOLS_DIR symbolic link."
        fi
-       
-       # Check /ctools symlink
-       if [ -h $CTOOLS_DIR ]; then
-               rm -f $CTOOLS_DIR
-       fi
-  if [ ! -a $CTOOLS_DIR ]; then
-               ln -s $BASEDIR/build_${MACHINE}/$CTOOLS_DIR /
-       fi
-       if [ ! -h $CTOOLS_DIR ]; then
-               exiterror "Could not create $CTOOLS_DIR symbolic link."
-       fi
 
        # Setup environment
        set +h
@@ -679,15 +480,14 @@ prepareenv() {
        unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD
 
        # Make some extra directories
-       mkdir -p $BASEDIR/build_${MACHINE}/{$TOOLS_DIR,$CTOOLS_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 2>/dev/null
-       mkdir -p $LFS/{$TOOLS_DIR/usr,$CTOOLS_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 $BASEDIR/cache/{toolchains,patches,tarballs} 2>/dev/null
+       mkdir -p $LFS/{$TOOLS_DIR,usr/src} 2>/dev/null
+       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
@@ -695,45 +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}/$CTOOLS_DIR      $LFS/$CTOOLS_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 $BUILD_SPY_FILENAME 2>/dev/null
+
        echo -ne "Building for ${BOLD}${TARGET} (${MACHINE}) on ${MACHINE_REAL}${NORMAL}\n"
-       
-       if [ -f $BASEDIR/log_${MACHINE}/02_base/stage2-LFS ]; then
+
+       build_spy_send_profile
+       build_spy state compiling
+       build_spy start
+       distcc_get_hosts
+
+       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"
@@ -741,8 +546,7 @@ build() {
                if [ -z "$PACKAGE" ]; then
                        echo "Full toolchain compilation"
                        prepareenv
-                       
-                       . $BASEDIR/tools/make-check
+
                        check_toolchain
                        
                        beautify build_stage "Building toolchain"
@@ -753,7 +557,10 @@ build() {
                        prepareenv
                fi
        fi
-       
+
+       # Run distcc daemon
+       distccd_start
+
        beautify build_stage "Building base"
        base_build
 
@@ -763,13 +570,113 @@ 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 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 $TARGET"
+               scp -2 ${IPFIRE_USER}@${URL_TOOLCHAIN}/$TOOLCHAINNAME.tar.bz2 \
+                       ${DIR_TOOLCHAIN}
+       else
+               echo -n "Toolchain \"$TOOLCHAINNAME\" is already existing"
+               beautify message SKIP
+       fi
+}
+
+puttoolchain() {
+       check_user
+       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 "Pushing toolchain for $TARGET"
+               scp -2 ${DIR_TOOLCHAIN}/$TOOLCHAINNAME.tar.bz2 \
+                       ${IPFIRE_USER}@${URL_TOOLCHAIN}
+       else
+               echo -n "Toolchain \"$TOOLCHAINNAME\" is not existing. "
+               echo -n "Run \"./make.sh build\", first"
+               beautify message SKIP
+       fi
+}
+
+getsource() {
+       if [ ! -d $BASEDIR/cache ]; then
+               mkdir -p $BASEDIR/cache/{tarballs,patches}
+       fi
+       mkdir -p $BASEDIR/log_${TARGET}
+       echo -e "${BOLD}Preload all source files${NORMAL}"
+       cd $BASEDIR/lfs
+       for i in *; do
+               if [ -f "$i" -a "$i" != "Config" ]; then
+                       make -s -f $i \
+                       LFS_BASEDIR=$BASEDIR \
+                       MESSAGE="$i\t" \
+                       download 2>> $LOGFILE
+                       [ $? -ne 0 ] && beautify message FAIL
+               fi
+       done
+       cd $BASEDIR
+}
+
+putsource() {
+       check_user
+       URL_SOURCE=$(grep URL_SOURCE lfs/Config | awk '{ print $3 }')
+       REMOTE_FILES=$(echo "ls -1" | sftp -C ${IPFIRE_USER}@${URL_SOURCE})
+
+       cd $BASEDIR/cache/tarballs/
+       for file in $(ls -1); do
+               grep -q "$file" <<<$REMOTE_FILES && continue
+               NEW_FILES="$NEW_FILES $file"
+       done
+       [ -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
 }