diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..5039d8ec --- /dev/null +++ b/.travis.yml @@ -0,0 +1,76 @@ +language: cpp +dist: xenial +osx_image: xcode10.1 + +env: + global: + - SCONS_CACHE="$HOME/.scons_cache" + - SCONS_CACHE_LIMIT=1024 + +cache: + directories: + - $SCONS_CACHE + +matrix: + include: + - name: Linux Debug + Static Checks + os: linux + compiler: gcc + env: TARGET=debug STATIC_CHECKS=yes + addons: + apt: + sources: + - llvm-toolchain-xenial-6.0 + packages: + [scons, pkg-config, build-essential, p7zip-full, clang-format-6.0] + + - name: Linux Release + os: linux + compiler: gcc + addons: + apt: + packages: + [scons, pkg-config, build-essential, p7zip-full] + env: TARGET=release + + - name: macOS Debug + os: osx + compiler: clang + env: TARGET=debug + + - name: macOS Release + os: osx + compiler: clang + env: TARGET=release + + - name: Windows MSVC Debug + os: windows + env: TARGET=debug + + - name: Windows MSVC Release + os: windows + env: TARGET=release + +install: + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + brew update; + brew install scons p7zip; + fi + + - if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then + curl -LO https://downloads.sourceforge.net/project/scons/scons-local/3.0.5/scons-local-3.0.5.zip; + unzip scons-local-3.0.5.zip; + fi + +script: + - if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then + export SCONS="./scons.bat"; + else + export SCONS="scons"; + fi + + - $SCONS target="$TARGET" bits=64 generate_bindings=yes $SCONS_FLAGS; + + - if [[ "$STATIC_CHECKS" == "yes" ]]; then + sh ./misc/travis/clang-format.sh; + fi diff --git a/misc/travis/clang-format.sh b/misc/travis/clang-format.sh new file mode 100755 index 00000000..ee4d0b2a --- /dev/null +++ b/misc/travis/clang-format.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +CLANG_FORMAT=clang-format-6.0 + +if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then + # Check the whole commit range against $TRAVIS_BRANCH, the base merge branch + # We could use $TRAVIS_COMMIT_RANGE but it doesn't play well with force pushes + RANGE="$(git rev-parse $TRAVIS_BRANCH) HEAD" +else + # Test only the last commit + RANGE=HEAD +fi + +FILES=$(git diff-tree --no-commit-id --name-only -r $RANGE | grep -v thirdparty/ | grep -E "\.(c|h|cpp|hpp|cc|hh|cxx|m|mm|inc|java|glsl)$") +echo "Checking files:\n$FILES" + +# create a random filename to store our generated patch +prefix="static-check-clang-format" +suffix="$(date +%s)" +patch="/tmp/$prefix-$suffix.patch" + +for file in $FILES; do + "$CLANG_FORMAT" -style=file "$file" | \ + diff -u "$file" - | \ + sed -e "1s|--- |--- a/|" -e "2s|+++ -|+++ b/$file|" >> "$patch" +done + +# if no patch has been generated all is ok, clean up the file stub and exit +if [ ! -s "$patch" ] ; then + printf "Files in this commit comply with the clang-format rules.\n" + rm -f "$patch" + exit 0 +fi + +# a patch has been created, notify the user and exit +printf "\n*** The following differences were found between the code to commit " +printf "and the clang-format rules:\n\n" +cat "$patch" +printf "\n*** Aborting, please fix your commit(s) with 'git commit --amend' or 'git rebase -i '\n" +exit 1