1#!/bin/bash 2# Based on a test script from avsm/ocaml repo https://github.com/avsm/ocaml 3# Adapted from https://www.tomaz.me/2013/12/02/running-travis-ci-tests-on-arm.html 4 5set -e 6 7CHROOT_DIR=/tmp/arm-chroot 8MIRROR=http://archive.raspbian.org/raspbian 9VERSION=wheezy 10CHROOT_ARCH=armhf 11 12# Debian package dependencies for the host 13HOST_DEPENDENCIES="debootstrap qemu-user-static binfmt-support sbuild" 14 15# Debian package dependencies for the chrooted environment 16GUEST_DEPENDENCIES="cmake git clang-format" 17 18function setup_arm_chroot { 19 # Host dependencies 20 sudo apt-get install -qq -y ${HOST_DEPENDENCIES} 21 22 # Create chrooted environment 23 sudo mkdir ${CHROOT_DIR} 24 sudo debootstrap --foreign --no-check-gpg --include=fakeroot,build-essential \ 25 --arch=${CHROOT_ARCH} ${VERSION} ${CHROOT_DIR} ${MIRROR} 26 sudo cp /usr/bin/qemu-arm-static ${CHROOT_DIR}/usr/bin/ 27 sudo chroot ${CHROOT_DIR} ./debootstrap/debootstrap --second-stage 28 sudo sbuild-createchroot --arch=${CHROOT_ARCH} --foreign --setup-only \ 29 ${VERSION} ${CHROOT_DIR} ${MIRROR} 30 31 # Create file with environment variables which will be used inside chrooted 32 # environment 33 echo "export ARCH=${ARCH}" > envvars.sh 34 echo "export TRAVIS_BUILD_DIR=${TRAVIS_BUILD_DIR}" >> envvars.sh 35 chmod a+x envvars.sh 36 37 # Install dependencies inside chroot 38 sudo chroot ${CHROOT_DIR} apt-get update 39 sudo chroot ${CHROOT_DIR} apt-get --allow-unauthenticated install \ 40 -qq -y ${GUEST_DEPENDENCIES} 41 42 # Create build dir and copy travis build files to our chroot environ ment 43 sudo mkdir -p ${CHROOT_DIR}/${TRAVIS_BUILD_DIR} 44 sudo rsync -a ${TRAVIS_BUILD_DIR}/ ${CHROOT_DIR}/${TRAVIS_BUILD_DIR}/ 45 46 # Indicate chroot environment has been set up 47 sudo touch ${CHROOT_DIR}/.chroot_is_done 48 49 # Call ourselves again which will cause tests to run 50 sudo chroot ${CHROOT_DIR} bash -c "cd ${TRAVIS_BUILD_DIR} && ./.travis-qemu.sh" 51} 52 53 54if [ "${ARCH}" = "arm" ]; then 55 if [ -e "/.chroot_is_done" ]; then 56 # We are inside ARM chroot 57 echo "Running inside chrooted environment, will execute only tests" 58 59 . ./envvars.sh 60 61 # We need CMocka since the executables are dynamically linked 62 git clone git://git.cryptomilk.org/projects/cmocka.git 63 mkdir cmocka_build && cd cmocka_build 64 cmake ../cmocka 65 make VERBOSE=1 66 make install 67 cd .. 68 69 # Hack: We don't have the right CMake (takes too long to compile), but this works 70 ctest -VV 71 else 72 # Compilation on QEMU is too slow and times out on Travis. Crosscompile at the host 73 echo "Initial execution on ARM environment, will crosscompile" 74 arm-linux-gnueabihf-gcc-4.6 -v 75 76 # Crosscompile CMocka 77 pushd ${HOME} 78 git clone git://git.cryptomilk.org/projects/cmocka.git 79 mkdir cmocka_build && cd cmocka_build 80 cmake ../cmocka \ 81 -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc-4.6 82 make VERBOSE=1 83 sudo make install 84 cd .. 85 rm -rf cmocka cmocka_build 86 popd 87 88 # Crosscompile libcbor 89 cmake ${SOURCE} \ 90 -DCBOR_CUSTOM_ALLOC=ON \ 91 -DCMAKE_BUILD_TYPE=Debug \ 92 -DWITH_TESTS=ON \ 93 -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc-4.6 94 make VERBOSE=1 95 96 # ARM test run, need to set up chrooted environment first 97 echo "Setting up chrooted ARM environment" 98 setup_arm_chroot 99 fi 100else 101 # Proceed as normal 102 gem install coveralls-lcov 103 pushd ${HOME} 104 git clone git://git.cryptomilk.org/projects/cmocka.git 105 mkdir cmocka_build && cd cmocka_build 106 cmake ../cmocka 107 make -j 2 108 sudo make install 109 cd .. 110 rm -rf cmocka cmocka_build 111 popd 112 113 echo "Running tests" 114 cppcheck . --error-exitcode=1 --suppressions cppcheck_suppressions.txt --force 115 116 clang-format -version 117 clang-format-8 -version 118 ./clang-format.sh 119 git diff-index --quiet HEAD 120 121 cmake \ 122 -DCBOR_CUSTOM_ALLOC=ON \ 123 -DCMAKE_BUILD_TYPE=Debug \ 124 -DSANITIZE=OFF \ 125 -DWITH_TESTS=ON \ 126 -DCMAKE_PREFIX_PATH=${HOME}/usr/local \ 127 . 128 make VERBOSE=1 129 130 ctest -VV 131 132 ctest -T memcheck | tee memcheck.out 133 if grep -q 'Memory Leak\|IPW\|Uninitialized Memory Conditional\|Uninitialized Memory Read' memcheck.out; then 134 exit 1 135 fi 136fi 137 138