aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/markdown/Contributing.md10
-rwxr-xr-xrun_project_tests.py15
-rw-r--r--test cases/cmake/2 advanced/test.json5
-rw-r--r--test cases/cmake/3 advanced no dep/test.json5
4 files changed, 31 insertions, 4 deletions
diff --git a/docs/markdown/Contributing.md b/docs/markdown/Contributing.md
index 554c3f5..8a24e0b 100644
--- a/docs/markdown/Contributing.md
+++ b/docs/markdown/Contributing.md
@@ -209,6 +209,9 @@ Exanple `test.json`:
{ "opt1": "qwert", "opt2": "false" },
{ "opt1": "bad" }
]
+ },
+ "tools": {
+ "cmake": ">=3.11"
}
}
```
@@ -324,6 +327,13 @@ Currently supported values are:
- `prefix`
- `libdir`
+#### tools
+
+This section specifies a list of tool requirements in a simple key-value format.
+If a tool is specified, it has to be present in the environment, and the version
+requirement must be fulfilled match. Otherwise, the entire test is skipped
+(including every element in the test matrix).
+
### Skipping integration tests
Meson uses several continuous integration testing systems that have slightly
diff --git a/run_project_tests.py b/run_project_tests.py
index 875a522..cc8e333 100755
--- a/run_project_tests.py
+++ b/run_project_tests.py
@@ -190,7 +190,7 @@ class TestDef:
self.skip = skip
self.env = os.environ.copy()
self.installed_files = [] # type: T.List[InstalledFile]
- self.do_not_set_opts = [] # type: T.List[str]
+ self.do_not_set_opts = [] # type: T.List[str]
def __repr__(self) -> str:
return '<{}: {:<48} [{}: {}] -- {}>'.format(type(self).__name__, str(self.path), self.name, self.args, self.skip)
@@ -233,6 +233,7 @@ no_meson_log_msg = 'No meson-log.txt found.'
system_compiler = None
compiler_id_map = {} # type: T.Dict[str, str]
+tool_vers_map = {} # type: T.Dict[str, str]
class StopException(Exception):
def __init__(self):
@@ -568,6 +569,15 @@ def gather_tests(testdir: Path) -> T.List[TestDef]:
# Handle the do_not_set_opts list
do_not_set_opts = test_def.get('do_not_set_opts', []) # type: T.List[str]
+ # Skip tests if the tool requirements are not met
+ if 'tools' in test_def:
+ assert isinstance(test_def['tools'], dict)
+ for tool, vers_req in test_def['tools'].items():
+ if tool not in tool_vers_map:
+ t.skip = True
+ elif not mesonlib.version_compare(tool_vers_map[tool], vers_req):
+ t.skip = True
+
# Skip the matrix code and just update the existing test
if 'matrix' not in test_def:
t.env.update(env)
@@ -639,7 +649,7 @@ def gather_tests(testdir: Path) -> T.List[TestDef]:
name = ' '.join([x[0] for x in i if x[0] is not None])
opts = ['-D' + x[0] for x in i if x[0] is not None]
skip = any([x[1] for x in i])
- test = TestDef(t.path, name, opts, skip)
+ test = TestDef(t.path, name, opts, skip or t.skip)
test.env.update(env)
test.installed_files = installed
test.do_not_set_opts = do_not_set_opts
@@ -1123,6 +1133,7 @@ def print_tool_versions():
i = i.strip('\n\r\t ')
m = t['regex'].match(i)
if m is not None:
+ tool_vers_map[t['tool']] = m.group(t['match_group'])
return '{} ({})'.format(exe, m.group(t['match_group']))
return '{} (unknown)'.format(exe)
diff --git a/test cases/cmake/2 advanced/test.json b/test cases/cmake/2 advanced/test.json
index 11aad94..e12f530 100644
--- a/test cases/cmake/2 advanced/test.json
+++ b/test cases/cmake/2 advanced/test.json
@@ -4,5 +4,8 @@
{"type": "implib", "platform": "cygwin", "file": "usr/lib/libcm_cmModLib"},
{"type": "implib", "platform": "!cygwin", "file": "usr/bin/libcm_cmModLib"},
{"type": "exe", "file": "usr/bin/cm_testEXE"}
- ]
+ ],
+ "tools": {
+ "cmake": ">=3.11"
+ }
}
diff --git a/test cases/cmake/3 advanced no dep/test.json b/test cases/cmake/3 advanced no dep/test.json
index 24c89c4..98a1719 100644
--- a/test cases/cmake/3 advanced no dep/test.json
+++ b/test cases/cmake/3 advanced no dep/test.json
@@ -8,5 +8,8 @@
{"type": "exe", "file": "usr/bin/cm_testEXE"},
{"type": "pdb", "file": "usr/bin/cm_testEXE2"},
{"type": "exe", "file": "usr/bin/cm_testEXE2"}
- ]
+ ],
+ "tools": {
+ "cmake": ">=3.11"
+ }
}