X-Git-Url: http://git.ipfire.org/?p=ipfire-2.x.git;a=blobdiff_plain;f=tools%2Fmake-functions;h=738675027237b88c60568d9d326c9965843ee41f;hp=48fc6d434dd5ef0e7c5535800f73df6d383edb8a;hb=764a3f1ff2384f34c592c311f5435a24eb6a53c8;hpb=ba263fbbb9d10ceab94ffe6640e164e7c9423e51 diff --git a/tools/make-functions b/tools/make-functions index 48fc6d434d..7386750272 100644 --- a/tools/make-functions +++ b/tools/make-functions @@ -60,6 +60,73 @@ WARN="\\033[1;35m" FAIL="\\033[1;31m" NORMAL="\\033[0;39m" +configure_target() { + local target_arch="${1}" + + if [ "${target_arch}" = "default" ]; then + target_arch="$(configure_target_guess)" + fi + + case "${target_arch}" in + x86_64) + BUILDTARGET="${target_arch}-unknown-linux-gnu" + CROSSTARGET="${target_arch}-cross-linux-gnu" + CFLAGS_ARCH="-m64 -mtune=generic" + ;; + + i586) + BUILDTARGET="${target_arch}-pc-linux-gnu" + CROSSTARGET="${target_arch}-cross-linux-gnu" + CFLAGS_ARCH="-march=i586 -mtune=generic -fomit-frame-pointer" + ;; + + armv5tel) + BUILDTARGET="${target_arch}-unknown-linux-gnueabi" + CROSSTARGET="${target_arch}-cross-linux-gnueabi" + CFLAGS_ARCH="-march=armv5te -mfloat-abi=soft -fomit-frame-pointer" + MACHINE_TYPE="arm" + ;; + + *) + exiterror "Cannot build for architure ${target_arch}" + ;; + esac + + # Check if the QEMU helper is available if needed. + if qemu_is_required "${target_arch}"; then + local qemu_target_helper="$(qemu_find_target_helper_name "${target_arch}")" + + if [ -n "${qemu_target_helper}" ]; then + QEMU_TARGET_HELPER="${qemu_target_helper}" + else + exiterror "Could not find a binfmt_misc helper entry for ${target_arch}" + fi + fi + + TARGET_ARCH="${target_arch}" + + # Old variable names + MACHINE="${TARGET_ARCH}" + + CFLAGS="-O2 -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fPIC" + CFLAGS="${CFLAGS} -fstack-protector-all --param=ssp-buffer-size=4 ${CFLAGS_ARCH}" + CXXFLAGS="${CFLAGS}" +} + +configure_target_guess() { + case "${BUILD_ARCH}" in + x86_64|i686|i586) + echo "i586" + ;; + armv7*|armv6*|armv5*) + echo "armv5tel" + ;; + *) + exiterror "Cannot guess target architecture" + ;; + esac +} + evaluate() { if [ "$?" -eq "0" ]; then beautify message DONE @@ -217,30 +284,6 @@ get_pkg_ver() echo "$PKG_VER" } # End of get_pkg_ver() -if [ 'x86_64' = $MACHINE -o 'i686' = $MACHINE -o 'i586' = $MACHINE ]; then - echo "`date -u '+%b %e %T'`: Machine is iX86 (or equivalent)" >> $LOGFILE - MACHINE=i586 - CROSSTARGET=${MACHINE}-cross-linux-gnu - BUILDTARGET=i586-pc-linux-gnu - CFLAGS_ARCH="${GLOBAL_CFLAGS} -march=i586 -fomit-frame-pointer" -elif [ 'armv5tejl' = $MACHINE -o 'armv5tel' = $MACHINE -o 'armv6l' = $MACHINE -o 'armv7l' = $MACHINE ]; then - echo "`date -u '+%b %e %T'`: Machine is ARM (or equivalent)" >> $LOGFILE - MACHINE=armv5tel - MACHINE_TYPE=arm - CROSSTARGET=${MACHINE}-cross-linux-gnueabi - BUILDTARGET=${MACHINE}-unknown-linux-gnueabi - CFLAGS_ARCH="-march=armv5te -mfloat-abi=soft -fomit-frame-pointer" -else - echo "`date -u '+%b %e %T'`: Can't determine your architecture - $MACHINE" - exit 1 -fi - -CFLAGS="-O2 -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fPIC" -CFLAGS="${CFLAGS} -fstack-protector-all --param=ssp-buffer-size=4 ${CFLAGS_ARCH}" -CXXFLAGS="${CFLAGS}" -C2FLAGS="${CFLAGS}" -CXX2FLAGS="${CXXFLAGS}" - # Define immediately stdumount() { umount $BASEDIR/build/sys 2>/dev/null; @@ -282,33 +325,161 @@ fake_environ() { env="${env} UTS_RELEASE=${KVER}" # Fake machine version. - env="${env} UTS_MACHINE=${MACHINE}" + env="${env} UTS_MACHINE=${TARGET_ARCH}" echo "${env}" } +qemu_environ() { + local env + + # Don't add anything if qemu is not used. + if ! qemu_is_required; then + return + fi + + # Set default qemu options + case "${TARGET_ARCH}" in + arm*) + QEMU_CPU="${QEMU_CPU:-cortex-a9}" + + env="${env} QEMU_CPU=${QEMU_CPU}" + ;; + esac + + # Enable QEMU strace + #env="${env} QEMU_STRACE=1" + + echo "${env}" +} + +qemu_is_required() { + local target_arch="${1}" + + if [ -z "${target_arch}" ]; then + target_arch="${TARGET_ARCH}" + fi + + case "${BUILD_ARCH},${target_arch}" in + x86_64,arm*|i?86,arm*|i?86,x86_64) + return 0 + ;; + *) + return 1 + ;; + esac +} + +qemu_install_helper() { + # Do nothing, if qemu is not required + if ! qemu_is_required; then + return 0 + fi + + if [ ! -e /proc/sys/fs/binfmt_misc/status ]; then + exiterror "binfmt_misc not mounted. QEMU_TARGET_HELPER not useable." + fi + + if [ ! $(cat /proc/sys/fs/binfmt_misc/status) = 'enabled' ]; then + exiterror "binfmt_misc not enabled. QEMU_TARGET_HELPER not useable." + fi + + + if [ -z "${QEMU_TARGET_HELPER}" ]; then + exiterror "QEMU_TARGET_HELPER not set" + fi + + # Check if the helper is already installed. + if [ -x "${LFS}${QEMU_TARGET_HELPER}" ]; then + return 0 + fi + + # Try to find a suitable binary that we can install + # to the build environment. + local file + for file in "${QEMU_TARGET_HELPER}" "${QEMU_TARGET_HELPER}-static"; do + # file must exist and be executable. + [ -x "${file}" ] || continue + + # Must be static. + file_is_static "${file}" || continue + + local dirname="${LFS}$(dirname "${file}")" + mkdir -p "${dirname}" + + install -m 755 "${file}" "${LFS}${QEMU_TARGET_HELPER}" + return 0 + done + + exiterror "Could not find a statically-linked QEMU emulator: ${QEMU_TARGET_HELPER}" +} + +qemu_find_target_helper_name() { + local target_arch="${1}" + + local magic + case "${target_arch}" in + arm*) + magic="7f454c4601010100000000000000000002002800" + ;; + x86_64) + magic="7f454c4602010100000000000000000002003e00" + ;; + esac + + [ -z "${magic}" ] && return 1 + + local file + for file in /proc/sys/fs/binfmt_misc/*; do + # skip write only register entry + [ $(basename "${file}") = "register" ] && continue + # Search for the file with the correct magic value. + grep -qE "^magic ${magic}$" "${file}" || continue + + local interpreter="$(grep "^interpreter" "${file}" | awk '{ print $2 }')" + + [ -n "${interpreter}" ] || continue + [ "${interpreter:0:1}" = "/" ] || continue + [ -x "${interpreter}" ] || continue + + echo "${interpreter}" + return 0 + done + + return 1 +} + +file_is_static() { + local file="${1}" + + file ${file} 2>/dev/null | grep -q "statically linked" +} + entershell() { if [ ! -e $BASEDIR/build/usr/src/lfs/ ]; then exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/" fi + # Install QEMU helper, if needed + qemu_install_helper + 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\$ ' \ + chroot $LFS /tools/bin/env -i HOME=/root TERM=$TERM PS1='ipfire build chroot ($(uname -m)) \u:\w\$ ' \ PATH=/tools/ccache/bin:/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \ VERSION=$VERSION CONFIG_ROOT=$CONFIG_ROOT \ NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \ - CFLAGS="$CF2LAGS" CXXFLAGS="$CXX2FLAGS" \ + CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" \ CCACHE_DIR=/usr/src/ccache \ - CCACHE_COMPRESS=1 \ - CCACHE_COMPILERCHECK="none" \ + CCACHE_COMPRESS="${CCACHE_COMPRESS}" \ + CCACHE_COMPILERCHECK="${CCACHE_COMPILERCHECK}" \ KVER=$KVER \ BUILDTARGET="$BUILDTARGET" \ CROSSTARGET="${CROSSTARGET}" \ MACHINE="$MACHINE" \ MACHINE_TYPE="$MACHINE_TYPE" \ - KGCC="ccache /usr/bin/gcc" \ $(fake_environ) \ - /tools/bin/bash + $(qemu_environ) \ + /tools/bin/bash -i if [ $? -ne 0 ]; then beautify message FAIL exiterror "chroot error" @@ -410,6 +581,9 @@ 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\$ ' \ @@ -418,14 +592,16 @@ lfsmake2() { SYSTEM_RELEASE="${SYSTEM_RELEASE}" \ CONFIG_ROOT=$CONFIG_ROOT \ NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \ - CFLAGS="$C2FLAGS" CXXFLAGS="$CXX2FLAGS" \ - CCACHE_DIR=/usr/src/ccache CCACHE_COMPRESS=1 \ - CCACHE_COMPILERCHECK="none" \ + CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" \ + CCACHE_DIR=/usr/src/ccache \ + CCACHE_COMPRESS="${CCACHE_COMPRESS}" \ + CCACHE_COMPILERCHECK="${CCACHE_COMPILERCHECK}" \ KVER=$KVER MAKETUNING=$MAKETUNING \ BUILDTARGET="$BUILDTARGET" \ CROSSTARGET="${CROSSTARGET}" \ MACHINE="$MACHINE" \ MACHINE_TYPE="$MACHINE_TYPE" \ + $(qemu_environ) \ $(fake_environ) \ /tools/bin/bash -x -c "cd /usr/src/lfs && \ make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1 @@ -446,6 +622,9 @@ 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\$ ' \ @@ -455,14 +634,16 @@ ipfiremake() { CONFIG_ROOT=$CONFIG_ROOT \ NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \ SYSTEM_RELEASE="$SYSTEM_RELEASE" \ - CFLAGS="$C2FLAGS" CXXFLAGS="$CXX2FLAGS" \ - CCACHE_DIR=/usr/src/ccache CCACHE_COMPRESS=1 \ - CCACHE_COMPILERCHECK="none" \ + CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" \ + CCACHE_DIR=/usr/src/ccache \ + CCACHE_COMPRESS="${CCACHE_COMPRESS}" \ + CCACHE_COMPILERCHECK="${CCACHE_COMPILERCHECK}" \ KVER=$KVER MAKETUNING=$MAKETUNING \ BUILDTARGET="$BUILDTARGET" \ CROSSTARGET="${CROSSTARGET}" \ MACHINE="$MACHINE" \ MACHINE_TYPE="$MACHINE_TYPE" \ + $(qemu_environ) \ $(fake_environ) \ /bin/bash -x -c "cd /usr/src/lfs && \ make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1 @@ -483,6 +664,9 @@ 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\$ ' \ @@ -490,14 +674,16 @@ ipfiredist() { VERSION=$VERSION \ CONFIG_ROOT=$CONFIG_ROOT \ NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \ - CFLAGS="$C2FLAGS" CXXFLAGS="$CXX2FLAGS" \ - CCACHE_DIR=/usr/src/ccache CCACHE_COMPRESS=1 \ - CCACHE_COMPILERCHECK="none" \ + CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" \ + CCACHE_DIR=/usr/src/ccache \ + CCACHE_COMPRESS="${CCACHE_COMPRESS}" \ + CCACHE_COMPILERCHECK="${CCACHE_COMPILERCHECK}" \ KVER=$KVER \ BUILDTARGET="$BUILDTARGET" \ CROSSTARGET="${CROSSTARGET}" \ MACHINE="$MACHINE" \ MACHINE_TYPE="$MACHINE_TYPE" \ + $(qemu_environ) \ $(fake_environ) \ /bin/bash -x -c "cd /usr/src/lfs && \ make -f $1 LFS_BASEDIR=/usr/src dist" >>$LOGFILE 2>&1 @@ -518,6 +704,9 @@ 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\$ ' \ @@ -526,7 +715,7 @@ installmake() { SYSTEM_RELEASE="${SYSTEM_RELEASE}" \ CONFIG_ROOT=$CONFIG_ROOT \ NAME="$NAME" SNAME="$SNAME" SLOGAN="$SLOGAN" \ - CFLAGS="-Os" CXXFLAGS="-Os" \ + CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" \ CCACHE_DIR=/usr/src/ccache CCACHE_COMPRESS=1 CCACHE_HASHDIR=1 \ KVER=$KVER \ BUILDTARGET="$BUILDTARGET" \ @@ -560,6 +749,7 @@ update_langs() { $BASEDIR/tools/sort_strings.pl ru $BASEDIR/tools/sort_strings.pl nl $BASEDIR/tools/sort_strings.pl tr + $BASEDIR/tools/sort_strings.pl it $BASEDIR/tools/check_strings.pl en > $BASEDIR/doc/language_issues.en $BASEDIR/tools/check_strings.pl de > $BASEDIR/doc/language_issues.de $BASEDIR/tools/check_strings.pl fr > $BASEDIR/doc/language_issues.fr @@ -568,6 +758,22 @@ update_langs() { $BASEDIR/tools/check_strings.pl ru > $BASEDIR/doc/language_issues.ru $BASEDIR/tools/check_strings.pl nl > $BASEDIR/doc/language_issues.nl $BASEDIR/tools/check_strings.pl tr > $BASEDIR/doc/language_issues.tr + $BASEDIR/tools/check_strings.pl it > $BASEDIR/doc/language_issues.it $BASEDIR/tools/check_langs.sh > $BASEDIR/doc/language_missings beautify message DONE + + echo -ne "Updating language lists..." + update_language_list ${BASEDIR}/src/installer/po + update_language_list ${BASEDIR}/src/setup/po + beautify message DONE +} + +update_language_list() { + local path="${1}" + + local lang + for lang in ${path}/*.po; do + lang="$(basename "${lang}")" + echo "${lang%*.po}" + done | sort -u > "${path}/LINGUAS" }