The Meson Build System
http://mesonbuild.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
3.1 KiB
90 lines
3.1 KiB
4 years ago
|
#!/usr/bin/env python3
|
||
|
# SPDX-license-identifier: Apache-2.0
|
||
|
# Copyright © 2021 Intel Corporation
|
||
|
|
||
|
"""Script for running a single project test.
|
||
|
|
||
|
This script is meant for Meson developers who want to run a single project
|
||
|
test, with all of the rules from the test.json file loaded.
|
||
|
"""
|
||
|
|
||
|
import argparse
|
||
|
import pathlib
|
||
|
import shutil
|
||
|
import typing as T
|
||
|
|
||
|
from mesonbuild import environment
|
||
|
from mesonbuild import mlog
|
||
|
from mesonbuild import mesonlib
|
||
|
from run_project_tests import TestDef, load_test_json, run_test, BuildStep
|
||
|
from run_tests import get_backend_commands, guess_backend, get_fake_options
|
||
|
|
||
|
if T.TYPE_CHECKING:
|
||
|
try:
|
||
|
from typing import Protocol
|
||
|
except ImportError:
|
||
|
# Mypy gets grump about this even though it's fine
|
||
|
from typing_extensions import Protocol # type: ignore
|
||
|
|
||
|
class ArgumentType(Protocol):
|
||
|
|
||
|
"""Typing information for command line arguments."""
|
||
|
|
||
|
case: pathlib.Path
|
||
|
subtests: T.List[int]
|
||
|
backend: str
|
||
|
|
||
|
|
||
|
def main() -> None:
|
||
|
parser = argparse.ArgumentParser()
|
||
|
parser.add_argument('case', type=pathlib.Path, help='The test case to run')
|
||
|
parser.add_argument('--subtest', type=int, action='append', dest='subtests', help='which subtests to run')
|
||
|
parser.add_argument('--backend', action='store', help="Which backend to use")
|
||
|
args = T.cast('ArgumentType', parser.parse_args())
|
||
|
|
||
|
test = TestDef(args.case, args.case.stem, [])
|
||
|
tests = load_test_json(test, False)
|
||
|
if args.subtests:
|
||
|
tests = [t for i, t in enumerate(tests) if i in args.subtests]
|
||
|
|
||
|
with mesonlib.TemporaryDirectoryWinProof() as build_dir:
|
||
|
fake_opts = get_fake_options('/')
|
||
|
env = environment.Environment(None, build_dir, fake_opts)
|
||
|
try:
|
||
|
comp = env.compiler_from_language('c', mesonlib.MachineChoice.HOST).get_id()
|
||
|
except mesonlib.MesonException:
|
||
|
raise RuntimeError('Could not detect C compiler')
|
||
|
|
||
|
backend, backend_args = guess_backend(args.backend, shutil.which('msbuild'))
|
||
|
_cmds = get_backend_commands(backend, False)
|
||
|
commands = (_cmds[0], _cmds[1], _cmds[3], _cmds[4])
|
||
|
|
||
|
results = [run_test(t, t.args, comp, backend, backend_args, commands, False, True) for t in tests]
|
||
|
failed = False
|
||
|
for test, result in zip(tests, results):
|
||
|
if result is None:
|
||
|
msg = mlog.yellow('SKIP:')
|
||
|
elif result.msg:
|
||
|
msg = mlog.red('FAIL:')
|
||
|
failed = True
|
||
|
else:
|
||
|
msg = mlog.green('PASS:')
|
||
|
mlog.log(msg, test.display_name())
|
||
|
if result.msg:
|
||
|
mlog.log('reason:', result.msg)
|
||
|
if result.step is BuildStep.configure:
|
||
|
# For configure failures, instead of printing stdout,
|
||
|
# print the meson log if available since it's a superset
|
||
|
# of stdout and often has very useful information.
|
||
|
mlog.log(result.mlog)
|
||
|
else:
|
||
|
mlog.log(result.stdo)
|
||
|
for cmd_res in result.cicmds:
|
||
|
mlog.log(cmd_res)
|
||
|
mlog.log(result.stde)
|
||
|
|
||
|
exit(1 if failed else 0)
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|