diff options
author | Daniel Mensinger <daniel@mensinger-ka.de> | 2021-06-02 19:30:55 +0200 |
---|---|---|
committer | Daniel Mensinger <daniel@mensinger-ka.de> | 2021-06-25 19:34:48 +0200 |
commit | 3f889606c7debafacd3da9c9e74caa61b45a13ff (patch) | |
tree | 2bc4821baebd6e50bfd2999d034328d60c596ff2 /mesonbuild/mesonlib/universal.py | |
parent | 0f237b8d1d84e4906c758bbef44d81e93207f8e4 (diff) | |
download | meson-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.py | 44 |
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(): |