diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..af2ac48 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,130 @@ +name: ci-build + +on: + pull_request: + branches: + - '*' + push: + branches: [ main, MMU_* ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + + # setup base required dependencies + - name: Setup dependencies + run: | + sudo apt-get install cmake ninja-build python3-pyelftools python3-regex python3-polib + + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - name: Checkout ${{ github.event.pull_request.head.ref }} + uses: actions/checkout@v3 + if: ${{ github.event.pull_request }} + with: + ref: ${{ github.event.pull_request.head.sha }} + submodules: true + + - name: Checkout ${{ github.event.ref }} + uses: actions/checkout@v3 + if: ${{ !github.event.pull_request }} + with: + ref: ${{ github.event.ref }} + submodules: true + + - name: Cache Dependencies + uses: actions/cache@v3.0.11 + id: cache-pkgs + with: + path: ".dependencies" + key: "build-deps-1_0_0-linux" + + - name: Setup build dependencies + run: | + ./utils/bootstrap.py + + - name: Cache permissions + run: sudo chmod -R 744 .dependencies + + - name: Build + run: | + mkdir build + cd build + cmake .. -DCMAKE_TOOLCHAIN_FILE="../cmake/AvrGcc.cmake" -DCMAKE_BUILD_TYPE=Release -G Ninja + ninja + + - name: Upload artifacts + if: ${{ !github.event.pull_request }} + uses: actions/upload-artifact@v3.1.1 + with: + name: Firmware + path: build/*.hex + + tests: + runs-on: ubuntu-latest + + permissions: + pull-requests: write + + steps: + + # setup base required dependencies + - name: Setup dependencies + run: | + sudo apt-get install gcc-11 g++11 lcov cmake ninja-build python3-pyelftools python3-regex python3-polib + + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - name: Checkout ${{ github.event.pull_request.head.ref }} + uses: actions/checkout@v3 + if: ${{ github.event.pull_request }} + with: + ref: ${{ github.event.pull_request.head.sha }} + submodules: true + + - name: Checkout ${{ github.event.ref }} + uses: actions/checkout@v3 + if: ${{ !github.event.pull_request }} + with: + ref: ${{ github.event.ref }} + submodules: true + + - name: Cache Dependencies + uses: actions/cache@v3.0.11 + id: cache-pkgs + with: + path: ".dependencies" + key: "build-deps-1_0_0-linux" + + - name: Setup build dependencies + run: | + ./utils/bootstrap.py + + - name: Cache permissions + run: sudo chmod -R 744 .dependencies + + - name: Build + id: tests_run + continue-on-error: true + run: | + mkdir build + cd build + cmake .. -G Ninja + ninja test_coverage_report + + + - name: Upload artifacts + uses: actions/upload-artifact@v3.1.1 + with: + name: Coverage + path: build/Coverage + + - name: Add PR Comment + if: ${{ github.event.pull_request }} + uses: mshick/add-pr-comment@v2 + with: + message-path: build/Summary.txt + message-id: "coverage" + + - name: Report failure + if: steps.tests_run.outcome == 'failure' + run: echo ${{ steps.tests_run.outcome }} && test -n "" diff --git a/.github/workflows/pr-size.yml b/.github/workflows/pr-size.yml index ac7075b..e90d76e 100644 --- a/.github/workflows/pr-size.yml +++ b/.github/workflows/pr-size.yml @@ -24,10 +24,20 @@ jobs: - name: Checkout base uses: actions/checkout@v3 + - name: Cache Dependencies + uses: actions/cache@v3.0.11 + id: cache-pkgs + with: + path: ".dependencies" + key: "build-deps-1_0_0-linux" + - name: Setup build dependencies run: | ./utils/bootstrap.py + - name: Cache permissions + run: sudo chmod -R 744 .dependencies + - name: Build base run: | rm -rf build-base diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e66dc79..d7b291e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -15,7 +15,7 @@ if(GCOV_ENABLE) COMMAND ${CMAKE_COMMAND} -E remove ${PROJECT_BINARY_DIR}/.ctest-finished ) - set(ctest_test_args --timeout 30 --output-on-failure) + set(ctest_test_args --timeout 180 --output-on-failure) include(ProcessorCount) ProcessorCount(N) @@ -55,7 +55,8 @@ if(GCOV_ENABLE) COMMAND tar -zcvf Coverage.tar.gz Coverage # Cheat and compare a file to itself to check for existence. File-Not-Found is a failure # code. - COMMAND ../../utils/gcovr.py -r . -e '../../tests' -e '../../lib/Catch2' | tee Summary.txt + COMMAND ${PROJECT_SOURCE_DIR}/utils/gcovr.py -r ${CMAKE_SOURCE_DIR} -e 'tests' -e 'lib/Catch2' | + tee Summary.txt COMMAND ${CMAKE_COMMAND} -E compare_files ${PROJECT_BINARY_DIR}/.ctest-finished ${PROJECT_BINARY_DIR}/.ctest-finished BYPRODUCTS ${PROJECT_BINARY_DIR}/Summary.txt ${PROJECT_BINARY_DIR}/Coverage.tar.gz diff --git a/utils/gcovr.py b/utils/gcovr.py index febd0fe..725b0f1 100755 --- a/utils/gcovr.py +++ b/utils/gcovr.py @@ -619,6 +619,10 @@ def process_gcov_data(data_fname, covdata, source_fname, options): is_code_statement = False if tmp[0] == '-' or (excluding and tmp[0] in "#=0123456789"): is_code_statement = True + if len(segments) < 3: + noncode.add(lineno) + continue + code = segments[2].strip() # remember certain non-executed lines if excluding or is_non_code(segments[2]): @@ -634,7 +638,7 @@ def process_gcov_data(data_fname, covdata, source_fname, options): uncovered_exceptional.add(lineno) elif tmp[0] in "0123456789": is_code_statement = True - covered[lineno] = int(segments[0].strip()) + covered[lineno] = int(segments[0].strip().rstrip('*')) elif tmp.startswith('branch'): exclude_branch = False if options.exclude_unreachable_branches and \