diff options
author | Waldemar Brodkorb <wbx@openadk.org> | 2014-08-01 12:48:55 +0200 |
---|---|---|
committer | Waldemar Brodkorb <wbx@openadk.org> | 2014-08-01 12:48:55 +0200 |
commit | 6e7f08f89eeb067f956902f4373713e52df1b6a5 (patch) | |
tree | 7acc1d70d59177105982ff2e4d420c37c251ba75 |
new import of embedded-test.sh, successor of uclibc-ng-test.sh
-rw-r--r-- | README | 24 | ||||
-rwxr-xr-x | embedded-test.sh | 718 |
2 files changed, 742 insertions, 0 deletions
@@ -0,0 +1,24 @@ +Embedded Test Framework +======================= + +This is the third incarnation of my embedded test framework. + +It started with the concrete idea of musl libc author Rich Felker +on the musl-libc mailing-list. +http://www.openwall.com/lists/musl/2013/12/03/26 + +After that I implemented musl-test-framework which is no longer +online available. It was just to test musl. The next incarnation +was adk-test-framework, which tries to be more flexible regarding +what project should be tested. + +Both solutions required binary kernel and initramfs for the Qemu +runtime tests and toolchains for the compiling. + +The third incarnation now uses either OpenADK or buildroot to +build a toolchain, the base system and the C library. +Then it runs either a libc test suite, the ltp project or +a native compile of a toolchain. More tests can be impemented +later. + +Have fun diff --git a/embedded-test.sh b/embedded-test.sh new file mode 100755 index 0000000..b31fa83 --- /dev/null +++ b/embedded-test.sh @@ -0,0 +1,718 @@ +#!/bin/sh +# Copyright © 2014 +# Waldemar Brodkorb <wbx@openadk.org> +# +# Provided that these terms and disclaimer and all copyright notices +# are retained or reproduced in an accompanying document, permission +# is granted to deal in this work without restriction, including un‐ +# limited rights to use, publicly perform, distribute, sell, modify, +# merge, give away, or sublicence. +# +# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to +# the utmost extent permitted by applicable law, neither express nor +# implied; without malicious intent or gross negligence. In no event +# may a licensor, author or contributor be held liable for indirect, +# direct, other damage, loss, or other issues arising in any way out +# of dealing in the work, even if advised of the possibility of such +# damage or existence of a defect, except proven that it results out +# of said person’s immediate fault when using the work as intended. +# +# Alternatively, this work may be distributed under the Terms of the +# General Public License, any version as published by the Free Soft‐ +# ware Foundation. + +# architecture specific notes: +# mips64n32/mips64eln32 produces segfaults on boot +# xtensa needs uImage format for initrd +# sheb network card get no ip + +ADK_ARCH_LIST="arm armhf m68k-nommu mips mipsel mips64 mips64eln32 mips64n32 mips64n64 mips64el mips64el mips64eln64 ppc-nofpu sh sheb sparc x86 x86_64 xtensa" +BR_ARCH_LIST="bfin arm mips mipsel mips64 mips64el ppc sh sparc x86 x86_64 xtensa" + +topdir=$(pwd) + +tools='make git wget xz cpio tar awk sed' +f=0 +for tool in $tools; do + if ! which $tool >/dev/null; then + echo "Checking if $tool is installed... failed" + f=1 + fi +done +if [ $f -eq 1 ];then exit 1; fi + +help() { + cat >&2 <<EOF +Syntax: $0 -a <arch> -v <vendor> -s <source> + +Explanation: + -a: architecture to check + -v: vendor for buildsystem (openadk|buildroot) + -u: update vendor source via git pull + -s: use directory with source for C library + -d: enable debug + -c: clean build directory before build + -n: set NTP server for test run + -b: only run basic bootup test + -t: run libc testsuite + -p: run Linux test project (LTP) + -h: help text +EOF + +} + +clean=0 +shell=0 +update=0 +debug=0 +boot=0 +ltp=0 +test=0 +gcc=0 + +ntp=time.fu-berlin.de +libc=uclibc-ng +vendor=openadk + +while getopts "hgptumdcbn:a:v:s:l:" ch; do + case $ch in + b) + boot=1 + ;; + p) + ltp=1 + ;; + t) + test=1 + ;; + m) + shell=1 + ;; + g) + gcc=1 + ;; + c) + clean=1 + ;; + u) + update=1 + ;; + s) + source=$OPTARG + ;; + d) + debug=1 + ;; + l) + libc=$OPTARG + ;; + n) + ntp=$OPTARG + ;; + a) + archlist=$OPTARG + ;; + v) + vendor=$OPTARG + ;; + h) + help + exit 1 + ;; + esac +done +shift $((OPTIND - 1)) + +case $libc in + uclibc-ng) + version=1.0.0beta5 + libver=uClibc-ng-${version} + ;; + uclibc) + version=0.9.33.2 + libver=uClibc-${version} + ;; + glibc) + version=2.19 + libver=glibc-${version} + ;; + musl) + version=1.1.4 + libver=musl-${version} + ;; + *) + echo "c library not supported" + exit 1 +esac + +if [ -z $archlist ];then + if [ $vendor = "openadk" ];then + archlist=$ADK_ARCH_LIST + fi + if [ $vendor = "buildroot" ];then + archlist=$BR_ARCH_LIST + fi +fi + +case $vendor in + openadk) + echo "Using OpenADK to check $libc on $archlist" + vendor_git=http://git.openadk.org/openadk.git + ;; + buildroot) + echo "Using buildroot to check $libc on $archlist" + vendor_git=http://git.buildroot.net/git/buildroot.git + ;; + *) + echo "Vendor $vendor not supported" + exit 1 + ;; +esac + +if [ ! -d $vendor ];then + git clone $vendor_git + if [ $? -ne 0 ];then + echo "Cloning from $vendor_git failed." + exit 1 + fi + if [ "$vendor" = "buildroot" ];then + wget http://downloads.uclibc-ng.org/buildroot-uClibc-ng.patch + (cd buildroot && patch -p1 <../buildroot-uClibc-ng.patch) + fi +else + if [ $update -eq 1 ];then + (cd $vendor && git pull) + if [ $? -ne 0 ];then + echo "Updating from $vendor_git failed." + exit 1 + fi + fi +fi + +if [ ! -z $source ];then + usrc=$(mktemp -d /tmp/XXXX) + cp -a $source $usrc/$libver + echo "Creating source tarball $vendor/dl/${libver}.tar.xz" + mkdir -p $topdir/$vendor/dl 2>/dev/null + (cd $usrc && tar cJf $topdir/$vendor/dl/${libver}.tar.xz ${libver} ) +fi + +runtest() { + + arch=$1 + qemu=qemu-system-${arch} + qemu_args= + qemu_append="ntp_server=$ntp" + if [ $debug -eq 0 ];then + qemu_append="$qemu_append quiet" + fi + if [ $shell -eq 1 ];then + qemu_append="$qemu_append shell" + fi + suffix= + psuffix= + libdir=lib + march=${arch} + + case ${arch} in + arm) + cpu_arch=arm + qemu_machine=vexpress-a9 + qemu_args="${qemu_args} -cpu cortex-a9 -net user -net nic,model=lan9118" + suffix=eabi + psuffix=$suffix + ;; + armhf) + cpu_arch=arm + march=arm + qemu=qemu-system-${cpu_arch} + qemu_machine=vexpress-a9 + qemu_args="${qemu_args} -cpu cortex-a9 -net user -net nic,model=lan9118" + suffix=eabihf + psuffix=$suffix + ;; + mips) + cpu_arch=mips + qemu_machine=malta + qemu_args="${qemu_args} -device e1000,netdev=adk0 -netdev user,id=adk0" + ;; + mipsel) + cpu_arch=mipsel + march=mips + qemu_machine=malta + qemu_args="${qemu_args} -device e1000,netdev=adk0 -netdev user,id=adk0" + ;; + mips64) + cpu_arch=mips64 + qemu_machine=malta + qemu_args="${qemu_args} -device e1000,netdev=adk0 -netdev user,id=adk0" + suffix=abi32 + psuffix=o32 + ;; + mips64n32) + cpu_arch=mips64 + march=mips64 + qemu=qemu-system-${cpu_arch} + qemu_machine=malta + qemu_args="${qemu_args} -device e1000,netdev=adk0 -netdev user,id=adk0" + suffix=abin32 + psuffix=n32 + ;; + mips64n64) + cpu_arch=mips64 + march=mips64 + qemu=qemu-system-${cpu_arch} + qemu_machine=malta + qemu_args="${qemu_args} -device e1000,netdev=adk0 -netdev user,id=adk0" + suffix=abi64 + psuffix=n64 + ;; + mips64el) + cpu_arch=mips64el + march=mips64 + qemu_machine=malta + qemu_args="${qemu_args} -device e1000,netdev=adk0 -netdev user,id=adk0" + suffix=abi32 + psuffix=o32 + ;; + mips64eln32) + cpu_arch=mips64el + march=mips64 + qemu=qemu-system-${cpu_arch} + qemu_machine=malta + qemu_args="${qemu_args} -device e1000,netdev=adk0 -netdev user,id=adk0" + suffix=abin32 + psuffix=n32 + ;; + mips64eln64) + cpu_arch=mips64el + march=mips64 + qemu=qemu-system-${cpu_arch} + qemu_machine=malta + qemu_args="${qemu_args} -device e1000,netdev=adk0 -netdev user,id=adk0" + suffix=abi64 + psuffix=n64 + ;; + ppc-nofpu) + cpu_arch=ppc + march=ppc + qemu=qemu-system-${cpu_arch} + qemu_args="${qemu_args} -device e1000,netdev=adk0 -netdev user,id=adk0" + qemu_machine=bamboo + ;; + ppc) + cpu_arch=ppc + march=ppc + qemu=qemu-system-${cpu_arch} + qemu_args="${qemu_args} -device e1000,netdev=adk0 -netdev user,id=adk0" + qemu_machine=mac99 + ;; + powerpc64|ppc64) + cpu_arch=ppc64 + qemu=qemu-system-${cpu_arch} + qemu_machine=pseries + ;; + sh) + cpu_arch=sh4 + qemu=qemu-system-${cpu_arch} + qemu_machine=r2d + qemu_args="${qemu_args} -monitor null -serial null -serial stdio" + ;; + sheb) + cpu_arch=sh4eb + march=sh + qemu=qemu-system-${cpu_arch} + qemu_machine=r2d + qemu_args="${qemu_args} -monitor null -serial null -serial stdio" + ;; + sparc) + cpu_arch=sparc + qemu_machine=SS-5 + ;; + sparc64) + cpu_arch=sparc64 + qemu_machine=sun4u + qemu_args="${qemu_args} -net nic,model=virtio -net user" + ;; + x86) + cpu_arch=i686 + qemu=qemu-system-i386 + qemu_machine=pc + qemu_args="${qemu_args} -cpu pentium2" + ;; + x86_64) + cpu_arch=x86_64 + qemu_machine=pc + libdir=lib64 + ;; + x86_64_x32) + cpu_arch=x86_64 + qemu=qemu-system-${cpu_arch} + qemu_machine=pc + libdir=libx32 + suffix=x32 + ;; + xtensa) + cpu_arch=xtensa + qemu=qemu-system-${cpu_arch} + qemu_machine=lx60 + ;; + *) + echo "architecture ${arch} not supported"; exit 1;; + esac + + if ! which $qemu >/dev/null; then + echo "Checking if $qemu is installed... failed" + exit 1 + fi + qemuver=$(${qemu} -version|awk '{ print $4 }') + if [ $(echo $qemuver |sed -e "s#\.##g" -e "s#,##") -lt 200 ];then + echo "Your qemu version is too old. Please update to 2.0 or greater" + exit 1 + fi + + cross=${cpu_arch}-${vendor}-linux-uclibc${suffix} + if [ -z $psuffix ];then + TCPATH=${topdir}/${vendor}/toolchain_qemu-${march}_${libc}_${cpu_arch} + else + TCPATH=${topdir}/${vendor}/toolchain_qemu-${march}_${libc}_${cpu_arch}_${psuffix} + fi + export PATH="${TCPATH}/usr/bin:$PATH" + + if ! which ${cross}-gcc >/dev/null; then + echo "Checking if ${cross}-gcc is installed... failed" + exit 1 + fi + + echo "Starting test for ${arch}" + echo "Generating root filesystem for test run" + root=$(mktemp -d /tmp/XXXX) + if [ ! -f openadk/firmware/qemu-${march}_${libc}/qemu-${march}-${libc}-initramfsarchive.tar.gz ];then + echo "No root filesystem available for architecture ${arch}" + exit 1 + fi + tar -xf openadk/firmware/qemu-${march}_${libc}/qemu-${march}-${libc}-initramfsarchive.tar.gz -C $root + + if [ $2 -eq 0 ];then +cat > ${root}/run.sh << EOF +#!/bin/sh +uname -a +rdate -n \$ntp_server +file /bin/busybox +for i in \$(ls /lib/*.so|grep -v libgcc);do + size \$i +done +exit +EOF + fi + if [ $2 -eq 1 ];then +cat > ${root}/run.sh << EOF +#!/bin/sh +uname -a +rdate -n \$ntp_server +/opt/ltp/runltp +exit +EOF + fi + if [ $2 -eq 2 ];then +cat > ${root}/run.sh << EOF +#!/bin/sh +uname -a +rdate -n \$ntp_server +cd /opt/$libc/test +CROSS_COMPILE=": ||" make UCLIBC_ONLY=y -k run +exit +EOF + fi + chmod u+x ${root}/run.sh + + kernel=openadk/firmware/qemu-${march}_${libc}/qemu-${march}-initramfsarchive-kernel + + echo "Creating initramfs filesystem" + (cd $root; find . | cpio -o -C512 -Hnewc --quiet |xz --check=crc32 --stdout > ${topdir}/initramfs.${arch}) + rm -rf $root + + echo "Now running the tests in qemu for architecture ${arch}" + echo "${qemu} -M ${qemu_machine} ${qemu_args} -append ${qemu_append} -kernel ${kernel} -qmp tcp:127.0.0.1:4444,server,nowait -no-reboot -nographic -initrd initramfs.${arch}" + ${qemu} -M ${qemu_machine} ${qemu_args} -append "${qemu_append}" -kernel ${kernel} -qmp tcp:127.0.0.1:4444,server,nowait -no-reboot -nographic -initrd initramfs.${arch} | tee REPORT.${arch} + if [ $? -eq 0 ];then + echo "Test for ${arch} finished. See REPORT.${arch}." + echo + else + echo "Test failed for ${arch}." + echo + fi +} + +create_buildroot_defconfig_arcle() { + cat > configs/arcle_defconfig << EOD +BR2_arcle=y + +BR2_TOOLCHAIN_BUILDROOT_UCLIBC_NG=y +BR2_KERNEL_HEADERS_3_15=y +BR2_DEFAULT_KERNEL_HEADERS="3.15.6" +BR2_BINUTILS_VERSION_2_24=y +BR2_GCC_VERSION_4_8_X=y +BR2_TOOLCHAIN_HAS_THREADS=y +EOD +} + +create_buildroot_defconfig_arcbe() { + cat > configs/arcbe_defconfig << EOD +BR2_arcle=y + +BR2_TOOLCHAIN_BUILDROOT_UCLIBC_NG=y +BR2_KERNEL_HEADERS_3_15=y +BR2_DEFAULT_KERNEL_HEADERS="3.15.6" +BR2_BINUTILS_VERSION_2_24=y +BR2_GCC_VERSION_4_8_X=y +BR2_TOOLCHAIN_HAS_THREADS=y +EOD +} + +create_buildroot_defconfig_bfin() { + cat > configs/bfin_defconfig << EOD +BR2_bfin=y +BR2_BINFMT_FDPIC=y +BR2_bf609=y + +BR2_TOOLCHAIN_BUILDROOT_UCLIBC_NG=y +BR2_KERNEL_HEADERS_3_15=y +BR2_DEFAULT_KERNEL_HEADERS="3.15.6" +BR2_BINUTILS_VERSION_2_22=y +BR2_GCC_VERSION_4_5_X=y +BR2_TOOLCHAIN_HAS_THREADS=y +EOD +} + +build_buildroot() { + cd buildroot + case $1 in + arcle) + create_buildroot_defconfig_arcle + make arcle_defconfig + make clean all + ;; + arcbe) + create_buildroot_defconfig_arcbe + make arcbe_defconfig + make clean all + ;; + arm) + make qemu_arm_vexpress_defconfig + make clean all + ;; + bfin) + create_buildroot_defconfig_bfin + make bfin_defconfig + make clean all + ;; + mips) + make qemu_mips_malta_defconfig + make clean all + ;; + mipsel) + make qemu_mipsel_malta_defconfig + make clean all + ;; + mips64) + make qemu_mips64_malta_defconfig + make clean all + ;; + mips64el) + make qemu_mips64el_malta_defconfig + make clean all + ;; + ppc) + make qemu_ppc_mpc8544ds_defconfig + make clean all + ;; + sh) + make qemu_sh4_r2d_defconfig + make clean all + ;; + sparc) + make qemu_sparc_ss10_defconfig + make clean all + ;; + x86) + make qemu_x86_defconfig + make clean all + ;; + x86_64) + make qemu_x86_64_defconfig + make clean all + ;; + xtensa) + make qemu_xtensa_lx60_defconfig + make clean all + ;; + *) + echo "architecture not supported in buildroot" + exit 1 + ;; + esac +} + +build_openadk() { + cd openadk + # start with a clean dir + if [ $clean -eq 1 ];then + make cleandir + fi + DEFAULT="ADK_TARGET_LIBC=$libc ADK_TARGET_FS=initramfsarchive ADK_TARGET_COLLECTION=test" + if [ $debug -eq 1 ];then + DEFAULT="$DEFAULT VERBOSE=1" + fi + if [ ! -z $source ];then + DEFAULT="$DEFAULT ADK_NO_CHECKSUM=1" + fi + if [ $2 -eq 0 ];then + DEFAULT="$DEFAULT ADK_TEST_BASE=y" + fi + if [ $2 -eq 1 ];then + DEFAULT="$DEFAULT ADK_TEST_LTP=y" + fi + if [ $2 -eq 2 ];then + case $libc in + uclibc-ng) + DEFAULT="$DEFAULT ADK_TEST_UCLIBC_NG_TESTSUITE=y" + ;; + uclibc) + DEFAULT="$DEFAULT ADK_TEST_UCLIBC_TESTSUITE=y" + ;; + *) + echo "test suite not available" + exit 1 + ;; + esac + make package=$libc clean + fi + if [ $2 -eq 3 ];then + case $libc in + uclibc-ng) + DEFAULT="$DEFAULT ADK_TEST_UCLIBC_NG_NATIVE=y" + ;; + uclibc) + DEFAULT="$DEFAULT ADK_TEST_UCLIBC_NATIVE=y" + ;; + *) + echo "native build not available" + exit 1 + ;; + esac + fi + case $1 in + arm) + make $DEFAULT ADK_TARGET_ARCH=arm ADK_TARGET_SYSTEM=qemu-arm ADK_TARGET_ABI=eabi ADK_TARGET_ENDIAN=little defconfig all + ;; + armhf) + make $DEFAULT ADK_TARGET_ARCH=arm ADK_TARGET_SYSTEM=qemu-arm ADK_TARGET_ABI=eabihf ADK_TARGET_ENDIAN=little defconfig all + ;; + m68k-nommu) + make $DEFAULT ADK_TARGET_ARCH=m68k ADK_TARGET_SYSTEM=qemu-m68k defconfig all + ;; + mips) + make $DEFAULT ADK_TARGET_ARCH=mips ADK_TARGET_SYSTEM=qemu-mips ADK_TARGET_ENDIAN=big defconfig all + ;; + mipsel) + make $DEFAULT ADK_TARGET_ARCH=mips ADK_TARGET_SYSTEM=qemu-mips ADK_TARGET_ENDIAN=little defconfig all + ;; + mips64) + make $DEFAULT ADK_TARGET_ARCH=mips64 ADK_TARGET_SYSTEM=qemu-mips64 ADK_TARGET_ENDIAN=big ADK_TARGET_ABI=o32 defconfig all + ;; + mips64n32) + make $DEFAULT ADK_TARGET_ARCH=mips64 ADK_TARGET_SYSTEM=qemu-mips64 ADK_TARGET_ENDIAN=big ADK_TARGET_ABI=n32 defconfig all + ;; + mips64n64) + make $DEFAULT ADK_TARGET_ARCH=mips64 ADK_TARGET_SYSTEM=qemu-mips64 ADK_TARGET_ENDIAN=big ADK_TARGET_ABI=n64 defconfig all + ;; + mips64el) + make $DEFAULT ADK_TARGET_ARCH=mips64 ADK_TARGET_SYSTEM=qemu-mips64 ADK_TARGET_ENDIAN=little ADK_TARGET_ABI=o32 defconfig all + ;; + mips64eln32) + make $DEFAULT ADK_TARGET_ARCH=mips64 ADK_TARGET_SYSTEM=qemu-mips64 ADK_TARGET_ENDIAN=little ADK_TARGET_ABI=n32 defconfig all + ;; + mips64eln64) + make $DEFAULT ADK_TARGET_ARCH=mips64 ADK_TARGET_SYSTEM=qemu-mips64 ADK_TARGET_ENDIAN=little ADK_TARGET_ABI=n64 defconfig all + ;; + ppc-nofpu) + make $DEFAULT ADK_TARGET_ARCH=ppc ADK_TARGET_SYSTEM=qemu-ppc defconfig all + ;; + sh) + make $DEFAULT ADK_TARGET_ARCH=sh ADK_TARGET_SYSTEM=qemu-sh ADK_TARGET_ENDIAN=little defconfig all + ;; + sheb) + make $DEFAULT ADK_TARGET_ARCH=sh ADK_TARGET_SYSTEM=qemu-sh ADK_TARGET_ENDIAN=big defconfig all + ;; + *) + make $DEFAULT ADK_TARGET_ARCH=$1 ADK_TARGET_SYSTEM=qemu-$1 defconfig all + ;; + esac + if [ $? -ne 0 ];then + echo "build failed" + exit 1 + fi + cd .. +} + +echo "compiling base system and toolchain" + +if [ "$vendor" = "buildroot" ];then + for arch in ${archlist}; do + build_buildroot $arch 0 + done +fi + +if [ "$vendor" = "openadk" ];then + for arch in ${archlist}; do + build_openadk $arch 99 + if [ $boot -eq 1 ];then + case $arch in + m68k-nommu|ppc|sheb|xtensa|mips64eln32|mips64n32) + echo "runtime tests disabled for $arch." + ;; + *) + build_openadk $arch 0 + runtest $arch 0 + ;; + esac + fi + if [ $ltp -eq 1 ];then + case $arch in + m68k-nommu|ppc|sheb|xtensa|mips64eln32|mips64n32) + echo "runtime tests disabled for $arch." + ;; + *) + build_openadk $arch 1 + runtest $arch 1 + ;; + esac + fi + if [ $test -eq 1 ];then + case $arch in + m68k-nommu|ppc|sheb|xtensa|mips64eln32|mips64n32) + echo "runtime tests disabled for $arch." + ;; + *) + build_openadk $arch 2 + runtest $arch 2 + ;; + esac + fi + if [ $gcc -eq 1 ];then + case $arch in + m68k-nommu|ppc|sheb|xtensa|mips64eln32|mips64n32) + echo "runtime tests disabled for $arch." + ;; + *) + build_openadk $arch 3 + runtest $arch 3 + ;; + esac + fi + done +fi + +echo "All tests finished." +exit 0 |