language: cpp
cache: apt
env:
  global:
   # GH_TOKEN=[secure]             (to push to osx/windows repo under soonhokong)
   - secure: "bDcZ1BusPgeFcilXBXqJ+aLWmCD6ET6SY6GaIDz66zFFVvHULkr8PcGQgKHw/VxH4Kbll52hkKwYgKhXyBF+VlHiyAxQHzlr17honzIl42vbz+tC5qr4/oDASolqayUtz9xJqNOFbTwvh5EHZLbG5hjudSdGE8LX3QC6IN7wYy8="
   # DROPBOX_KEY=[secure]          (to send binaries to dropbox, "access_token")
   - secure: "CyASf1F7hGwB85jUQOfDoNBQSouSayP4BVvjqAJdRxirui/oyw2sJ02HC6ZTM+LO+ZyWy3eJOGwe81z6PEQFzovv9C8VLRbhV8Tk7aN+nQTCyyKLoxsON/T5PO/C74ZSu5hTNMwnHrbdphc88Y4ZrQqL2M3cTWT5nVFCshEq6IM="
   # REPO=BLESSED                  (to perform extra stuff only for pushes to the blessed repo)
   - secure: "iZEcYPaxqGRQs7loHwO88DlewbRngBwoNGfo438jabh0adF3y9zCPw0tcAtp6IJuCw8E6QVoM9JMwoQRvPbnqBelFjpXH+U3eYdaeeZRkBkyOthTWzzdwEexlnK7dXVEc+gTDjh2NBD9juXKDSJ5xOF1HfhEJaMXSLairnhpL6k="
   # COVERALLS_REPO_TOKEN=[secure] (from https://coveralls.io/r/leanprover/lean)
   - secure: "j14U5pV2qkArCTt4MdI+rYe9MzcIcoMYrPX3Kp4bFNAyxfTALHG25bZUaEyqBJKPevch02+i8hs3I/+b9Iue0j8be8hjy7GSKDEkhbd8HIWJMvMBM1Y+h88ZPTvTiEB9OCbHa6PrETN+3WO8cSe3PufWO7cwoOqzWuY440ZZqSM="
   # BB_TOKEN=[secure]             (to push to https://bitbucket.org/leanprover/lean for backup & email diff)
   - secure: "NvPi430kKhteshcxiYP4oHbMFaSiz6bmoENA55sxD7bI0EmsKvuRJFPfFr3g8gl9hNnuNABOTK4xNcWjNDRtHBjnGYHytyaYLEYjpNGTlmTzc21q/FheWL32K2rkvvaRa0ZrDt8p1k1lr07Z69oFFIGCigAdcTCEhMO9Clxlxts="
  matrix:
   # =======================================================
   # TESTCOV Build
   # =======================================================
   # TC. g++-4.8      | DEBUG                   | CDASH
   - CMAKE_CXX_COMPILER=g++-4.8
     CMAKE_BUILD_TYPE=Debug
     TESTCOV=ON
     PUSH_TO_CDASH=TRUE
     TCMALLOC=OFF
     LUA=52
   # =======================================================
   # DEBUG Build
   # =======================================================
   # D1. clang++-3.3  | DEBUG   | TCMALLOC       | CDASH
   - CMAKE_CXX_COMPILER=clang++-3.3
     CMAKE_BUILD_TYPE=DEBUG
     TCMALLOC=ON
     PUSH_TO_CDASH=TRUE
     LUA=52
   # D2. g++-4.8     | DEBUG    | TCMALLOC       | CDASH + TRIGGERS
   - CMAKE_CXX_COMPILER=g++-4.8
     CMAKE_BUILD_TYPE=DEBUG
     TRIGGER_BB=TRUE
     TRIGGER_OSX=TRUE
     TRIGGER_WINDOWS=TRUE
     TCMALLOC=ON
     PUSH_TO_CDASH=TRUE
     LUA=52
   # D3. clang++-3.3 | DEBUG
   - CMAKE_CXX_COMPILER=clang++-3.3
     CMAKE_BUILD_TYPE=DEBUG
     TCMALLOC=OFF
     PUSH_TO_CDASH=TRUE
     LUA=52
   # D4. g++-4.8     | DEBUG
   - CMAKE_CXX_COMPILER=g++-4.8
     CMAKE_BUILD_TYPE=DEBUG
     TCMALLOC=OFF
     PUSH_TO_CDASH=TRUE
     LUA=52
   # =======================================================
   # RELEASE Build
   # =======================================================
   # R1. clang++-3.3 | RELEASE | TCMALLOC        | CDASH
   - CMAKE_CXX_COMPILER=clang++-3.3
     CMAKE_BUILD_TYPE=RELEASE
     TCMALLOC=ON
     PUSH_TO_CDASH=TRUE
     LUA=52
   # R2. g++-4.8     | RELEASE | TCMALLOC        | CDASH + UPLOAD=>DROPBOX
   - CMAKE_CXX_COMPILER=g++-4.8
     CMAKE_BUILD_TYPE=RELEASE
     TCMALLOC=ON
     UPLOAD=linux_tcmalloc
     PUSH_TO_CDASH=TRUE
     LUA=52
     PACKAGE=TRUE
   # R3. clang++-3.3 | RELEASE
   - CMAKE_CXX_COMPILER=clang++-3.3
     CMAKE_BUILD_TYPE=RELEASE
     TCMALLOC=OFF
     PUSH_TO_CDASH=TRUE
     LUA=52
   # R4. g++-4.8    | RELEASE                    | UPLOAD=>DROPBOX
   - CMAKE_CXX_COMPILER=g++-4.8
     CMAKE_BUILD_TYPE=RELEASE
     TCMALLOC=OFF
     UPLOAD=linux
     PUSH_TO_CDASH=TRUE
     LUA=52
   # =======================================================
   # MEMCHECK Build
   # =======================================================
   # M1-1. clang++-3.3 | DEBUG    | MEMCHECK       | CDASH
   - CMAKE_CXX_COMPILER=clang++-3.3
     CMAKE_BUILD_TYPE=DEBUG
     TCMALLOC=OFF
     MEMCHECK=TRUE
     MEMCHECK_RANGE=1,40
     PUSH_TO_CDASH=TRUE
     LUA=52
   # M1-2. clang++-3.3 | DEBUG    | MEMCHECK       | CDASH
   - CMAKE_CXX_COMPILER=clang++-3.3
     CMAKE_BUILD_TYPE=DEBUG
     TCMALLOC=OFF
     MEMCHECK=TRUE
     MEMCHECK_RANGE=40,80
     PUSH_TO_CDASH=TRUE
     LUA=52
   # M2-1. g++-4.8     | DEBUG    | MEMCHECK       | CDASH
   - CMAKE_CXX_COMPILER=g++-4.8
     CMAKE_BUILD_TYPE=DEBUG
     TCMALLOC=OFF
     MEMCHECK=TRUE
     MEMCHECK_RANGE=1,40
     PUSH_TO_CDASH=TRUE
     LUA=52
    # M2-2. g++-4.8     | DEBUG    | MEMCHECK       | CDASH
   - CMAKE_CXX_COMPILER=g++-4.8
     CMAKE_BUILD_TYPE=DEBUG
     TCMALLOC=OFF
     MEMCHECK=TRUE
     MEMCHECK_RANGE=40,80
     PUSH_TO_CDASH=TRUE
     LUA=52
   # =======================================================
   # DOXYGEN Build
   # =======================================================
   # DOC. g++-4.8      | DEBUG   | TCMALLOC      | DOXYGEN=>DROPBOX
   - CMAKE_CXX_COMPILER=g++-4.8
     CMAKE_BUILD_TYPE=DOXYGEN
     BUILD_DOXYGEN=TRUE
     TCMALLOC=OFF
     LUA=52
   # =======================================================
   # Different Lua Versions
   # =======================================================
   # L51. g++-4.8     | RELEASE |                | CDASH
   - CMAKE_CXX_COMPILER=g++-4.8
     CMAKE_BUILD_TYPE=RELEASE
     TCMALLOC=OFF
     UPLOAD=linux
     PUSH_TO_CDASH=TRUE
     LUA=51
   # LJIT. g++-4.8     | RELEASE |                | CDASH
   - CMAKE_CXX_COMPILER=g++-4.8
     CMAKE_BUILD_TYPE=RELEASE
     TCMALLOC=OFF
     UPLOAD=linux
     PUSH_TO_CDASH=TRUE
     LUA=JIT

