language: cpp

cache: ccache

branches:
  only:
  - master
  - debug
  - /^v\d.*$/
  - /^deploy-test(-.*)?$/

matrix:
  include:
  - name: Linux QMake
    os: linux
    dist: xenial
    env: BUILD_SYSTEM=qmake
    addons:
      apt:
        packages:
         - mesa-common-dev
         - libgl1-mesa-glx
         - libgl1-mesa-dev
         - libxkbcommon-x11-dev
         - ninja-build/xenial-backports

  - name: Linux CMake
    os: linux
    env: BUILD_SYSTEM=cmake_nodep
    addons:
      apt:
        packages:
         - mesa-common-dev
         - ninja-build
         - libgraphviz-dev
         - qt5-default
         - libqt5svg5-dev
         - qttools5-dev

  - name: Linux CMake + Deploy
    os: linux
    env: BUILD_SYSTEM=cmake DEPLOY=1
    dist: xenial
    addons:
      apt:
        packages:
         - mesa-common-dev
         - libgl1-mesa-glx
         - libgl1-mesa-dev
         - libxkbcommon-x11-dev
         - ninja-build/xenial-backports

  - name: Linux Ubuntu 16.04 # test that Cutter can be built on an old distro using system libraries
    os: linux
    env: BUILD_SYSTEM=cmake_nodep PATH="/usr/bin:$PATH"
    dist: xenial
    addons:
      apt:
        packages:
         - ninja-build
         - libgraphviz-dev
         - qt5-default
         - libqt5svg5-dev
         - qttools5-dev
         - qttools5-dev-tools
         - cmake
    before_install:
      - pyenv install 3.5.2
      - pyenv global 3.5.2
      - pip install meson==0.52.1


  - name: macOS QMake + Deploy
    os: osx
    osx_image: xcode10.3
    env: BUILD_SYSTEM=qmake DEPLOY=1
    before_install: ~

  - name: macOS CMake
    os: osx
    osx_image: xcode10.3
    env: BUILD_SYSTEM=cmake
    before_install: ~

  - name: Documentation + Deploy
    os: linux
    cache: ~
    addons:
      apt:
        packages:
         - doxygen
         - libgraphviz-dev
    before_install:
      - pyenv global 3.7
      - pip install -U sphinx
      - pip install -U breathe
      - pip install -U sphinx-rtd-theme
      - pip install -U recommonmark
    install: ~
    before_script: ~
    after_success: ~
    script:
    - cd docs
    - make html
    before_deploy:
    - cd "$TRAVIS_BUILD_DIR"
    - openssl aes-256-cbc -K $encrypted_bd0ed4c1fd75_key -iv $encrypted_bd0ed4c1fd75_iv -in scripts/deploy_docs_rsa.enc -out scripts/deploy_docs_rsa -d
    - chmod 600 scripts/deploy_docs_rsa
    - export GIT_SSH_COMMAND="/usr/bin/ssh -i $TRAVIS_BUILD_DIR/scripts/deploy_docs_rsa"
    - git config --global user.name "Travis CI"
    - git config --global user.email "travis@travis-ci.com"
    deploy:
      skip_cleanup: true
      provider: script
      script: bash scripts/deploy_docs.sh
      on:
        repo: radareorg/cutter
        branch: master


sudo: required
dist: bionic

addons:
  homebrew:
    brewfile: scripts/Brewfile
    update: true

before_install:
  - pyenv global 3.7
  - pip install meson

install:
  - if [[ "$BUILD_SYSTEM" != "cmake_nodep" ]]; then
      scripts/fetch_deps.sh;
      source cutter-deps/env.sh;
    fi
  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
        export PATH=/usr/local/opt/llvm/bin:$PATH;
        source scripts/prepare_breakpad_macos.sh;
    fi
  - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then 
        export LD_LIBRARY_PATH="`llvm-config --libdir`:$LD_LIBRARY_PATH";
        source scripts/prepare_breakpad_linux.sh;
    fi

