language: c

git:
  depth: 5

addons:
  apt:
    packages:
    - libssl-dev
    - libevent-dev
    - libexpat-dev
    - clang
  homebrew:
    packages:
      - openssl
      - libevent
      - expat
    # homebrew update takes 20min or hangs, so disable update
    #update: true

jobs:
  include:
    - os: linux
      name: GCC on Linux, Amd64
      compiler: gcc
      arch: amd64
      env:
        - CONFIG_OPTS="--enable-debug --disable-flto"
    - os: linux
      name: Clang on Linux, Amd64, clang-analysis
      compiler: clang
      arch: amd64
      env:
        - CONFIG_OPTS="--enable-debug --disable-flto"
        - TEST_ANALYZER=yes
    - os: osx
      osx_image: xcode12.2
      name: Clang on OS X, Amd64, clang-analysis
      compiler: clang
      arch: amd64
      env:
        - TEST_OSX=yes
        - CONFIG_OPTS="--enable-debug --disable-flto --with-ssl=/usr/local/opt/openssl --with-libexpat=/usr/local/opt/expat"
        - TEST_ANALYZER=yes
        - HOMEBREW_NO_AUTO_UPDATE=1
    - os: linux
      name: Libevent, GCC on Linux, Amd64
      compiler: gcc
      arch: amd64
      env:
        - TEST_LIBEVENT=yes
        - CONFIG_OPTS="--with-libevent"
    - os: linux
      name: Libevent, Clang on Linux, Amd64
      compiler: clang
      arch: amd64
      env:
        - TEST_LIBEVENT=yes
        - CONFIG_OPTS="--with-libevent"
    - os: osx
      osx_image: xcode12.2
      name: Libevent, Clang on OS X, Amd64
      compiler: clang
      arch: amd64
      env:
        - TEST_OSX=yes
        - TEST_LIBEVENT=yes
        - CONFIG_OPTS="--disable-flto --with-ssl=/usr/local/opt/openssl --with-libevent=/usr/local/opt/libevent --with-libexpat=/usr/local/opt/expat"
        - HOMEBREW_NO_AUTO_UPDATE=1
    - os: linux
      name: UBsan, GCC on Linux, Amd64
      compiler: gcc
      arch: amd64
      dist: bionic
      env:
        - TEST_UBSAN=yes
    - os: linux
      name: UBsan, Clang on Linux, Amd64
      compiler: clang
      arch: amd64
      dist: bionic
      env:
        - TEST_UBSAN=yes
    - os: linux
      name: Asan, GCC on Linux, Amd64
      compiler: gcc
      arch: amd64
      dist: bionic
      env:
        - TEST_ASAN=yes
    - os: linux
      name: Asan, Clang on Linux, Amd64
      compiler: clang
      arch: amd64
      dist: bionic
      env:
        - TEST_ASAN=yes
    - os: linux
      name: GCC on Linux, Aarch64
      compiler: gcc
      arch: arm64
      dist: bionic
      env:
        - CONFIG_OPTS="--enable-debug --disable-flto"
    - os: linux
      name: Clang on Linux, Aarch64
      compiler: clang
      arch: arm64
      dist: bionic
      env:
        - CONFIG_OPTS="--enable-debug --disable-flto"
    - os: linux
      name: GCC on Linux, PowerPC64
      compiler: gcc
      arch: ppc64le
      dist: bionic
      env:
        - CONFIG_OPTS="--enable-debug --disable-flto"
    - os: linux
      name: Clang on Linux, PowerPC64
      compiler: clang
      arch: ppc64le
      dist: bionic
      env:
        - CONFIG_OPTS="--enable-debug --disable-flto"
    - os: linux
      name: GCC on Linux, s390x
      compiler: gcc
      arch: s390x
      dist: bionic
      env:
        - CONFIG_OPTS="--enable-debug --disable-flto"
    - os: linux
      name: Clang on Linux, s390x
      compiler: clang
      arch: s390x
      dist: bionic
      env:
        - CONFIG_OPTS="--enable-debug --disable-flto"
    - os: osx
      osx_image: xcode12.2
      name: Apple iPhone on iOS, armv7
      compiler: clang
      env:
        - TEST_IOS=yes
        - AUTOTOOLS_HOST=armv7-apple-ios
        - OPENSSL_HOST=ios-cross
        - IOS_SDK=iPhoneOS
        - IOS_CPU=armv7s
        - IOS_PREFIX="$HOME/$IOS_SDK-$IOS_CPU"
        - HOMEBREW_NO_AUTO_UPDATE=1
    - os: osx
      osx_image: xcode12.2
      name: Apple iPhone on iOS, arm64
      compiler: clang
      env:
        - TEST_IOS=yes
        - AUTOTOOLS_HOST=aarch64-apple-ios
        - OPENSSL_HOST=ios64-cross
        - IOS_SDK=iPhoneOS
        - IOS_CPU=arm64
        - IOS_PREFIX="$HOME/$IOS_SDK-$IOS_CPU"
        - HOMEBREW_NO_AUTO_UPDATE=1
    - os: osx
      osx_image: xcode12.2
      name: Apple TV on iOS, arm64
      compiler: clang
      env:
        - TEST_IOS=yes
        - AUTOTOOLS_HOST=aarch64-apple-ios
        - OPENSSL_HOST=ios64-cross
        - IOS_SDK=AppleTVOS
        - IOS_CPU=arm64
        - IOS_PREFIX="$HOME/$IOS_SDK-$IOS_CPU"
        - HOMEBREW_NO_AUTO_UPDATE=1
    - os: osx
      osx_image: xcode12.2
      name: Apple Watch on iOS, armv7
      compiler: clang
      env:
        - TEST_IOS=yes
        - AUTOTOOLS_HOST=armv7-apple-ios
        - OPENSSL_HOST=ios-cross
        - IOS_SDK=WatchOS
        - IOS_CPU=armv7k
        - IOS_PREFIX="$HOME/$IOS_SDK-$IOS_CPU"
        - HOMEBREW_NO_AUTO_UPDATE=1
    - os: osx
      osx_image: xcode12.2
      name: iPhoneSimulator on OS X, i386
      env:
        - TEST_IOS=yes
        - AUTOTOOLS_HOST=i386-apple-ios
        - OPENSSL_HOST=iphoneos-cross
        - IOS_CPU=i386
        - IOS_SDK=iPhoneSimulator
        - IOS_PREFIX="$HOME/$IOS_SDK-$IOS_CPU"
        - HOMEBREW_NO_AUTO_UPDATE=1
    - os: osx
      osx_image: xcode12.2
      name: iPhoneSimulator on OS X, x86_64
      env:
        - TEST_IOS=yes
        - AUTOTOOLS_HOST=x86_64-apple-ios
        - OPENSSL_HOST=iphoneos-cross
        - IOS_CPU=x86_64
        - IOS_SDK=iPhoneSimulator
        - IOS_PREFIX="$HOME/$IOS_SDK-$IOS_CPU"
        - HOMEBREW_NO_AUTO_UPDATE=1
    - os: osx
      osx_image: xcode12.2
      name: AppleTVSimulator on OS X, x86_64
      env:
        - TEST_IOS=yes
        - AUTOTOOLS_HOST=x86_64-apple-ios
        - OPENSSL_HOST=iphoneos-cross
        - IOS_CPU=x86_64
        - IOS_SDK=AppleTVSimulator
        - IOS_PREFIX="$HOME/$IOS_SDK-$IOS_CPU"
        - HOMEBREW_NO_AUTO_UPDATE=1
    - os: osx
      osx_image: xcode12.2
      name: WatchSimulator on OS X, i386
      env:
        - TEST_IOS=yes
        - AUTOTOOLS_HOST=i386-apple-ios
        - OPENSSL_HOST=iphoneos-cross
        - IOS_CPU=i386
        - IOS_SDK=WatchSimulator
        - IOS_PREFIX="$HOME/$IOS_SDK-$IOS_CPU"
        - HOMEBREW_NO_AUTO_UPDATE=1
    - os: linux
      name: Android armv7a, Linux, Amd64
      compiler: clang
      arch: amd64
      dist: bionic
      env:
        - TEST_ANDROID=yes
        - AUTOTOOLS_HOST=armv7a-linux-androideabi
        - OPENSSL_HOST=android-arm
        - ANDROID_CPU=armv7a
        - ANDROID_API=23
        - ANDROID_PREFIX="$HOME/android$ANDROID_API-$ANDROID_CPU"
        - ANDROID_SDK_ROOT="$HOME/android-sdk"
        - ANDROID_NDK_ROOT="$HOME/android-ndk"
    - os: linux
      name: Android aarch64, Linux, Amd64
      compiler: clang
      arch: amd64
      dist: bionic
      env:
        - TEST_ANDROID=yes
        - AUTOTOOLS_HOST=aarch64-linux-android
        - OPENSSL_HOST=android-arm64
        - ANDROID_CPU=aarch64
        - ANDROID_API=23
        - ANDROID_PREFIX="$HOME/android$ANDROID_API-$ANDROID_CPU"
        - ANDROID_SDK_ROOT="$HOME/android-sdk"
        - ANDROID_NDK_ROOT="$HOME/android-ndk"
    - os: linux
      name: Android x86, Linux, Amd64
      compiler: clang
      arch: amd64
      dist: bionic
      env:
        - TEST_ANDROID=yes
        - AUTOTOOLS_HOST=i686-linux-android
        - OPENSSL_HOST=android-x86
        - ANDROID_CPU=x86
        - ANDROID_API=23
        - ANDROID_PREFIX="$HOME/android$ANDROID_API-$ANDROID_CPU"
        - ANDROID_SDK_ROOT="$HOME/android-sdk"
        - ANDROID_NDK_ROOT="$HOME/android-ndk"
    - os: linux
      name: Android x86_64, Linux, Amd64
      compiler: clang
      arch: amd64
      dist: bionic
      env:
        - TEST_ANDROID=yes
        - AUTOTOOLS_HOST=x86_64-linux-android
        - OPENSSL_HOST=android-x86_64
        - ANDROID_CPU=x86_64
        - ANDROID_API=23
        - ANDROID_PREFIX="$HOME/android$ANDROID_API-$ANDROID_CPU"
        - ANDROID_SDK_ROOT="$HOME/android-sdk"
        - ANDROID_NDK_ROOT="$HOME/android-ndk"

  allow_failures:
    - os: osx
      name: Apple iPhone on iOS, armv7
    - os: osx
      name: Apple iPhone on iOS, arm64
    - os: osx
      name: Apple TV on iOS, arm64
    - os: osx
      name: Apple Watch on iOS, armv7
    - os: osx
      name: iPhoneSimulator on OS X, i386
    - os: osx
      name: iPhoneSimulator on OS X, x86_64
    - os: osx
      name: AppleTVSimulator on OS X, x86_64
    - os: osx
      name: WatchSimulator on OS X, i386
    - os: linux
      name: Android armv7a, Linux, Amd64
    - os: linux
      name: Android aarch64, Linux, Amd64
    - os: linux
      name: Android x86, Linux, Amd64
    - os: linux
      name: Android x86_64, Linux, Amd64

