# 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:
    packages:
    - cppcheck
    - sloccount
    - sparse
    - bc
    - build-essential
    - libsdl1.2-dev
    - python
    - python-virtualenv
    - gcc-powerpc-linux-gnu
    - gcc-arm-linux-gnueabihf
    - 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
 # prepare buildman environment
 - export BUILDMAN_ROOT="root:"
 - echo -e "[toolchain]\n${BUILDMAN_ROOT} /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:$PATH
    - BUILD_DIR=build
    - HOSTCC="cc"
    - HOSTCXX="c++"

before_script:
  # install toolchains based on TOOLCHAIN} variable
  - if [[ "${TOOLCHAIN}" == *aarch64* ]]; then ./tools/buildman/buildman --fetch-arch aarch64 ; fi
  - 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 ; fi
  - if [[ "${TOOLCHAIN}" == *xtensa* ]]; then ./tools/buildman/buildman --fetch-arch xtensa ; fi

script:
 # the execution sequence for each test
 - if [[ "${TEST_CMD}" != "" ]]; then
     ${TEST_CMD};
   fi
 # Exit code 129 means warnings only.
 - if [[ "${BUILDMAN}" != "" ]]; then
     set +e;
     tools/buildman/buildman ${BUILDMAN};
     if [[ "$?" == "0" || "$?" == "129" ]]; then
       exit 0;
     else
       exit $?;
     fi
   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="arm1136"
    - env:
        - BUILDMAN="arm1136"
    - env:
        - BUILDMAN="arm1176"
    - env:
        - BUILDMAN="arm720t"
    - env:
        - BUILDMAN="arm920t"
    - env:
        - BUILDMAN="atmel -x avr32"
    - env:
        - BUILDMAN="avr32"
          TOOLCHAIN="avr32"
    - env:
        - BUILDMAN="davinci"
    - env:
        - BUILDMAN="denx"
    - env:
        - BUILDMAN="freescale -x powerpc,m68k,aarch64"
    - env:
        - BUILDMAN="sandbox x86"
          TOOLCHAIN="x86_64"
      script:
        - export BUILDMAN_X86="x86:";
          echo -e "\n[toolchain-prefix]\n${BUILDMAN_X86} ${HOME}/.buildman-toolchains/gcc-4.9.0-nolibc/x86_64-linux/bin/x86_64-linux-" >> ~/.buildman
    - env:
        - BUILDMAN="kirkwood"
    - env:
        - BUILDMAN="m68k"
          TOOLCHAIN="m68k"
    - 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="ti"
    - env:
        - BUILDMAN="aarch64"
          TOOLCHAIN="aarch64"

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

# TODO make it perfect ;-r