install:
  - until sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test; do echo retry; done
  - until sudo add-apt-repository --yes ppa:h-rayflood/llvm; do echo retry; done
  - until sudo add-apt-repository --yes ppa:kalakris/cmake; do echo retry; done
  - until sudo apt-get -qq update; do echo retry; done
  - if [[ $TCMALLOC == ON ]]; then until sudo add-apt-repository --yes ppa:agent-8131/ppa && sudo apt-get -qq update && sudo apt-get -qq install libgoogle-perftools-dev; do echo retry; done; fi
  - until sudo apt-get -qq install libgmp-dev libmpfr-dev; do echo retry; done
  - until sudo apt-get -qq install cmake python; do echo retry; done
  - if [[ $LUA == 52 ]]; then
       until sudo apt-get -qq install liblua5.2.0 lua5.2-0 lua5.2-dev; do echo retry; done;
    fi
  - if [[ $LUA == 51 ]]; then
       until sudo apt-get -qq install liblua5.1-0 liblua5.1-0-dev lua5.1; do echo retry; done;
    fi
  - if [[ $LUA == JIT ]]; then
       until sudo add-apt-repository --yes ppa:miurahr/openresty-devel; do echo retry; done;
       until sudo apt-get -qq update; do echo retry; done;
       until sudo apt-get -qq install libluajit-5.1-dev luajit; do echo retry; done;
    fi
  - wget http://dl.dropboxusercontent.com/u/203889738/gcc/ninja.tar.gz;
    tar xfz ninja.tar.gz;
    cd ninja;
    ./bootstrap.py > /dev/null 2>&1;
    sudo cp -v ninja /usr/bin/;
    cd ..;
  - until sudo apt-get -qq install libstdc++-4.8-dev; do echo retry; done
  - if [[ $REPO == BLESSED && $MEMCHECK == TRUE ]]; then
       sudo apt-get -qq install valgrind;
    fi
  - if [[ $CMAKE_CXX_COMPILER == g++-4.8 ]]; then until sudo apt-get -qq install g++-4.8; do echo retry; done fi
  - if [[ $CMAKE_CXX_COMPILER == clang++-3.3 ]]; then until sudo apt-get -qq install clang-3.3; do echo retry; done fi
  - if [[ $REPO == BLESSED && ($UPLOAD || $BUILD_DOXYGEN == TRUE) ]]; then
       sudo apt-get -qq install python python-pip;
       sudo pip install dropbox;
    fi
  - if [[ $TESTCOV == ON ]]; then
       wget http://downloads.sourceforge.net/ltp/lcov-1.10.tar.gz;
       tar xvfz lcov-1.10.tar.gz;
       sudo cp -v lcov-1.10/bin/{lcov,genpng,gendesc,genhtml,geninfo} /usr/bin/;
       sudo chmod 777 /usr/bin/lcov /usr/bin/genhtml /usr/bin/geninfo /usr/bin/genpng /usg/bin/gendesc;
       rm -rf lcov-1.10.tar.gz lcov-1.10;
       sudo mv -v `which gcov-4.8` `which gcov`;
    fi

