From 2189c08e4e855aa85daa7793cdcf5a45bc32a593 Mon Sep 17 00:00:00 2001 From: Carles Cufi Date: Tue, 11 May 2021 19:04:02 +0200 Subject: [PATCH] ci: Add an errno.h check to CI Add a very simple check that verifies that new error numbers are added according to the errno.h file in newlib, in order to maintain compatibility with it. Signed-off-by: Carles Cufi --- .github/workflows/errno.yml | 20 +++++++++++++ scripts/ci/errno.py | 56 +++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 .github/workflows/errno.yml create mode 100755 scripts/ci/errno.py diff --git a/.github/workflows/errno.yml b/.github/workflows/errno.yml new file mode 100644 index 00000000000..3e6beff4768 --- /dev/null +++ b/.github/workflows/errno.yml @@ -0,0 +1,20 @@ +name: Error numbers +on: + pull_request: + paths: + - 'lib/libc/minimal/include/errno.h' + +jobs: + check-errno: + runs-on: ubuntu-latest + container: + image: zephyrprojectrtos/ci:v0.17.1 + + steps: + - name: checkout + uses: actions/checkout@v2 + + - name: Run errno.py + run: | + export ZEPHYR_BASE=${PWD} + ./scripts/ci/errno.py diff --git a/scripts/ci/errno.py b/scripts/ci/errno.py new file mode 100755 index 00000000000..a7d0063072b --- /dev/null +++ b/scripts/ci/errno.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +# +# Copyright (c) 2021 Nordic Semiconductor NA +# +# SPDX-License-Identifier: Apache-2.0 + +"""Check minimal libc error numbers against newlib. + +This script loads the errno.h included in Zephyr's minimal libc and checks its +contents against the SDK's newlib errno.h. This is done to ensure that both C +libraries are aligned at all times. +""" + + +import os +from pathlib import Path +import re +import sys + +def parse_errno(path): + with open(path, 'r') as f: + r = re.compile(r'^\s*#define\s+([A-Z]+)\s+([0-9]+)') + errnos = [] + for line in f: + m = r.match(line) + if m: + errnos.append(m.groups()) + + return errnos + +def main(): + + minimal = Path("lib/libc/minimal/include/errno.h") + newlib = Path("arm-zephyr-eabi/arm-zephyr-eabi/include/sys/errno.h") + + try: + minimal = os.environ['ZEPHYR_BASE'] / minimal + newlib = os.environ['ZEPHYR_SDK_INSTALL_DIR'] / newlib + except KeyError as e: + print(f'Environment variable missing: {e}', file=sys.stderr) + sys.exit(1) + + minimal = parse_errno(minimal) + newlib = parse_errno(newlib) + + for e in minimal: + if e[0] not in [x[0] for x in newlib] or e[1] != next( + filter(lambda _e: _e[0] == e[0], newlib))[1]: + print('Invalid entry in errno.h:', file=sys.stderr) + print(f'{e[0]} (with value {e[1]})', file=sys.stderr) + sys.exit(1) + + print('errno.h validated correctly') + +if __name__ == "__main__": + main()