Browse Source

CI: added ccache test

gps-1.3.1
Andrew Tridgell 3 years ago
parent
commit
6b962ae48b
  1. 33
      .github/workflows/test_ccache.yml
  2. 58
      Tools/scripts/build_tests/test_ccache.py

33
.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

58
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")
Loading…
Cancel
Save