before_script:
- if [[ $REPO == BLESSED && $TRIGGER_BB == TRUE ]]; then
      git fetch --unshallow;
      git push -q https://soonhok:${BB_TOKEN}@bitbucket.org/leanprover/lean.git +HEAD:master;
  fi
- if [[ $REPO == BLESSED && $TRIGGER_OSX == TRUE ]]; then
      MSG=`git log --pretty=oneline --abbrev-commit -n 1 | cut -d ' ' -f 2-`;
      cp .travis.yml /tmp/.travis.temp.yml;
      cp .travis.osx.yml .travis.yml;
      git config --global user.email "notifications@travis-ci.org";
      git config --global user.name "Travis CI";
      git add .travis.yml;
      git commit -m "$MSG";
      git push -q https://soonhokong:${GH_TOKEN}@github.com/soonhokong/lean-osx.git +HEAD:master;
      mv /tmp/.travis.temp.yml .travis.yml;
      git reset --hard HEAD~;
  fi
- if [[ $REPO == BLESSED && $TRIGGER_WINDOWS == TRUE ]]; then
      MSG=`git log --pretty=oneline --abbrev-commit -n 1 | cut -d ' ' -f 2-`;
      cp .travis.yml /tmp/.travis.temp.yml;
      cp .travis.windows.yml .travis.yml;
      git config --global user.email "notifications@travis-ci.org";
      git config --global user.name "Travis CI";
      git add .travis.yml;
      git commit -m "$MSG";
      git push -q https://soonhokong:${GH_TOKEN}@github.com/soonhokong/lean-windows.git +HEAD:master;
      mv /tmp/.travis.temp.yml .travis.yml;
      git reset --hard HEAD~;
  fi

