language: c

git:
  depth: 5

addons:
  apt:
    packages:
    - libssl-dev
    - libevent-dev
    - libexpat-dev
    - clang
  homebrew:
    packages:
      - openssl
      - libevent
      - expat
    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
      compiler: clang
      arch: amd64
      env:
        - CONFIG_OPTS="--enable-debug --disable-flto"
    - os: osx
      name: Clang on OS X, Amd64
      compiler: clang
      arch: amd64
      env:
        - TEST_OSX=yes
        - CONFIG_OPTS="--enable-debug --disable-flto --with-ssl=/usr/local/opt/openssl/"
    - 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
      name: Libevent, Clang on OS X, Amd64
      compiler: clang
      arch: amd64
      env:
        - TEST_OSX=yes
        - TEST_LIBEVENT=yes
        - CONFIG_OPTS="--with-ssl=/usr/local/opt/openssl/ --with-libevent=/usr/local/opt/libevent/"
    - 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: xcode10
      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"
    - os: osx
      osx_image: xcode10
      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"
    - os: osx
      osx_image: xcode10
      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"
    - os: osx
      osx_image: xcode10
      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"
    - os: osx
      osx_image: xcode10
      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"
    - os: osx
      osx_image: xcode10
      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"
    - os: osx
      osx_image: xcode10
      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"
    - os: osx
      osx_image: xcode10
      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"
    - 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: 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:
  - |
    if [ "$TEST_UBSAN" = "yes" ]; then
      export CFLAGS="-DNDEBUG -g2 -O3 -fsanitize=undefined -fno-sanitize-recover"
      ./configure
      make -j 2
      make test
    elif [ "$TEST_ASAN" = "yes" ]; then
      export CFLAGS="-DNDEBUG -g2 -O3 -fsanitize=address"
      ./configure
      make -j 2
      make test
    elif [ "$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
      ./configure \
        --build="$AUTOTOOLS_BUILD" --host="$AUTOTOOLS_HOST" \
        --prefix="$IOS_PREFIX" \
        --with-ssl="$IOS_PREFIX" --disable-gost \
        --with-libexpat="$IOS_PREFIX";
      make -j 2
      make install
    elif [ "$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
      ./configure \
        --build="$AUTOTOOLS_BUILD" --host="$AUTOTOOLS_HOST" \
        --prefix="$ANDROID_PREFIX" \
        --with-ssl="$ANDROID_PREFIX" --disable-gost \
        --with-libexpat="$ANDROID_PREFIX";
      make -j 2
      make install
    elif [ "$TEST_OSX" = "yes" ]; then
      ./configure --enable-debug --disable-flto --with-ssl=/usr/local/opt/openssl/
      make -j 2
      make test
      (cd testdata/clang-analysis.tdir; bash clang-analysis.test)
    else
      ./configure ${CONFIG_OPTS}
      make -j 2
      make test
      (cd testdata/clang-analysis.tdir; bash clang-analysis.test)
    fi
