aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/mesonlib/universal.py
diff options
context:
space:
mode:
authorDaniel Mensinger <daniel@mensinger-ka.de>2021-06-02 19:30:55 +0200
committerDaniel Mensinger <daniel@mensinger-ka.de>2021-06-25 19:34:48 +0200
commit3f889606c7debafacd3da9c9e74caa61b45a13ff (patch)
tree2bc4821baebd6e50bfd2999d034328d60c596ff2 /mesonbuild/mesonlib/universal.py
parent0f237b8d1d84e4906c758bbef44d81e93207f8e4 (diff)
downloadmeson-3f889606c7debafacd3da9c9e74caa61b45a13ff.zip
meson-3f889606c7debafacd3da9c9e74caa61b45a13ff.tar.gz
meson-3f889606c7debafacd3da9c9e74caa61b45a13ff.tar.bz2
Split compiler detection from Environment
This moves all the compiler detection logic into the new compilers.detect module. This dramatically reduces the size and complexity of Environment.
Diffstat (limited to 'mesonbuild/mesonlib/universal.py')
-rw-r--r--mesonbuild/mesonlib/universal.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/mesonbuild/mesonlib/universal.py b/mesonbuild/mesonlib/universal.py
index 160cc37..4b4eb6e 100644
--- a/mesonbuild/mesonlib/universal.py
+++ b/mesonbuild/mesonlib/universal.py
@@ -135,6 +135,7 @@ __all__ = [
'version_compare',
'version_compare_condition_with_min',
'version_compare_many',
+ 'search_version',
'windows_proof_rm',
'windows_proof_rmtree',
]
@@ -883,6 +884,49 @@ def version_compare_condition_with_min(condition: str, minimum: str) -> bool:
return T.cast(bool, cmpop(Version(minimum), Version(condition)))
+def search_version(text: str) -> str:
+ # Usually of the type 4.1.4 but compiler output may contain
+ # stuff like this:
+ # (Sourcery CodeBench Lite 2014.05-29) 4.8.3 20140320 (prerelease)
+ # Limiting major version number to two digits seems to work
+ # thus far. When we get to GCC 100, this will break, but
+ # if we are still relevant when that happens, it can be
+ # considered an achievement in itself.
+ #
+ # This regex is reaching magic levels. If it ever needs
+ # to be updated, do not complexify but convert to something
+ # saner instead.
+ # We'll demystify it a bit with a verbose definition.
+ version_regex = re.compile(r"""
+ (?<! # Zero-width negative lookbehind assertion
+ (
+ \d # One digit
+ | \. # Or one period
+ ) # One occurrence
+ )
+ # Following pattern must not follow a digit or period
+ (
+ \d{1,2} # One or two digits
+ (
+ \.\d+ # Period and one or more digits
+ )+ # One or more occurrences
+ (
+ -[a-zA-Z0-9]+ # Hyphen and one or more alphanumeric
+ )? # Zero or one occurrence
+ ) # One occurrence
+ """, re.VERBOSE)
+ match = version_regex.search(text)
+ if match:
+ return match.group(0)
+
+ # try a simpler regex that has like "blah 2020.01.100 foo" or "blah 2020.01 foo"
+ version_regex = re.compile(r"(\d{1,4}\.\d{1,4}\.?\d{0,4})")
+ match = version_regex.search(text)
+ if match:
+ return match.group(0)
+
+ return 'unknown version'
+
def default_libdir() -> str:
if is_debianlike():