matrix:
  include:

    # ICU4C Docs Build
    #    TODO: publish the latest built docs from master on GitHub pages.
    #          See https://gist.github.com/vidavidorra/548ffbcdae99d752da02 for ideas.
    - name:     "c: docs"
      dist:     xenial
      language: cpp
      addons:
         apt:
           update: true
           packages:
             - doxygen
      before_script:
        - cd icu4c/source
        - ./runConfigureICU Linux --disable-renaming
      script:
        # fail if 'warning:' appears in doxygen's output, but ignore warnings from file Doxyfile.
        # The Doxygen version from Travis is down-rev, and doesn't recognize some options
        # in the Doxyfile config file.
        # Regex note: (?! ... ) is a negative lookahead. Succeed if the pattern is not present.
        - set +o pipefail && make doc 2>&1 | tee doxygen.log && ( ! grep -P 'warning:(?! .* file Doxyfile)' doxygen.log )


    - name: "j"
      language: java
      addons:
        apt:
          packages:
            - ant
            - ant-optional
      env:      BUILD=ICU4J
      before_script:
        - cd icu4j
        - ant init
      script:
        - ant check
      after_failure:
          -  cat `find out/junit-results -name "*.txt" -exec grep -l FAILED {} \;`

    - name: "c: linux gcc 8 Wextra"
      dist:     bionic
      language: cpp
      addons:
         apt:
           packages:
             - g++-8
      env: PREFIX=/tmp/icu-prefix CC=gcc-8 CXX=g++-8 CXXFLAGS="-Wextra"
      before_script:
        - mkdir build
        - cd build
        - ../icu4c/source/runConfigureICU Linux --disable-debug --enable-release --disable-layoutex --prefix="${PREFIX}" || (tail -100 config.log ; false)
        - make -j2
      script:
        - make -j2 check
        - make install
        - PATH="${PREFIX}/bin:$PATH" make -C test/hdrtst check

    # gcc debug build.
    # Includes dependency checker.
    # Note - the dependency checker needs to be run on both a debug and an optimized build.
    # This one (gcc) for debug, and linux clang (below) for optimized.
    #
    # Test both out-of-source and in-source builds. This one (gcc) for out-of-source,
    # and linux clang (below) for in-source.
    #
    # Invokes test/hdrtst to check public headers compliance.

    - name: "c: linux gcc"
      dist:     xenial
      language: cpp
      compiler: gcc
      env:      PREFIX=/tmp/icu-prefix
      before_script:
        - mkdir build
        - cd build
        - ../icu4c/source/runConfigureICU --enable-debug --disable-release Linux --prefix="${PREFIX}" --enable-tracing
        - make -j2
      script:
        - make -j2 check
        - ( cd ../icu4c/source/test/depstest && ./depstest.py ../../../../build/ )
        - make install
        - PATH="${PREFIX}/bin:$PATH" make -C test/hdrtst check

    # clang release build with some options to enforce useful constraints.
    # Includes dependency checker on an in-source, optimized build.
    # Includes checking @draft etc. API tags vs. ifndef guards like
    # U_HIDE_DRAFT_API and U_FORCE_HIDE_DRAFT_API.
    # (FORCE guards make this tool pass but won't compile to working code.
    # See the testtagsguards.sh script for details.)
    - name: "c: linux clang"
      dist:     xenial
      language: cpp
      env:
        - CPPFLAGS="-DU_NO_DEFAULT_INCLUDE_UTF_HEADERS=1"
        - CFLAGS="-Wimplicit-fallthrough"
        - CXXFLAGS="-Wimplicit-fallthrough"
      compiler: clang
      before_install:
        - sudo apt-get -y install doxygen  # for make dist
      before_script:
        - cd icu4c/source
        - ./runConfigureICU Linux
        - make -j2
      script:
        - make -j2 check
        - ( cd test/depstest && python3 depstest.py ../../../source/ )
        - ( cd .. && source/test/hdrtst/testtagsguards.sh )
        - make dist # not sure if this is -j safe everywhere.

    - name: "c: osx clang"
      language: cpp
      env:      BUILD=MACINTOSH
      os:       osx
      compiler: clang
      # Use the macOS target to test Python 2 in data build script.
      # TODO(ICU-20301): Change this back to the default Python version 3.
      script:   cd icu4c/source && PYTHON=python2 ./runConfigureICU MacOSX && make -j2 check

    # Clang Linux with address sanitizer.
    # Note - the 'sudo: true' option forces Travis to use a Virtual machine on GCE instead of
    #        a Container on EC2 or Packet. Asan builds of ICU fail otherwise.
    - name: "c: linux asan"
      language: cpp
      env:
        - CPPFLAGS="-fsanitize=address"
        - LDFLAGS="-fsanitize=address"
      os:       linux
      dist:     xenial
      sudo:     true
      compiler: clang
      before_script:
        - cd icu4c/source
        - ./runConfigureICU --enable-debug --disable-release Linux --disable-renaming --enable-tracing
        - make -j2
      script:
        - make -j2 check


    # Clang Linux with thread sanitizer.
    #
    - name: "c: linux tsan"
      language: cpp
      env:
          - INTLTEST_OPTS="utility/MultithreadTest"
          - CPPFLAGS="-fsanitize=thread"
          - LDFLAGS=-fsanitize=thread
      os:       linux
      dist:     xenial
      sudo:     true
      compiler: clang
      script:
          - cd icu4c/source
          - ./runConfigureICU --enable-debug --disable-release Linux --disable-renaming
          - make -j2
          - make -j2 -C test
          - make -j2 -C test/intltest check

    # copyright scan / future linter
    - name: "lint"
      script:
          - perl tools/scripts/cpysearch/cpyscan.pl

    - name: "j: icu4c release tools"
      language: "java"
      script:
        - mvn -f tools/release/java/pom.xml package dependency:analyze
      cache:
        directories:
        - $HOME/.m2