# Copyright Roger Meier <r.meier@siemens.com>
# SPDX-License-Identifier:	GPL-2.0+

# build U-Boot on Travis CI - https://travis-ci.org/

sudo: required
dist: trusty

language: c

addons:
  apt:
    sources:
    - sourceline: 'ppa:gns3/qemu'
    packages:
    - cppcheck
    - sloccount
    - sparse
    - bc
    - build-essential
    - libsdl1.2-dev
    - python
    - python-virtualenv
    - qemu-system-arm
    - qemu-system-mips
    - qemu-system-ppc
    - qemu-system-x86
    - gcc-powerpc-linux-gnu
    - gcc-arm-linux-gnueabihf
    - gcc-aarch64-linux-gnu
    - iasl

install:
 # install latest device tree compiler
 - git clone --depth=1 git://git.kernel.org/pub/scm/utils/dtc/dtc.git /tmp/dtc
 - make -j4 -C /tmp/dtc
 # Clone uboot-test-hooks
 - git clone --depth=1 git://github.com/swarren/uboot-test-hooks.git /tmp/uboot-test-hooks
 - ln -s travis-ci /tmp/uboot-test-hooks/bin/`hostname`
 - ln -s travis-ci /tmp/uboot-test-hooks/py/`hostname`
 # prepare buildman environment
 - echo -e "[toolchain]\nroot = /usr" > ~/.buildman
 - echo -e "\n[toolchain-alias]\nblackfin = bfin\nsh = sh4\nopenrisc = or32" >> ~/.buildman
 - cat ~/.buildman
 - virtualenv /tmp/venv
 - . /tmp/venv/bin/activate
 - pip install pytest

env:
  global:
    - PATH=/tmp/dtc:/tmp/uboot-test-hooks/bin:$PATH
    - BUILD_DIR=build
    - HOSTCC="cc"
    - HOSTCXX="c++"

before_script:
  # install toolchains based on TOOLCHAIN} variable
  - if [[ "${TOOLCHAIN}" == *avr32* ]]; then ./tools/buildman/buildman --fetch-arch avr32 ; fi
  - if [[ "${TOOLCHAIN}" == *bfin* ]]; then ./tools/buildman/buildman --fetch-arch bfin ; fi
  - if [[ "${TOOLCHAIN}" == *m68k* ]]; then ./tools/buildman/buildman --fetch-arch m68k ; fi
  - if [[ "${TOOLCHAIN}" == *microblaze* ]]; then ./tools/buildman/buildman --fetch-arch microblaze ; fi
  - if [[ "${TOOLCHAIN}" == *mips* ]]; then ./tools/buildman/buildman --fetch-arch mips ; fi
  - if [[ "${TOOLCHAIN}" == *or32* ]]; then ./tools/buildman/buildman --fetch-arch or32 ; fi
  - if [[ "${TOOLCHAIN}" == *sh4* ]]; then ./tools/buildman/buildman --fetch-arch sh4 ; fi
  - if [[ "${TOOLCHAIN}" == *x86_64* ]]; then
      ./tools/buildman/buildman --fetch-arch x86_64;
      echo -e "\n[toolchain-prefix]\nx86 = ${HOME}/.buildman-toolchains/gcc-4.9.0-nolibc/x86_64-linux/bin/x86_64-linux-" >> ~/.buildman;
    fi
  - if [[ "${TOOLCHAIN}" == *xtensa* ]]; then ./tools/buildman/buildman --fetch-arch xtensa ; fi

script:
 # Comments must be outside the command strings below, or the Travis parser
 # will get confused.
 #
 # Exit code 129 means warnings only.
 - if [[ "${BUILDMAN}" != "" ]]; then
     set +e;
     tools/buildman/buildman -P ${BUILDMAN};
     ret=$?;
     if [[ $ret -ne 0 && $ret -ne 129 ]]; then
       tools/buildman/buildman -sdeP ${BUILDMAN};
       exit $ret;
     fi;
   fi
 # "not a_test_which_does_not_exist" is a dummy -k parameter which will
 # never prevent any test from running. That way, we can always pass
 # "-k something" even when $TEST_PY_TEST_SPEC doesnt need a custom
 # value.
 - if [[ "${TEST_PY_BD}" != "" ]]; then
     ./test/py/test.py --bd ${TEST_PY_BD} ${TEST_PY_ID}
       -k "${TEST_PY_TEST_SPEC:-not a_test_which_does_not_exist}"
       --build-dir `cd .. && pwd`/.bm-work/${TEST_PY_BD};
   fi

