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 <carles.cufi@nordicsemi.no>
This commit is contained in:
Carles Cufi 2021-05-11 19:04:02 +02:00 committed by Anas Nashif
parent 14b358a252
commit 2189c08e4e
2 changed files with 76 additions and 0 deletions

20
.github/workflows/errno.yml vendored Normal file
View file

@ -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

56
scripts/ci/errno.py Executable file
View file

@ -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()