| name: Linux |
| |
| on: [push, pull_request] |
| |
| jobs: |
| build-linux: |
| defaults: |
| run: |
| shell: bash |
| name: GCC-C++${{matrix.std}}-${{matrix.build_type}}-${{matrix.lib}}-${{matrix.extra}} |
| runs-on: ubuntu-latest |
| strategy: |
| fail-fast: true |
| matrix: |
| build_type: [Release, Debug] |
| extra: [no-custom-prefix, custom-prefix] |
| lib: [shared, static] |
| std: [98, 11, 14, 17, 20] |
| |
| steps: |
| - uses: actions/checkout@v2 |
| |
| - name: Setup Dependencies |
| run: | |
| sudo apt-get update |
| DEBIAN_FRONTEND=noninteractive sudo apt-get install -y \ |
| build-essential \ |
| cmake \ |
| lcov \ |
| libgflags-dev \ |
| libunwind-dev \ |
| ninja-build |
| |
| - name: Cache GTest |
| id: cache-gtest |
| uses: actions/cache@v2 |
| with: |
| path: gtest/ |
| key: ${{runner.os}}-gtest-1.11 |
| |
| - name: Download GTest |
| if: steps.cache-gtest.outputs.cache-hit != 'true' |
| run: | |
| wget https://github.com/google/googletest/archive/refs/tags/release-1.11.0.tar.gz |
| tar xvf release-1.11.0.tar.gz |
| |
| - name: Build GTest |
| if: steps.cache-gtest.outputs.cache-hit != 'true' |
| run: | |
| cmake -S googletest-release-1.11.0 -B build-googletest \ |
| -DBUILD_SHARED_LIBS=${{matrix.shared}} \ |
| -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \ |
| -DCMAKE_INSTALL_PREFIX=${{github.workspace}}/gtest \ |
| -G Ninja |
| cmake --build build-googletest --target install |
| |
| - name: Setup Environment |
| if: matrix.build_type == 'Debug' |
| run: | |
| echo 'CXXFLAGS=--coverage' >> $GITHUB_ENV |
| echo 'GTest_ROOT=${{github.workspace}}/gtest' >> $GITHUB_ENV |
| |
| - name: Setup C++98 Environment |
| if: matrix.std == '98' |
| run: | |
| echo 'CXXFLAGS=-Wno-error=variadic-macros -Wno-error=long-long ${{env.CXXFLAGS}}' >> $GITHUB_ENV |
| |
| - name: Configure |
| env: |
| CXXFLAGS: -Wall -Wextra -Wsign-conversion -Wtautological-compare -Wformat-nonliteral -Wundef -Werror ${{env.CXXFLAGS}} |
| run: | |
| cmake -S . -B build_${{matrix.build_type}} \ |
| -DBUILD_SHARED_LIBS=${{matrix.lib == 'shared'}} \ |
| -DCMAKE_CXX_STANDARD=${{matrix.std}} \ |
| -DCMAKE_CXX_STANDARD_REQUIRED=ON \ |
| -DCMAKE_INSTALL_PREFIX=${{github.workspace}}/install \ |
| -DWITH_CUSTOM_PREFIX=${{matrix.extra == 'custom-prefix'}} \ |
| -G Ninja \ |
| -Werror |
| |
| - name: Build |
| run: | |
| cmake --build build_${{matrix.build_type}} \ |
| --config ${{matrix.build_type}} |
| |
| - name: Install |
| run: | |
| cmake --build build_${{matrix.build_type}} \ |
| --config ${{matrix.build_type}} \ |
| --target install |
| |
| cmake build_${{matrix.build_type}} \ |
| -DCMAKE_INSTALL_INCLUDEDIR=${{runner.workspace}}/foo/include \ |
| -DCMAKE_INSTALL_LIBDIR=${{runner.workspace}}/foo/lib \ |
| -DCMAKE_INSTALL_DATAROOTDIR=${{runner.workspace}}/foo/share |
| cmake --build build_${{matrix.build_type}} \ |
| --config ${{matrix.build_type}} \ |
| --target install |
| |
| - name: Test CMake Package (relative GNUInstallDirs) |
| run: | |
| cmake -S src/package_config_unittest/working_config \ |
| -B build_${{matrix.build_type}}_package \ |
| -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \ |
| -DCMAKE_PREFIX_PATH=${{github.workspace}}/install \ |
| -G Ninja |
| cmake --build build_${{matrix.build_type}}_package \ |
| --config ${{matrix.build_type}} |
| |
| - name: Test CMake Package (absolute GNUInstallDirs) |
| run: | |
| cmake -S src/package_config_unittest/working_config \ |
| -B build_${{matrix.build_type}}_package_foo \ |
| -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \ |
| -DCMAKE_PREFIX_PATH=${{runner.workspace}}/foo \ |
| -G Ninja |
| cmake --build build_${{matrix.build_type}}_package_foo \ |
| --config ${{matrix.build_type}} |
| |
| - name: Test |
| run: | |
| ctest --test-dir build_${{matrix.build_type}} -j$(nproc) --output-on-failure |
| |
| - name: Generate Coverage |
| if: matrix.build_type == 'Debug' |
| run: | |
| lcov --directory . --capture --output-file coverage.info |
| lcov --remove coverage.info \ |
| '${{github.workspace}}/gtest/*' \ |
| '*/src/*_unittest.cc' \ |
| '*/src/googletest.h' \ |
| '*/src/mock-log.h' \ |
| '/usr/*' \ |
| --output-file coverage.info |
| |
| for file in src/glog/*.h.in; do |
| name=$(basename ${file}) |
| name_we=${name%.h.in} |
| sed -i "s|build_${{matrix.build_type}}/glog/${name_we}.h\$|${file}|g" coverage.info |
| done |
| |
| lcov --list coverage.info |
| |
| - name: Upload Coverage to Codecov |
| if: matrix.build_type == 'Debug' |
| uses: codecov/codecov-action@v2 |
| with: |
| token: ${{ secrets.CODECOV_TOKEN }} |
| fail_ci_if_error: true |
| verbose: true |