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