xref: /netbsd-src/external/mit/libcbor/dist/.travis-qemu.sh (revision 5dd36a3bc8bf2a9dec29ceb6349550414570c447)
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