From 6b962ae48bdbee887317b4ebcd324b0d482c6ee9 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 22 Feb 2022 14:53:46 +1100 Subject: [PATCH] CI: added ccache test --- .github/workflows/test_ccache.yml | 33 ++++++++++++++ Tools/scripts/build_tests/test_ccache.py | 58 ++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 .github/workflows/test_ccache.yml create mode 100755 Tools/scripts/build_tests/test_ccache.py diff --git a/.github/workflows/test_ccache.yml b/.github/workflows/test_ccache.yml new file mode 100644 index 0000000000..dd5d970d5b --- /dev/null +++ b/.github/workflows/test_ccache.yml @@ -0,0 +1,33 @@ +name: test ccache + +on: [push, pull_request, workflow_dispatch] +# paths: +# - "*" +# - "!README.md" <-- don't rebuild on doc change +concurrency: + group: ci-${{github.workflow}}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-20.04 + container: ardupilot/ardupilot-dev-${{ matrix.toolchain }}:latest + strategy: + fail-fast: false # don't cancel if a job from the matrix fails + matrix: + toolchain: [ + chibios, + ] + gcc: [10] + steps: + # git checkout the PR + - uses: actions/checkout@v2 + with: + submodules: 'recursive' + - name: ccache test + shell: bash + run: | + PATH="/usr/lib/ccache:/opt/gcc-arm-none-eabi-${{matrix.gcc}}/bin:$PATH" + Tools/scripts/build_tests/test_ccache.py --boards MatekF405,MatekF405-bdshot --min-cache-pct=75 + Tools/scripts/build_tests/test_ccache.py --boards CubeOrange,Durandal --min-cache-pct=75 + diff --git a/Tools/scripts/build_tests/test_ccache.py b/Tools/scripts/build_tests/test_ccache.py new file mode 100755 index 0000000000..428e8b1f43 --- /dev/null +++ b/Tools/scripts/build_tests/test_ccache.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +# test ccache efficiency building two similar boards +# AP_FLAKE8_CLEAN + +import subprocess +import re +import argparse +import sys +import os + +parser = argparse.ArgumentParser(description='test ccache performance') +parser.add_argument('--boards', default='MatekF405,MatekF405-bdshot', help='boards to test') +parser.add_argument('--min-cache-pct', type=int, default=75, help='minimum acceptable ccache hit rate') + +args = parser.parse_args() + + +def ccache_stats(): + '''return hits/misses from ccache -s''' + hits = 0 + miss = 0 + stats = str(subprocess.Popen(["ccache", "-s"], stdout=subprocess.PIPE).communicate()[0], encoding='ascii') + for line in stats.split('\n'): + m = re.match(r"cache.hit\D*(\d+)$", line) + if m is not None: + hits += int(m.group(1)) + m = re.match(r"cache.miss\D*(\d+)", line) + if m is not None: + miss += int(m.group(1)) + return (hits, miss) + + +def build_board(boardname): + subprocess.run(["./waf", "configure", "--board", boardname]) + subprocess.run(["./waf", "clean", "copter"]) + + +boards = args.boards.split(",") +if len(boards) != 2: + print(boards) + print("Must specify exactly 2 boards (comma separated)") + sys.exit(1) + +os.environ['CCACHE_DIR'] = os.path.join(os.getcwd(), 'build', 'ccache') +subprocess.run(["ccache", "-C", "-z"]) +build_board(boards[0]) +subprocess.run(["ccache", "-z"]) +build_board(boards[1]) +subprocess.run(["ccache", "-s"]) + +post = ccache_stats() +hit_pct = 100 * post[0] / float(post[0]+post[1]) +print("ccache hit percentage: %.1f%% %s" % (hit_pct, post)) +if hit_pct < args.min_cache_pct: + print("ccache hits too low, need %d%%" % args.min_cache_pct) + sys.exit(1) +else: + print("ccache hits good")