#!/bin/sh export RIOT_CI_BUILD=1 export STATIC_TESTS=${STATIC_TESTS:-1} export CFLAGS_DBG="" export DLCACHE_DIR=${DLCACHE_DIR:-~/.dlcache} error() { echo "$@" exit 1 } _greplist() { if [ $# -eq 0 ]; then echo cat else echo -n "grep -E ($1" shift for i in $*; do echo -n "|$i" done echo ")" fi } # get list of all app directories get_apps() { find tests/ examples/ \ -mindepth 2 -maxdepth 2 -name Makefile -type f \ | xargs dirname | $(_greplist $APPS) | sort } # take app dir as parameter, print all boards that are supported # Only print for boards in $BOARDS. get_supported_boards() { local appdir=$1 local boards="$(make --no-print-directory -C$appdir info-boards-supported 2>/dev/null || echo broken)" if [ "$boards" = broken ]; then echo "makefile_broken" return fi for board in $boards do echo $board done | $(_greplist $BOARDS) } # given an app dir as parameter, print "$appdir board" for each supported # board. Only print for boards in $BOARDS. get_app_board_pairs() { local appdir=$1 for board in $(get_supported_boards $appdir) do echo $appdir $board done | $(_greplist $BOARDS) } # use dwqc to create full "appdir board" compile job list get_compile_jobs() { get_apps | \ dwqc -E BOARDS -E APPS -s \ "$0 get_app_board_pairs \${1}" \ | xargs '-d\n' -n 1 echo $0 compile } # compile one app for one board. delete intermediates. compile() { local appdir=$1 local board=$2 [ "$board" = "makefile_broken" ] && error "$0: Makefile in \"$appdir\" seems to be broken!" # set build directory. CI ensures only one build at a time in $(pwd). rm -rf build export BINDIR="$(pwd)/build" export PKGDIRBASE="${BINDIR}/pkg" [ -n "$DWQ_WORKER" ] && \ echo "-- running on worker ${DWQ_WORKER} thread ${DWQ_WORKER_THREAD}, build number $DWQ_WORKER_BUILDNUM." # sanity checks [ $# -ne 2 ] && error "$0: compile: invalid parameters (expected \$appdir \$board)" [ ! -d "$appdir" ] && error "$0: compile: error: application directory \"$appdir\" doesn't exist" [ ! -d "boards/$board" ] && error "$0: compile: error: board directory \"boards/$board\" doesn't exist" CCACHE_BASEDIR="$(pwd)" BOARD=$board RIOT_CI_BUILD=1 \ make -C${appdir} clean all -j${JOBS:-4} RES=$? if [ $RES -eq 0 ]; then if [ "$board" = "native" -a "$appdir" = "tests/unittests" ]; then make -C${appdir} test RES=$? fi fi test -d ${BINDIR} && echo "-- build directory size: $(du -sh ${BINDIR} | cut -f1)" # cleanup rm -Rf build return $RES } # execute static tests static_tests() { local repo=${CI_BASE_REPO:-https://github.com/RIOT-OS/RIOT} local branch=${CI_BASE_BRANCH:-master} OUT="$(git remote add upstream $repo 2>&1 && git fetch upstream ${branch}:${branch} 2>&1)" RES=$? if [ $RES -ne 0 ]; then echo "$OUT" exit 1 fi BUILDTEST_MCU_GROUP=static-tests ./dist/tools/ci/build_and_test.sh } get_jobs() { [ "$STATIC_TESTS" = "1" ] && \ echo "$0 static_tests###{ \"jobdir\" : \"exclusive\" }" get_compile_jobs } $*