diff --git a/.travis.mk b/.travis.mk new file mode 100644 index 000000000..35f930a61 --- /dev/null +++ b/.travis.mk @@ -0,0 +1,95 @@ +## Makefile.CI +# +# This is for use on [Travis CI](http://travis-ci.org), which is +# a free distributed continuous integration service with unique +# set of features: +# * uses clean ephemeral virtual machines for every build +# * integrates with GitHub - triggers builds on push and pull-request +# * it is open source and free for public repositories +# * features great web UI and bunch of other stuff + +JOBS ?= 2 +TAIL ?= tail -n 15 + + +EXAMPLES_ALL = hello-world + +EXAMPLES_native = ipv6/native-border-router + +EXAMPLES_most_non_native = \ + er-rest-example \ + ipv6/rpl-border-router \ + ipv6/rpl-collect \ + ipv6/rpl-udp \ + ipv6/simple-udp-rpl \ + ipv6/slip-radio \ + webserver-ipv6 + +EXAMPLES_redbee_econotag = $(EXAMPLES_most_non_native) + +EXAMPLES_most_avr = $(EXAMPLES_most_non_native) + +EXAMPLES_micaz = $(EXAMPLES_most_avr) +EXAMPLES_avr_raven = $(EXAMPLES_most_avr) + +## MARK_EXAMPLES_$(TARGET) provides the mechanism to +## build the examples which are known to fail but +## shouldn't be counted as failing for some reason +MARK_EXAMPLES_micaz = \ + er-rest-example \ + ipv6/rpl-border-router \ + ipv6/rpl-collect \ + ipv6/rpl-udp \ + ipv6/simple-udp-rpl \ + ipv6/slip-radio \ + webserver-ipv6 + +## EXCLUDE_$(TARGETS) provides the mechanism to +## not build the examples which are known to fail +EXCLUDE_avr_raven = ipv6/rpl-collect + +EXAMPLES_sky = $(EXAMPLES_most_non_native) sky-shell + +COOJA_TESTS_DIR = tools/cooja/contiki_tests +COOJA_TESTS_ALL = $(COOJA_TESTS_DIR)/*_helloworld.csc +## Some Cooja tests can also be excluded: +#EXCLUDE_COOJA_TESTS = servreg-hack.csc sky_coffee.csc rime_collect.csc rime_trickle.csc +## And some can also be marked: +#MARK_COOJA_TESTS = crosslevel.csc ip_sky_telnet_ping.csc + +CT := \033[0;0m + +ifdef BOXED_SIGNS + SKIP_SIGN := ☐ + FAIL_SIGN := ☒ + PASS_SIGN := ☑ +else + SKIP_SIGN := ✈ + FAIL_SIGN := ✘ + PASS_SIGN := ✔ +endif + + +## FIXME: this will misbehave when we intend to skip `examples1` but there is also `examples123` that fails also +SKIP = (echo $(SKIP_LIST) | grep -q $$e && (echo "\033[1;36m $(SKIP_SIGN) ➝ ❨ $$e ⊈ $@ ❩$(CT)"; $(TAIL) $(LOG); echo skip >> results) || false) +FAIL = (echo "\033[1;35m $(FAIL_SIGN) ➝ ❨ $$e ∉ $@ ❩$(CT)"; $(TAIL) $(LOG); echo fail >> results) +PASS = (echo "\033[1;32m $(PASS_SIGN) ➝ ❨ $$e ∈ $@ ❩$(CT)"; echo pass >> results) + +ifeq ($(BUILD_TYPE),multi) +THIS = $(MAKE) -C examples/$$e TARGET=$@ > $(LOG) 2>&1 +MINE = $(filter-out $(EXCLUDE_$(subst -,_,$@)), $(EXAMPLES_ALL) $(EXAMPLES_$(subst -,_,$@))) +SKIP_LIST = $(MARK_EXAMPLES_$(subst -,_,$@)) +endif + +ifeq ($(BUILD_TYPE),cooja) +JAVA = java -mx512m +THIS = $(SHELL) -x -c "cd `dirname $$e` && $(JAVA) -jar ../dist/cooja.jar -nogui=`basename $$e`" > $(LOG) #2>&1 +MINE = $(filter-out $(addprefix $(COOJA_TESTS_DIR)/, $(EXCLUDE_COOJA_TESTS)), $(wildcard $(COOJA_TESTS_ALL))) +SKIP_LIST = $(addprefix $(COOJA_TESTS_DIR)/, $(MARK_COOJA_TESTS)) +endif + +LOG = /tmp/$@_`echo $$e | sed 's:/:_:g'`.log + +%: + @echo "\033[1;37m ➠ ❨$@❩ $(CT)" + @for e in $(MINE); do $(THIS) && $(PASS) || $(SKIP) || $(FAIL); done; diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..5768028b1 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,32 @@ +language: c #NOTE: this will set CC=gcc which might cause trouble +before_script: + - "sudo apt-get -qq update" + ## Install these mainline toolchains for all build types + - "sudo apt-get -qq install gcc-msp430 || true" + - "sudo apt-get -qq install gcc-avr avr-libc || true" + ## Install toolchain for mc1233x in care-free way + - "[ $BUILD_TYPE = multi ] && curl -s \ + https://sourcery.mentor.com/public/gnu_toolchain/arm-none-eabi/arm-2008q3-66-arm-none-eabi-i686-pc-linux-gnu.tar.bz2 \ + | tar xjf - -C /tmp/ && sudo cp -f -r /tmp/arm-2008q3/* /usr/ && rm -rf /tmp/arm-2008q3 && arm-none-eabi-gcc --version || true" + ## Compile cooja.jar only when it's going to be needed + - "[ $BUILD_TYPE = cooja ] && java -version && ant -q -f tools/cooja/build.xml jar || true" + + ## IMPORTANT: The commands here have to end with `|| true`, + ## because it would make the test fail if BUILD_TYPE test fails + +script: + ## The makefile called `.travis.mk` handles most of generic logic + - "make -f .travis.mk $MAKE_TARGETS" + +after_script: + ## Print a basic summary in unix style + - "echo 'Summary:'; cat results | sort | uniq -c" + ## This will detect whether the build should pass or fail + - "test `grep -c 'fail' results` -eq 0" + + +env: + ## This magically kick-off parallel jobs for each of the for the sets + ## of environment variable defined below + - BUILD_TYPE='multi' MAKE_TARGETS='native minimal-net redbee-econotag sky micaz avr-raven' + - BUILD_TYPE='cooja' MAKE_TARGETS='cooja' TAIL=cat