Home | History | Annotate | Line # | Download | only in dist
      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