| #!/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() |