mirror of
https://git.proxmox.com/git/wasi-libc
synced 2025-06-14 06:39:57 +00:00

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.
51 lines
1.3 KiB
Python
Executable File
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])
|