#!/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