wasi-libc/test/scripts/add-flags.py
Andrew Brown 2b853ff079
test: improve test infrastructure (#554)
This change represents a rather large re-design in how `wasi-libc`
builds and runs its tests. Initially, #346 retrieved the `libc-test`
repository and built a subset of those tests to give us some amount of
test coverage. Later, because there was no way to add custom C tests,
#522 added a `smoke` directory which allowed this. But (a) each of these
test suites was built and run separately and (b) it was unclear how to
add more tests flexibly--some tests should only run on `*p2` targets or
`*-threads` targets, e.g.

This change reworks all of this so that all tests are built the same
way, in the same place. For downloaded tests like those from
`libc-test`, I chose to add "stub tests" that `#include` the original
version. This not only keeps all enabled tests in one place, it also
allows us to add "directives," C comments that the `Makefile` uses to
filter out tests for certain targets or add special compile, link or run
flags. These rudimentary scripts, along with other Bash logic I moved
out of the Makefile now live in the `scripts` directory.

Finally, all of this is explained more clearly in an updated
`README.md`. The hope with documenting this a bit better is that it
would be easier for drive-by contributors to be able to either dump in
new C tests for regressions they may find or enable more libc-tests. As
of my current count, we only enable 40/75 of libc-test's functional
tests, 0/228 math tests, 0/69 regression tests, and 0/79 API tests.
Though many of these may not apply to WASI programs, it would be nice to
explore how many more of these tests can be enabled to increase
wasi-libc's test coverage. This change should explain how to do that
and, with directives, make it possible to condition how the tests
compile and run.
2024-12-09 13:45:31 -08:00

51 lines
1.3 KiB
Python
Executable File

#!/usr/bin/env python
# Find additional compilation flags specified in test files.
#
# This script accepts a single file as an argument and looks for a comment like
# the following: `// add-flags.py(<NAME>): <FLAGS>`. If found, the `<FLAGS>` are
# printed to stdout.
#
# Example:
# ```
# $ head one.c
# //! add-flags.py(CFLAGS): -DFOO
# $ ./add-flags.py CFLAGS one.c
# -DFOO
import sys
import os
import re
import logging
"""
Match a C comment like the following: `//! add-flags.py: <FLAGS>`.
"""
PATTERN = re.compile('\\s*//\\!\\s*add-flags\\.py\\(([^)]+)\\):\\s*(.*)')
def find_flags(name, file):
with open(file, 'r') as f:
for lineno, line in enumerate(f, start=1):
match = PATTERN.match(line)
if match and match[1] == name:
pos = f'[{file}:{lineno}]'
logging.debug(f'{pos} found flags')
return match[2].strip()
def main(name, file):
flags = find_flags(name, file)
if flags:
print(flags)
if __name__ == "__main__":
logging.getLogger().name = os.path.basename(__file__)
if os.environ.get('VERBOSE'):
logging.basicConfig(level=logging.DEBUG)
if len(sys.argv) != 3:
print(f'usage: {sys.argv[0]} <name> <file>')
sys.exit(1)
main(sys.argv[1], sys.argv[2])