script:
  - mkdir -p build
  - cd build
  - if [[ $CMAKE_BUILD_TYPE == RELEASE && $CMAKE_CXX_COMPILER=clang++-3.3 ]]; then
       GENERATOR=;
    else
       GENERATOR=-GNinja;
    fi
  - if [[ $TESTCOV != ON ]]; then
       TESTCOV=OFF;
    fi
  - /usr/bin/cmake -DIGNORE_SORRY=ON -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DTESTCOV=${TESTCOV} -DTCMALLOC=${TCMALLOC} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} ${GENERATOR} -DCMAKE_PROGRAM_PATH=/usr/bin ../src;
  - if [[ $CMAKE_BUILD_TYPE == DEBUG || $CMAKE_BUILD_TYPE == RELEASE || $TESTCOV == ON ]]; then
       SITE=Ubuntu12.04@Travis;
       if [[ $CMAKE_BUILD_TYPE == RELEASE ]]; then
           BUILD_TYPE=Release;
       else
           BUILD_TYPE=Debug;
       fi;
       LUA_VERSION=LUA_${LUA};
       BUILD_NAME=${TRAVIS_BRANCH}_${CMAKE_CXX_COMPILER}_${BUILD_TYPE}_${LUA_VERSION};
       if [[ $TCMALLOC == ON ]]; then
           BUILD_NAME=${BUILD_NAME}_TC;
       fi;
       CONFIG_FILE=DartConfiguration.tcl;
       sed -i "s/^Site:.*/Site:$SITE/" $CONFIG_FILE;
       sed -i "s/BuildName:.*/BuildName:$BUILD_NAME/" $CONFIG_FILE;
       if [[ $MEMCHECK == TRUE ]]; then
           ninja -j 1;
       else
           ctest -D ExperimentalConfigure;
           sed -i "s/^Site:.*/Site:$SITE/" $CONFIG_FILE;
           sed -i "s/BuildName:.*/BuildName:$BUILD_NAME/" $CONFIG_FILE;
           ctest -D ExperimentalBuild -VV;
           yes "C" | ctest -D ExperimentalTest -VV | ../script/demangle_cpptype.py;
       fi;
    fi
  - cd ..

after_script:
- cd build
- if [[ $REPO == BLESSED && $TESTCOV == ON ]]; then
     ctest -D ExperimentalCoverage;
     ninja cov;
     npm install coveralls --save;
     cat coverage.info.cleaned | ./node_modules/coveralls/bin/coveralls.js;
  fi