before_script:
  - |
    if [ "$TEST_ANDROID" = "yes" ]; then
      ./contrib/android/install_tools.sh
    elif [ "$TEST_IOS" = "yes" ]; then
      ./contrib/ios/install_tools.sh
    fi

# The Travis docs say to avoid calling exit in the script. It leads to
# some code duplication to avoid failures in cross-compiles. Also see
# https://docs.travis-ci.com/user/job-lifecycle/ in the Travis docs.
script:
  - |
    export MAKE_TEST="yes"
    if [ "$TEST_UBSAN" = "yes" ]; then
      export CFLAGS="-DNDEBUG -g2 -O3 -fsanitize=undefined -fno-sanitize-recover=all"
    elif [ "$TEST_ASAN" = "yes" ]; then
      export CFLAGS="-DNDEBUG -g2 -O3 -fsanitize=address"
    fi
  - |
    if [ "$TEST_IOS" = "yes" ]; then
      export AUTOTOOLS_BUILD="$(./config.guess)"
      export PKG_CONFIG_PATH="$IOS_PREFIX/lib/pkgconfig"
      source ./contrib/ios/setenv_ios.sh
      ./contrib/ios/install_openssl.sh
      ./contrib/ios/install_expat.sh
      export CONFIG_OPTS="\
        --build=$AUTOTOOLS_BUILD --host=$AUTOTOOLS_HOST \
        --prefix=$IOS_PREFIX \
        --with-ssl=$IOS_PREFIX --disable-gost \
        --with-libexpat=$IOS_PREFIX "
      echo CONFIG_OPTS ${CONFIG_OPTS}
      export MAKE_TEST=no
      export TEST_INSTALL=yes
    fi
  - |
    if [ "$TEST_ANDROID" = "yes" ]; then
      export AUTOTOOLS_BUILD="$(./config.guess)"
      export PKG_CONFIG_PATH="$ANDROID_PREFIX/lib/pkgconfig"
      ./contrib/android/install_ndk.sh
      source ./contrib/android/setenv_android.sh
      ./contrib/android/install_openssl.sh
      ./contrib/android/install_expat.sh
      export CONFIG_OPTS="\
        --build=$AUTOTOOLS_BUILD --host=$AUTOTOOLS_HOST \
        --prefix=$ANDROID_PREFIX \
        --with-ssl=$ANDROID_PREFIX --disable-gost \
        --with-libexpat=$ANDROID_PREFIX "
      echo CONFIG_OPTS ${CONFIG_OPTS}
      export MAKE_TEST=no
      export TEST_INSTALL=yes
    fi
  - ./configure ${CONFIG_OPTS}
  - make -j 2
  - |
    if [ "$MAKE_TEST" = "yes" ]; then
      make test
    fi
  - |
    if [ "$TEST_INSTALL" = "yes" ]; then
      make install
    fi
  - |
    if [ "$TEST_ANALYZER" = "yes" ]; then
      (cd testdata/clang-analysis.tdir; bash clang-analysis.test)
    fi
