1#!/usr/bin/env bash
2
3set -x -e
4
5cd ../..
6
7# always install custom builds from dist
8# to make sure that `make dist` doesn't omit any files required to build & test
9if [ -z "$DO_CLANG_FORMAT_CHECK" -a -z "$CLANG_TIDY" ]; then
10    ./autogen.sh
11    ./configure
12    make -j5 dist-gzip
13    V=$(./version.sh)
14    tar -xzf zeromq-$V.tar.gz
15    cd zeromq-$V
16fi
17
18mkdir tmp || true
19BUILD_PREFIX=$PWD/tmp
20
21CONFIG_OPTS=()
22CONFIG_OPTS+=("CFLAGS=-I${BUILD_PREFIX}/include")
23CONFIG_OPTS+=("CPPFLAGS=-I${BUILD_PREFIX}/include")
24CONFIG_OPTS+=("CXXFLAGS=-I${BUILD_PREFIX}/include")
25CONFIG_OPTS+=("LDFLAGS=-L${BUILD_PREFIX}/lib")
26CONFIG_OPTS+=("PKG_CONFIG_PATH=${BUILD_PREFIX}/lib/pkgconfig")
27
28CMAKE_OPTS=()
29CMAKE_OPTS+=("-DCMAKE_INSTALL_PREFIX:PATH=${BUILD_PREFIX}")
30CMAKE_OPTS+=("-DCMAKE_PREFIX_PATH:PATH=${BUILD_PREFIX}")
31CMAKE_OPTS+=("-DCMAKE_LIBRARY_PATH:PATH=${BUILD_PREFIX}/lib")
32CMAKE_OPTS+=("-DCMAKE_INCLUDE_PATH:PATH=${BUILD_PREFIX}/include")
33CMAKE_OPTS+=("-DENABLE_CAPSH=ON")
34
35if [ "$CLANG_FORMAT" != "" ] ; then
36    CMAKE_OPTS+=("-DCLANG_FORMAT=${CLANG_FORMAT}")
37fi
38
39if [ -z $CURVE ]; then
40    CMAKE_OPTS+=("-DENABLE_CURVE=OFF")
41elif [ $CURVE == "libsodium" ]; then
42    CMAKE_OPTS+=("-DWITH_LIBSODIUM=ON")
43
44    if ! ((command -v dpkg-query >/dev/null 2>&1 && dpkg-query --list libsodium-dev >/dev/null 2>&1) || \
45            (command -v brew >/dev/null 2>&1 && brew ls --versions libsodium >/dev/null 2>&1)); then
46        git clone --depth 1 -b stable git://github.com/jedisct1/libsodium.git
47        ( cd libsodium; ./autogen.sh; ./configure --prefix=$BUILD_PREFIX; make install)
48    fi
49fi
50
51CMAKE_PREFIXES=()
52MAKE_PREFIXES=()
53PARALLEL_MAKE_OPT="-j5"
54if [ -n "$CLANG_TIDY" ] ; then
55    CMAKE_OPTS+=("-DCMAKE_BUILD_TYPE=Debug") # do a debug build to avoid unused variable warnings with assertions, and to speed up build
56    CMAKE_OPTS+=("-DCMAKE_CXX_CLANG_TIDY:STRING=${CLANG_TIDY}")
57    if [ -n ${SONARCLOUD_BUILD_WRAPPER_PATH} ] ; then
58        MAKE_PREFIXES+=("${SONARCLOUD_BUILD_WRAPPER_PATH}build-wrapper-linux-x86-64")
59        MAKE_PREFIXES+=("--out-dir")
60        MAKE_PREFIXES+=("${TRAVIS_BUILD_DIR}/bw-output")
61
62    fi
63    CMAKE_PREFIXES+=("scan-build-10")
64    MAKE_PREFIXES+=("scan-build-10")
65    MAKE_PREFIXES+=("-plist-html")
66    SCAN_BUILD_OUTPUT="$(pwd)/scan-build-report"
67    MAKE_PREFIXES+=("-o ${SCAN_BUILD_OUTPUT}")
68    # TODO this does not work with sonarcloud.io as it misses the sonar-cxx plugin
69    #MAKE_PREFIXES+=("-plist")
70    IFS="/" read -ra GITHUB_USER <<< "${TRAVIS_REPO_SLUG}"
71    PARALLEL_MAKE_OPT=""
72fi
73
74# Build, check, and install from local source
75mkdir build_cmake
76cd build_cmake
77if [ "$DO_CLANG_FORMAT_CHECK" = "1" ] ; then
78    if ! ( PKG_CONFIG_PATH=${BUILD_PREFIX}/lib/pkgconfig cmake "${CMAKE_OPTS[@]}" .. && make clang-format-check) ; then
79        make clang-format-diff
80        exit 1
81    fi
82else
83    if [ -n "$CLANG_TIDY" ] ; then
84        ${CLANG_TIDY} -explain-config
85    fi
86
87    export CTEST_OUTPUT_ON_FAILURE=1
88    PKG_CONFIG_PATH=${BUILD_PREFIX}/lib/pkgconfig ${CMAKE_PREFIXES[@]} cmake "${CMAKE_OPTS[@]}" ..
89    ${MAKE_PREFIXES[@]} make ${PARALLEL_MAKE_OPT} all VERBOSE=1 | tee clang-tidy-report
90
91    if [ -n "${SONAR_SCANNER_CLI_PATH}" ] ; then
92        find ${SCAN_BUILD_OUTPUT} || echo "WARNING: ${SCAN_BUILD_OUTPUT} does not exist"
93
94        ${SONAR_SCANNER_CLI_PATH}sonar-scanner \
95            -Dsonar.projectKey=${GITHUB_USER}-libzmq \
96            -Dsonar.organization=${GITHUB_USER}-github \
97            -Dsonar.projectBaseDir=.. \
98            -Dsonar.sources=${TRAVIS_BUILD_DIR}/include,${TRAVIS_BUILD_DIR}/src,${TRAVIS_BUILD_DIR}/tests,${TRAVIS_BUILD_DIR}/unittests \
99            -Dsonar.cfamily.build-wrapper-output=${TRAVIS_BUILD_DIR}/bw-output \
100            -Dsonar.host.url=https://sonarcloud.io \
101            -Dsonar.login=${SONARQUBE_TOKEN}
102
103            # TODO this does not work with sonarcloud.io as it misses the sonar-cxx plugin
104            # -Dsonar.cxx.clangtidy.reportPath=clang-tidy-report \
105            # -Dsonar.cxx.clangsa.reportPath=*.plist \
106
107    fi
108
109    make install
110    make ${PARALLEL_MAKE_OPT} test ARGS="-V"
111fi
112