- if [[ $REPO == BLESSED && $MEMCHECK == TRUE ]]; then
     MEMCHECK_SUPP=`readlink -f ../src/memcheck.supp`;
     CONFIG_FILE=DartConfiguration.tcl;
     sed -i "s,^MemoryCheckSuppressionFile:\W*$,MemoryCheckSuppressionFile:$MEMCHECK_SUPP," $CONFIG_FILE;
     ulimit -s unlimited;
     yes "C" | ctest -D ExperimentalMemCheck -LE expensive -VV -I $MEMCHECK_RANGE | ../script/demangle_cpptype.py;
  fi
- if [[ $REPO == BLESSED && $PUSH_TO_CDASH == TRUE ]]; then
      GIT_COMMIT=`git log --oneline -n 1 | cut -d ' ' -f 1`;
      GIT_SUBJECT=`git log --oneline -n 1 | cut -d ' ' -f 2-`;
      GIT_SUBJECT=${GIT_SUBJECT//\"/\\\"};
      GIT_SUBJECT=${GIT_SUBJECT//,/\,};
      GIT_SUBJECT=$(echo -e $(printf '%q' "$GIT_SUBJECT"));
      find Testing -name "*.xml" -exec sed -i "s,Generator=\".*\",Generator=\"${GIT_COMMIT}###${GIT_SUBJECT}\"," {} ";";
      find Testing \( -name "LastTest_*.log" -o -name "LastDynamicAnalysis_*.log" \) -exec sh -c 'TMP=`mktemp /tmp/ctesttmp_XXXX`; ../script/demangle_cpptype.py {} > $TMP; mv -v $TMP {}' ";";
      ctest -D ExperimentalSubmit;
  fi
- if [[ $REPO == BLESSED && $PACKAGE == TRUE ]]; then
     make package;
  fi
- cd ..
- if [[ $REPO == BLESSED && $BUILD_DOXYGEN == TRUE ]]; then
      sudo apt-get -qq install graphviz doxygen parallel;
      script/doxygen.sh > /dev/null;
      DOXYGEN_DIR=doc/html;
      find $DOXYGEN_DIR -type f -name "*.md5" -exec rm {} ";";
      find $DOXYGEN_DIR -type f | split -l 100 - doxygen_files.txt.;
      ls -1 doxygen_files.txt.* | travis_wait parallel -u -j 10 ./script/dropbox_upload.py --destpath /Public --dropbox-token ${DROPBOX_KEY} --copylist {};
  fi
- if [[ $REPO == BLESSED && $UPLOAD ]]; then
      UPLOAD_DIR=bin;
      BINARY=lean_${UPLOAD};
      NOW=`TZ='America/Los_Angeles' date +"%Y%m%d_%H%M"`;
      GIT_COMMIT=`git log --oneline -n 1 | cut -d ' ' -f 1`;
      OS=linux;
      LUA_VERSION=LUA_${LUA};
      ARCHIVE_BINARY=${NOW}_${TRAVIS_BRANCH}_${GIT_COMMIT}_${OS}_${CMAKE_CXX_COMPILER}_${BUILD_TYPE}_${LUA_VERSION};
      if [[ $TCMALLOC == ON ]]; then
          ARCHIVE_BINARY=${ARCHIVE_BINARY}_tcmalloc;
      fi;
      mkdir ${UPLOAD_DIR};
      if [[ $REPO == BLESSED && $PACKAGE == TRUE ]]; then
          cp -v build/lean*.tar.gz ${UPLOAD_DIR}/;
      fi;
      cp -v build/shell/lean ${UPLOAD_DIR}/${BINARY};
      tar cvfz ${UPLOAD_DIR}/${ARCHIVE_BINARY}.tar.gz ${UPLOAD_DIR}/${BINARY};
      script/dropbox_upload.py --srcpath ${UPLOAD_DIR} --destpath /Public/${UPLOAD_DIR} --dropbox-token ${DROPBOX_KEY};
  fi

notifications:
  email:
    recipients:
     - lean-build@googlegroups.com
    on_success: always
    on_failure: always
