]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - tools/make-functions
make.sh: Calculate MAKETUNING depending on available memory
[ipfire-2.x.git] / tools / make-functions
index 08ac7a1a66aea32da0cf59aab059ba64727dcd0b..9cf2fcfb472f0f10da31c293e06fa1e99539924a 100644 (file)
@@ -60,6 +60,24 @@ WARN="\\033[1;35m"
 FAIL="\\033[1;31m"
 NORMAL="\\033[0;39m"
 
+system_processors() {
+       getconf _NPROCESSORS_ONLN 2>/dev/null || echo "1"
+}
+
+system_memory() {
+       local key val unit
+
+       while read -r key val unit; do
+               case "${key}" in
+                       MemTotal:*)
+                               # Convert to MB
+                               echo "$(( ${val} / 1024 ))"
+                               break
+                               ;;
+               esac
+       done < /proc/meminfo
+}
+
 configure_build() {
        local build_arch="${1}"
 
@@ -124,8 +142,34 @@ configure_build() {
        # Enables hardening
        HARDENING_CFLAGS="-Wp,-D_FORTIFY_SOURCE=2 -fstack-protector-strong --param=ssp-buffer-size=4"
 
-       CFLAGS="-O2 -pipe -Wall -fexceptions -fPIC ${CFLAGS_ARCH}"
+       CFLAGS="-O2 -Wall -fexceptions -fPIC ${CFLAGS_ARCH}"
+
+       # Run compiler and assembler simultaneously on systems that have enough memory
+       if [ ${HOST_MEM} -ge 1024 ]; then
+               CFLAGS="${CFLAGS} -pipe"
+       fi
+
        CXXFLAGS="${CFLAGS}"
+
+       # Determine parallelism
+       if [ -z "${MAKETUNING}" ]; then
+               # We assume that each process consumes about
+               # 192MB of memory. Therefore we find out how
+               # many processes fit into memory.
+               local mem_max=$(( ${HOST_MEM} / 192 ))
+
+               local processors="$(system_processors)"
+               local cpu_max=$(( ${processors} * 2 ))
+
+               local parallelism
+               if [ ${mem_max} -lt ${cpu_max} ]; then
+                       parallelism=${mem_max}
+               else
+                       parallelism=${cpu_max}
+               fi
+
+               MAKETUNING="-j${parallelism}"
+       fi
 }
 
 configure_build_guess() {
@@ -223,9 +267,9 @@ beautify()
                                LAST_STAGE_TIME=$[ `date +%s` - $STAGE_TIME_START ]
                        fi
                        STAGE_TIME_START=`date +%s`
-                       echo -ne "${BOLD}*** ${MESSAGE}${NORMAL}"
+                       echo -ne "${BOLD}*** (${BUILD_ARCH}) ${MESSAGE}${NORMAL}"
                        if [ "$LAST_STAGE_TIME" ]; then
-                               echo -ne "${DONE} (Last stage took $LAST_STAGE_TIME secs)${NORMAL}"
+                               echo -ne "${DONE} (Last stage took $LAST_STAGE_TIME secs)${NORMAL}\n"
                        fi
                        echo -ne "${BOLD}${SET_VER_COL}      version${SET_OPT_COL} options${SET_TIME_COL} time (sec)${SET_RESULT_COL} status${NORMAL}\n"
                        ;;
@@ -501,9 +545,12 @@ enterchroot() {
                TERM="${TERM}" \
                PS1="${PS1}" \
                PATH="${PATH}" \
+               SYSTEM_RELEASE="${SYSTEM_RELEASE}" \
+               PAKFIRE_CORE="${PAKFIRE_CORE}" \
                NAME="${NAME}" \
                SNAME="${SNAME}" \
                VERSION="${VERSION}" \
+               CORE="${CORE}" \
                SLOGAN="${SLOGAN}" \
                CONFIG_ROOT="${CONFIG_ROOT}" \
                CFLAGS="${CFLAGS} ${HARDENING_CFLAGS}" \
@@ -511,13 +558,14 @@ enterchroot() {
                BUILDTARGET="${BUILDTARGET}" \
                CROSSTARGET="${CROSSTARGET}" \
                BUILD_ARCH="${BUILD_ARCH}" \
+               BUILD_PLATFORM="${BUILD_PLATFORM}" \
                CCACHE_DIR=/usr/src/ccache \
                CCACHE_COMPRESS="${CCACHE_COMPRESS}" \
                CCACHE_COMPILERCHECK="${CCACHE_COMPILERCHECK}" \
                KVER="${KVER}" \
                $(fake_environ) \
                $(qemu_environ) \
-               $@
+               "$@"
 }
 
 entershell() {
@@ -603,21 +651,21 @@ lfsmake1() {
 
        cd $BASEDIR/lfs && env -i \
                PATH="/tools/ccache/bin:/tools/bin:$PATH" \
+               CCACHE_DIR="${CCACHE_DIR}" \
+               CCACHE_COMPRESS="${CCACHE_COMPRESS}" \
+               CCACHE_COMPILERCHECK="${CCACHE_COMPILERCHECK}" \
+               CFLAGS="${CFLAGS}" \
+               CXXFLAGS="${CXXFLAGS}" \
+               MAKETUNING="${MAKETUNING}" \
                make -f $* \
                        TOOLCHAIN=1 \
                        CROSSTARGET="${CROSSTARGET}" \
                        BUILDTARGET="${BUILDTARGET}" \
                        BUILD_ARCH="${BUILD_ARCH}" \
                        BUILD_PLATFORM="${BUILD_PLATFORM}" \
-                       CFLAGS="${CFLAGS}" \
-                       CXXFLAGS="${CXXFLAGS}" \
                        LFS_BASEDIR="${BASEDIR}" \
                        ROOT="${LFS}" \
                        KVER="${KVER}" \
-                       MAKETUNING="${MAKETUNING}" \
-                       CCACHE_DIR="${CCACHE_DIR}" \
-                       CCACHE_COMPRESS="${CCACHE_COMPRESS}" \
-                       CCACHE_COMPILERCHECK="${CCACHE_COMPILERCHECK}" \
                        install >> $LOGFILE 2>&1
 
        local COMPILE_SUCCESS=$?
@@ -637,72 +685,15 @@ lfsmake2() {
        lfsmakecommoncheck $*
        [ $? == 1 ] && return 0
 
-       # Install QEMU helper, if needed
-       qemu_install_helper
-
        local PKG_TIME_START=`date +%s`
-       chroot $LFS /tools/bin/env -i   HOME=/root \
-                                               TERM=$TERM PS1='\u:\w\$ ' \
-                                               PATH=/tools/ccache/bin:/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
-                                               VERSION=$VERSION PAKFIRE_CORE="${PAKFIRE_CORE}" \
-                                               SYSTEM_RELEASE="${SYSTEM_RELEASE}" \
-                                               CONFIG_ROOT=$CONFIG_ROOT \
-                                               NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
-                                               CFLAGS="${CFLAGS} ${HARDENING_CFLAGS}" \
-                                               CXXFLAGS="${CXXFLAGS} ${HARDENING_CFLAGS}" \
-                                               CCACHE_DIR=/usr/src/ccache \
-                                               CCACHE_COMPRESS="${CCACHE_COMPRESS}" \
-                                               CCACHE_COMPILERCHECK="${CCACHE_COMPILERCHECK}" \
-                                               KVER=$KVER MAKETUNING=$MAKETUNING \
-                                               BUILDTARGET="$BUILDTARGET" \
-                                               CROSSTARGET="${CROSSTARGET}" \
-                                               BUILD_ARCH="${BUILD_ARCH}" \
-                                               $(qemu_environ) \
-                                               $(fake_environ) \
-                                               /tools/bin/bash -x -c "cd /usr/src/lfs && \
-                                               make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
-       local COMPILE_SUCCESS=$?
-       local PKG_TIME_END=`date +%s`
-
-       if [ $COMPILE_SUCCESS -ne 0 ]; then
-               beautify result FAIL $[ $PKG_TIME_END - $PKG_TIME_START ]
-               exiterror "Building $*";
-       else
-               beautify result DONE $[ $PKG_TIME_END - $PKG_TIME_START ]
-       fi
-
-       return 0
-}
+       local PS1='\u:\w$ '
 
-ipfiremake() {
-       lfsmakecommoncheck $*
-       [ $? == 1 ] && return 0
-
-       # Install QEMU helper, if needed
-       qemu_install_helper
-
-       local PKG_TIME_START=`date +%s`
-       chroot $LFS /tools/bin/env -i   HOME=/root \
-                                               TERM=$TERM PS1='\u:\w\$ ' \
-                                               PATH=/tools/ccache/bin:/bin:/usr/bin:/sbin:/usr/sbin \
-                                               VERSION=$VERSION \
-                                               CORE=$CORE \
-                                               CONFIG_ROOT=$CONFIG_ROOT \
-                                               NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
-                                               SYSTEM_RELEASE="$SYSTEM_RELEASE" \
-                                               CFLAGS="${CFLAGS} ${HARDENING_CFLAGS}" \
-                                               CXXFLAGS="${CXXFLAGS} ${HARDENING_CFLAGS}" \
-                                               CCACHE_DIR=/usr/src/ccache \
-                                               CCACHE_COMPRESS="${CCACHE_COMPRESS}" \
-                                               CCACHE_COMPILERCHECK="${CCACHE_COMPILERCHECK}" \
-                                               KVER=$KVER MAKETUNING=$MAKETUNING \
-                                               BUILDTARGET="$BUILDTARGET" \
-                                               CROSSTARGET="${CROSSTARGET}" \
-                                               BUILD_ARCH="${BUILD_ARCH}" \
-                                               $(qemu_environ) \
-                                               $(fake_environ) \
-                                               /bin/bash -x -c "cd /usr/src/lfs && \
-                                               make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
+       enterchroot \
+               bash -x -c "cd /usr/src/lfs && \
+                       MAKETUNING=${MAKETUNING} \
+                       make -f $* \
+                       LFS_BASEDIR=/usr/src install" \
+               >> ${LOGFILE} 2>&1
 
        local COMPILE_SUCCESS=$?
        local PKG_TIME_END=`date +%s`
@@ -713,81 +704,27 @@ ipfiremake() {
        else
                beautify result DONE $[ $PKG_TIME_END - $PKG_TIME_START ]
        fi
+
        return 0
 }
 
 ipfiredist() {
        lfsmakecommoncheck $*
        [ $? == 1 ] && return 0
-       
-       # Install QEMU helper, if needed
-       qemu_install_helper
 
        local PKG_TIME_START=`date +%s`
-       chroot $LFS /tools/bin/env -i   HOME=/root \
-                                       TERM=$TERM PS1='\u:\w\$ ' \
-                                       PATH=/tools/ccache/bin:/bin:/usr/bin:/sbin:/usr/sbin \
-                                       VERSION=$VERSION \
-                                       CONFIG_ROOT=$CONFIG_ROOT \
-                                       NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
-                                       CFLAGS="${CFLAGS} ${HARDENING_CFLAGS}" \
-                                       CXXFLAGS="${CXXFLAGS} ${HARDENING_CFLAGS}" \
-                                       CCACHE_DIR=/usr/src/ccache \
-                                       CCACHE_COMPRESS="${CCACHE_COMPRESS}" \
-                                       CCACHE_COMPILERCHECK="${CCACHE_COMPILERCHECK}" \
-                                       KVER=$KVER \
-                                       BUILDTARGET="$BUILDTARGET" \
-                                       CROSSTARGET="${CROSSTARGET}" \
-                                       BUILD_ARCH="${BUILD_ARCH}" \
-                                       $(qemu_environ) \
-                                       $(fake_environ) \
-                                       /bin/bash -x -c "cd /usr/src/lfs && \
-                                       make -f $1 LFS_BASEDIR=/usr/src dist" >>$LOGFILE 2>&1
+       local PS1='\u:\w$ '
 
-       local COMPILE_SUCCESS=$?
-       local PKG_TIME_END=`date +%s`
-
-       if [ $COMPILE_SUCCESS -ne 0 ]; then
-               beautify result FAIL $[ $PKG_TIME_END - $PKG_TIME_START ]
-               exiterror "Packaging $*";
-       else
-               beautify result DONE $[ $PKG_TIME_END - $PKG_TIME_START ]
-       fi
-       return 0
-}
-
-installmake() {
-       lfsmakecommoncheck $*
-       [ $? == 1 ] && return 0
-
-       # Install QEMU helper, if needed
-       qemu_install_helper
-
-       local PKG_TIME_START=`date +%s`
-       chroot $LFS /tools/bin/env -i   HOME=/root \
-                                               TERM=$TERM PS1='\u:\w\$ ' \
-                                               PATH=/tools/ccache/bin:/bin:/usr/bin:/sbin:/usr/sbin \
-                                               VERSION=$VERSION \
-                                               SYSTEM_RELEASE="${SYSTEM_RELEASE}" \
-                                               CONFIG_ROOT=$CONFIG_ROOT \
-                                               NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \
-                                               CFLAGS="${CFLAGS} ${HARDENING_CFLAGS}" \
-                                               CXXFLAGS="${CXXFLAGS} ${HARDENING_CFLAGS}" \
-                                               CCACHE_DIR=/usr/src/ccache CCACHE_COMPRESS=1 CCACHE_HASHDIR=1 \
-                                               KVER=$KVER \
-                                               BUILDTARGET="$BUILDTARGET" \
-                                               CROSSTARGET="${CROSSTARGET}" \
-                                               BUILD_ARCH="${BUILD_ARCH}" \
-                                               LD_LIBRARY_PATH=/tools/lib \
-                   /tools/bin/bash -x -c "cd /usr/src/lfs && \
-                   /tools/bin/make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
+       enterchroot \
+               bash -x -c "cd /usr/src/lfs && make -f $* LFS_BASEDIR=/usr/src dist" \
+               >> ${LOGFILE} 2>&1
 
        local COMPILE_SUCCESS=$?
        local PKG_TIME_END=`date +%s`
 
        if [ $COMPILE_SUCCESS -ne 0 ]; then
                beautify result FAIL $[ $PKG_TIME_END - $PKG_TIME_START ]
-               exiterror "Building $*";
+               exiterror "Packaging $*";
        else
                beautify result DONE $[ $PKG_TIME_END - $PKG_TIME_START ]
        fi