diff options
Diffstat (limited to 'extra/scripts/MAKEALL')
| -rwxr-xr-x | extra/scripts/MAKEALL | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/extra/scripts/MAKEALL b/extra/scripts/MAKEALL new file mode 100755 index 000000000..f46d3bd66 --- /dev/null +++ b/extra/scripts/MAKEALL @@ -0,0 +1,146 @@ +#!/bin/sh +# +# helper script to quick build testing with cross-compilers +# + +: ${MAKE:=make} + +: ${BUILD_NCPUS:=$(getconf _NPROCESSORS_ONLN)} +if [ "$BUILD_NCPUS" -gt 1 ] ; then + JOBS=-j$((BUILD_NCPUS + 1)) +else + JOBS="" +fi +MAKE="${MAKE} ${JOBS}" + +: ${CROSS_COMPILE:=${CROSS_COMPILER_PREFIX}} + +setconfig() +{ + local opt=$1 + shift + case $1 in + [yn]) ;; + [0-9]*) ;; + *) set -- '"'$*'"' + esac + sed -i \ + -e "/${opt}=/s:=.*:=$*:" \ + .config + echo " ## setconfig ${opt} $*" +} + +get_arches() +{ + case $1 in + hppa) echo hppa hppa2.0 hppa1.1 hppa1.0;; + i386) echo i386 i486 i586 i686;; + sh) echo sh4 sh2 sh3 sh1 sh;; + sparc) echo sparc sparc64;; + *) echo $1;; + esac +} + +find_compiler() +{ + local t a v o l + for a in $(get_arches $1) ; do + for l in uclibc gnu gnueabi "" ; do + for v in unknown pc gentoo "" ; do + for o in linux uclinux "" ; do + t="${a}${v:+-${v}}${o:+-${o}}${l:+-${l}}" + if ${t}-gcc --help > /dev/null 2>&1 ; then + echo ${t}- + return 0 + fi + done + done + done + done +} + +do_make() +{ + echo " ## ${MAKE} -s $*" + ${MAKE} -s "$@" +} + +mark_arch() +{ + local r=$1 a=$2 + eval $r=\"\$$r $a\" +} + +if [ -z "$*" ] ; then + set -- $(awk \ + '$0 ~ /^config TARGET_/ { sub("TARGET_",""); print $NF }' \ + extra/Configs/Config.in | grep -v SUBARCH) +fi +pass="" +fail="" +skip="" +for a in "$@" ; do + if [ -z "${CROSS_COMPILE}" ] ; then + CROSS_COMPILE=$(find_compiler ${a}) + fi + + if [ -z "${CROSS_COMPILE}" ] ; then + mark_arch skip $a + echo " ### SKIP: ${a}: could not find compiler" + continue + fi + + rm -f ${a}.log ${a}.fail + ( + set -e + + echo " ### Building target ${a} (${CROSS_COMPILE})" + + do_make distclean + do_make ARCH=$a defconfig + do_make oldconfig + + setconfig CROSS_COMPILER_PREFIX ${CROSS_COMPILE} + + header_path=${KERNEL_HEADERS:-$(echo '#include <linux/version.h>' | ${CROSS_COMPILE}cpp 2>/dev/null | grep -o '[^"]*linux/version.h')} || : + if [ -z "${header_path}" ] ; then + for p in /usr/${CROSS_COMPILE%-}/usr/include ; do + if [ -e ${p}/linux/version.h ] ; then + header_path=${p} + break + fi + done + if [ -z "${header_path}" ] ; then + echo " ## unable to locate KERNEL_HEADERS" + fi + fi + setconfig KERNEL_HEADERS ${header_path%/linux/version.h} + + if do_make ; then + echo " ## PASS" + else + echo " ## FAIL" + touch ${a}.fail + fi + ) 2>&1 | tee ${a}.log + + if [ -e ${a}.fail ] ; then + rm -f ${a}.fail + mark_arch fail $a + else + mark_arch pass $a + fi + + unset CROSS_COMPILE +done + +if [ -n "${skip}" ] ; then + printf '\nSKIPPED: %s\n' "${skip}" +fi +if [ -n "${fail}" ] ; then + printf '\nPASSED: %s\nFAILED: %s\n\n' "${pass}" "${fail}" + exit 1 +else + printf '\nAll arches passed!\n\n' + exit 0 +fi |