matrix:
  include:
  # we need to build by vendor due to 50min time limit for builds
  # each env setting here is a dedicated build
    - env:
        - BUILDMAN="arm11"
    - env:
        - BUILDMAN="arm7"
    - env:
        - BUILDMAN="arm920t"
    - env:
        - JOB="arm926ejs"
          BUILDMAN="arm926ejs -x mx,siemens,atmel"
    - env:
        - BUILDMAN="arm946es"
    - env:
        - BUILDMAN="atmel -x avr32"
    - env:
        - BUILDMAN="avr32"
          TOOLCHAIN="avr32"
    - env:
        - BUILDMAN="denx"
    - env:
        - JOB="Freescale ARM"
          BUILDMAN="freescale -x powerpc,m68k"
    - env:
        - JOB="i.MX (non-Freescale)"
          BUILDMAN="mx -x freescale"
    - env:
        - BUILDMAN="sun4i"
    - env:
        - BUILDMAN="sun5i"
    - env:
        - BUILDMAN="sun6i"
    - env:
        - BUILDMAN="sun7i"
    - env:
        - BUILDMAN="sun8i"
    - env:
        - BUILDMAN="sun9i"
    - env:
        - BUILDMAN="sun50i"
    - env:
        - JOB="Catch-all ARM"
          BUILDMAN="arm -x arm11,arm7,arm9,aarch64,atmel,denx,freescale,kirkwood,siemens,tegra,uniphier,mx,sunxi,am33xx,omap3,omap4,omap5,pxa"
    - env:
        - BUILDMAN="sandbox x86"
          TOOLCHAIN="x86_64"
    - env:
        - BUILDMAN="kirkwood"
    - env:
        - BUILDMAN="pxa"
    - env:
        - BUILDMAN="m68k"
          TOOLCHAIN="m68k"
    - env:
        - BUILDMAN="microblaze"
          TOOLCHAIN="microblaze"
    - env:
        - BUILDMAN="mips"
          TOOLCHAIN="mips"
    - env:
        - BUILDMAN="mpc512x"
    - env:
        - BUILDMAN="mpc5xx"
    - env:
        - BUILDMAN="mpc5xxx"
    - env:
        - BUILDMAN="mpc8260"
    - env:
        - BUILDMAN="mpc83xx"
    - env:
        - BUILDMAN="mpc85xx -x freescale"
    - env:
        - BUILDMAN="mpc85xx -x t208xrdb -x t4qds -x t102* -x p1_p2_rdb_pc -x p1010rdb -x corenet_ds -x b4860qds -x sbc8548 -x bsc91*"
    - env:
        - BUILDMAN="t208xrdb t4qds t102*"
    - env:
        - BUILDMAN="p1_p2_rdb_pc p1010rdb"
    - env:
        - BUILDMAN="corenet_ds b4860qds sbc8548 bsc91*"
    - env:
        - BUILDMAN="mpc86xx"
    - env:
        - BUILDMAN="mpc8xx"
    - env:
        - BUILDMAN="siemens"
    - env:
        - BUILDMAN="tegra"
    - env:
        - JOB="am33xx"
          BUILDMAN="am33xx -x siemens"
    - env:
        - BUILDMAN="omap3"
    - env:
        - BUILDMAN="omap4"
    - env:
        - BUILDMAN="omap5"
    - env:
        - BUILDMAN="uniphier"
    - env:
        - BUILDMAN="aarch64 -x tegra,freescale,uniphier,sunxi"
          TOOLCHAIN="aarch64"
    - env:
        - BUILDMAN="sh4"
          TOOLCHAIN="sh4"
    - env:
        - BUILDMAN="xtensa"
          TOOLCHAIN="xtensa"

    # QA jobs for code analytics
    # static code analysis with cppcheck (we can add --enable=all later)
    - env:
        - JOB="cppcheck"
      script:
        - cppcheck --force --quiet --inline-suppr .
    # search for TODO within source tree
    - env:
        - JOB="grep TODO"
      script:
        - grep -r TODO .
    # search for FIXME within source tree
    - env:
        - JOB="grep FIXME HACK"
      script:
        - grep -r FIXME .
    # search for HACK within source tree and ignore HACKKIT board
      script:
        - grep -r HACK . | grep -v HACKKIT
    # some statistics about the code base
    - env:
        - JOB="sloccount"
      script:
        - sloccount .

    # test/py
    - env:
        - TEST_PY_BD="sandbox"
          BUILDMAN="^sandbox$"
          TOOLCHAIN="x86_64"
    - env:
        - TEST_PY_BD="vexpress_ca15_tc2"
          TEST_PY_ID="--id qemu"
          BUILDMAN="^vexpress_ca15_tc2$"
    - env:
        - TEST_PY_BD="vexpress_ca9x4"
          TEST_PY_ID="--id qemu"
          BUILDMAN="^vexpress_ca9x4$"
    - env:
        - TEST_PY_BD="integratorcp_cm926ejs"
          TEST_PY_ID="--id qemu"
          BUILDMAN="^integratorcp_cm926ejs$"
    - env:
        - TEST_PY_BD="qemu_mips"
          TEST_PY_TEST_SPEC="not sleep"
          BUILDMAN="^qemu_mips$"
          TOOLCHAIN="mips"
    - env:
        - TEST_PY_BD="qemu_mipsel"
          TEST_PY_TEST_SPEC="not sleep"
          BUILDMAN="^qemu_mipsel$"
          TOOLCHAIN="mips"
    - env:
        - TEST_PY_BD="qemu_mips64"
          TEST_PY_TEST_SPEC="not sleep"
          BUILDMAN="^qemu_mips64$"
          TOOLCHAIN="mips"
    - env:
        - TEST_PY_BD="qemu_mips64el"
          TEST_PY_TEST_SPEC="not sleep"
          BUILDMAN="^qemu_mips64el$"
          TOOLCHAIN="mips"
    - env:
        - TEST_PY_BD="qemu-ppce500"
          TEST_PY_TEST_SPEC="not sleep"
          BUILDMAN="^qemu-ppce500$"
    - env:
        - TEST_PY_BD="qemu-x86"
          TEST_PY_TEST_SPEC="not sleep"
          BUILDMAN="^qemu-x86$"
          TOOLCHAIN="x86_64"
          BUILD_ROM="yes"

# TODO make it perfect ;-r