before_script:
  - cd radare2
  - if [[ "$BUILD_SYSTEM" == "qmake" ]] || ([[ "$BUILD_SYSTEM" == "cmake" ]] && [[ "$TRAVIS_OS_NAME" == "linux" ]]) ; then
        if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
            INSTALL_TARGET=install sys/install.sh /usr;
        else
            LDFLAGS=-headerpad_max_install_names INSTALL_TARGET=install sys/install.sh;
        fi
    fi
  - cd ..

script:
  - mkdir build
  - cd build
  - export PKG_CONFIG_PATH="$CUSTOM_BREAKPAD_PREFIX/lib/pkgconfig:$CUSTOM_PYTHON_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH"
  - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
        if [[ "$BUILD_SYSTEM" == "qmake" ]]; then
            qmake
                CUTTER_ENABLE_PYTHON=true
                CUTTER_ENABLE_PYTHON_BINDINGS=true
                CUTTER_ENABLE_CRASH_REPORTS=true
                PREFIX=/usr
                ../src &&
            make -j4;
        elif [[ "$BUILD_SYSTEM" == "cmake" ]]; then
            cmake
                -DCMAKE_BUILD_TYPE=Release
                -DCMAKE_PREFIX_PATH="$Qt5_ROOT"
                -DPYTHON_LIBRARY="$CUTTER_DEPS_PYTHON_PREFIX/lib/libpython3.6m.so.1.0"
                -DPYTHON_INCLUDE_DIR="$CUTTER_DEPS_PYTHON_PREFIX/include/python3.6m"
                -DPYTHON_EXECUTABLE="$CUTTER_DEPS_PYTHON_PREFIX/bin/python3"
                -DCUTTER_ENABLE_PYTHON=ON
                -DCUTTER_ENABLE_PYTHON_BINDINGS=ON
                -DCUTTER_ENABLE_CRASH_REPORTS=ON
                -DCUTTER_USE_BUNDLED_RADARE2=OFF
                -DCUTTER_APPIMAGE_BUILD=ON
                -DCMAKE_INSTALL_PREFIX=appdir/usr
                ../src &&
            make -j4;
       elif [[ "$BUILD_SYSTEM" == "cmake_nodep" ]]; then
            cmake
                -DCMAKE_BUILD_TYPE=Release
                -DCUTTER_USE_BUNDLED_RADARE2=ON
                ../src &&
            make -j4;
       fi
    elif [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
        if [[ "$BUILD_SYSTEM" == "qmake" ]]; then
            qmake
                CUTTER_ENABLE_PYTHON=true
                CUTTER_ENABLE_PYTHON_BINDINGS=true
                SHIBOKEN_EXTRA_OPTIONS=-isystem/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include
                CUTTER_BUNDLE_R2_APPBUNDLE=true
                CUTTER_ENABLE_CRASH_REPORTS=true
                PYTHON_FRAMEWORK_DIR=$CUTTER_DEPS_PYTHON_FRAMEWORK_DIR
                BREAKPAD_FRAMEWORK_DIR=$BREAKPAD_FRAMEWORK_DIR
                ../src &&
            make -j4;
        elif [[ "$BUILD_SYSTEM" == "cmake" ]]; then
            cmake
                -DCMAKE_BUILD_TYPE=Release
                -DPYTHON_LIBRARY="$CUTTER_DEPS_PYTHON_PREFIX/lib/libpython3.6m.dylib"
                -DPYTHON_INCLUDE_DIR="$CUTTER_DEPS_PYTHON_PREFIX/include/python3.6m"
                -DPYTHON_EXECUTABLE="$CUTTER_DEPS_PYTHON_PREFIX/bin/python3"
                -DCUTTER_ENABLE_PYTHON=ON
                -DCUTTER_ENABLE_PYTHON_BINDINGS=ON
                -DSHIBOKEN_EXTRA_OPTIONS=-isystem/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include
                -DCUTTER_ENABLE_CRASH_REPORTS=ON
                -DCUTTER_USE_BUNDLED_RADARE2=ON
                -DBREAKPAD_FRAMEWORK_DIR="$BREAKPAD_FRAMEWORK_DIR"
                ../src &&
            make -j4;
       fi
    fi

after_success:
  - export CUTTER_VERSION=$(python ../scripts/get_version.py)
  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
      lrelease ../src/Cutter.pro &&
      mkdir -p Cutter.app/Contents/Resources/translations &&
      cp ../src/translations/*.qm Cutter.app/Contents/Resources/translations/ &&
      macdeployqt Cutter.app -executable=Cutter.app/Contents/MacOS/Cutter -libpath="../Frameworks" &&
      macdeployqt Cutter.app -executable=Cutter.app/Contents/MacOS/Cutter -libpath="../Frameworks" &&
      cp -a "$QTDIR/lib/QtDBus.framework" "$QTDIR/lib/QtPrintSupport.framework" Cutter.app/Contents/Frameworks &&
      cp -a "$BREAKPAD_FRAMEWORK_DIR/Breakpad.framework" Cutter.app/Contents/Frameworks &&
      "$TRAVIS_BUILD_DIR/scripts/appbundle_embed_python.sh" "$CUTTER_DEPS_PYTHON_FRAMEWORK_DIR/Python.framework" Cutter.app Cutter.app/Contents/MacOS/Cutter &&
      mv Cutter.app/Contents/MacOS/Cutter Cutter.app/Contents/MacOS/Cutter.bin &&
      cp ../src/macos/Cutter.sh Cutter.app/Contents/MacOS/Cutter &&
      chmod +x Cutter.app/Contents/MacOS/Cutter &&
      mkdir -p Cutter.app/Contents/Resources/r2/share &&
      cp -a /usr/local/share/radare2 Cutter.app/Contents/Resources/r2/share/ &&
      "$TRAVIS_BUILD_DIR/scripts/r2ghidra.sh" -DCMAKE_INSTALL_PREFIX="`pwd`/Cutter.app/Contents/Resources/r2" -DBUILD_CUTTER_PLUGIN=ON -DCUTTER_INSTALL_PLUGDIR="`pwd`/Cutter.app/Contents/Resources/plugins/native" -DCUTTER_SOURCE_DIR="$TRAVIS_BUILD_DIR" &&
      "$TRAVIS_BUILD_DIR/scripts/r2dec.sh" --prefix="`pwd`/Cutter.app/Contents/Resources/r2" &&
      mkdir image && cp -a Cutter.app image/ &&
      export VOL_NAME="Cutter v${CUTTER_VERSION}" &&
      export DMG_TMP_FILE="Cutter-v$CUTTER_VERSION-x64.macOS-tmp.dmg" &&
      export DMG_FILE="Cutter-v$CUTTER_VERSION-x64.macOS.dmg" &&
      export SIZE=`du -sh "image" | sed 's/\([0-9\.]*\)M\(.*\)/\1/'` &&
      export SIZE=`echo "${SIZE} + 10.0" | bc | awk '{print int($1+0.5)}'` &&
      hdiutil create -srcfolder image -volname "${VOL_NAME}" -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${SIZE}M "$DMG_TMP_FILE" &&
      export DEVICE=$(hdiutil attach -readwrite -noverify "${DMG_TMP_FILE}" | egrep '^/dev/' | sed 1q | awk '{print $1}') &&
      sleep 2 &&
      ../scripts/prepare_package_ui_macos.sh "Cutter" "${PWD}/../src/macos/cutter_mac_app.png" "${VOL_NAME}" &&
      hdiutil detach "${DEVICE}" &&
      hdiutil convert "${DMG_TMP_FILE}" -format UDZO -imagekey zlib-level=9 -o "${DMG_FILE}" &&
      export FILE_TO_UPLOAD="$DMG_FILE"
    ; fi
  - if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ $DEPLOY == 1 ]]; then
      export VERSION=$CUTTER_VERSION &&
      make install &&
      cp -r /usr/share/radare2 appdir/usr/share/ &&
      "$TRAVIS_BUILD_DIR/scripts/appimage_embed_python.sh" appdir &&
      "$TRAVIS_BUILD_DIR/scripts/r2ghidra.sh" -DCMAKE_INSTALL_PREFIX="`pwd`/appdir/usr" -DBUILD_CUTTER_PLUGIN=ON -DCUTTER_SOURCE_DIR="$TRAVIS_BUILD_DIR" &&
      "$TRAVIS_BUILD_DIR/scripts/r2dec.sh" --prefix=`pwd`/appdir/usr &&
      wget -c "https://github.com/probonopd/linuxdeployqt/releases/download/6/linuxdeployqt-6-x86_64.AppImage" &&
      chmod a+x linuxdeployqt*.AppImage &&
      rm -fv "$TRAVIS_BUILD_DIR/cutter-deps/qt/plugins/imageformats/libqjp2.so" &&
      ./linuxdeployqt*.AppImage ./appdir/usr/share/applications/*.desktop -executable=./appdir/usr/bin/python3 -bundle-non-qt-libs -no-strip -exclude-libs=libnss3.so,libnssutil3.so,libqjp2.so -ignore-glob=usr/lib/python3.6/**/* -verbose=2 &&
      ./linuxdeployqt*.AppImage ./appdir/usr/share/applications/*.desktop -executable=./appdir/usr/bin/python3 -appimage -no-strip -exclude-libs=libnss3.so,libnssutil3.so,libqjp2.so -ignore-glob=usr/lib/python3.6/**/* -verbose=2 &&
      find ./appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq &&
      export APPIMAGE_FILE="Cutter-v$CUTTER_VERSION-x64.Linux.AppImage" &&
      mv Cutter-*-x86_64.AppImage "$APPIMAGE_FILE" &&
      export FILE_TO_UPLOAD="$APPIMAGE_FILE"
    ; fi

deploy:
  skip_cleanup: true
  provider: releases
  draft: true
  prerelease: true
  tag_name: $TRAVIS_TAG
  api_key:
    secure: ZXuSX8JXyL0HlJvSIda3ftMkvYsrxoWDcWm2LxO+f0uNFghCHNnISuH/btdipn2mjCBaBQl6/1IK5cg/AZ5OSkiaVsJJqY8kkPsZvR8K+k4oarsr2ApetlLZiZWtydC3J+UyNhsgCt4iuYPsvusANFPZBpVmqT+A5CHS7aPIqP00awbkJYG1uOENe2XVZ0vyotBqU0E7A9f8UO5ps0+qysS8W+NDB+CGLgKLeBfCk3U+IYKGYXcv66xCmSSZ5f7IVIXEjG4voFHGp9XLRY2R/iJgiKQKDbu519vUB3iKPzmLTB/Q9bNz4VMZCREa4SHaLDen730fMHbfm6ZhGZDzXg1DgZoh6RHptWf0WjcHTr1ch8ajpnBMxh/qmoRpaS00FJQMraMT3Il38ekYd+hOhsP58Bj1Db2vjBKopGEHGmVyFQZKuynrdKmpmY+kRNUT3QerIsiAHwHV2QXnMARHYXJrM0T7LNACa2mhiwQD2vNIqLRieIbHbSWgDUrTVTDeII23AAHCzD0YxcCAjSExjun/rc9dJjevgCoBpTM/NHPLCW4big1myx+vRQGPNdlf+dI7igm6bPVWB7znp5uXlI8q5irvqTVtRSvKbcaeDWOz/ki7QgOzaxmGFtaw30hxeY0wFlnSMXc8m42udWLkp/l0b4L0hcoaMTc1TvVU0i4=
  file:
    - "${FILE_TO_UPLOAD}"
  on:
    tags: true
    condition: $DEPLOY = 1