replace Meson version check with a specification-compliant version comparator

The current check compares the integers split out from `meson --version`
one by one. This is an ad-hoc version comparison algorithm with a few
flaws, notably that it doesn't truly understand how version components
fit together, and that broke once Meson bumped the major version. There
are other potential issues that could show up but haven't yet, such as
versions with words in them (release candidates).

The packaging module is a high-quality library that provides a standard
version parsing algorithm, with which you can simply say "is this
version object greater than that one". Use it instead.

Fixes #1545
This commit is contained in:
Eli Schwartz 2023-01-03 18:53:11 -05:00
parent 19e0e2fe8d
commit c4ec49e125
No known key found for this signature in database
GPG Key ID: CEB167EFB5722BD6
2 changed files with 11 additions and 10 deletions

View File

@ -18,6 +18,8 @@ import subprocess
import struct import struct
import shutil import shutil
from packaging.version import Version
from litex import get_data_mod from litex import get_data_mod
from litex.gen import colorer from litex.gen import colorer
@ -253,20 +255,18 @@ class Builder:
def _check_meson(self): def _check_meson(self):
# Check Meson install/version. # Check Meson install/version.
meson_present = (shutil.which("meson") is not None) meson_present = (shutil.which("meson") is not None)
meson_version = [0, 0, 0] meson_req = '0.59'
meson_major_min = 0
meson_minor_min = 59
if meson_present: if meson_present:
meson_version = subprocess.check_output(["meson", "-v"]).decode("utf-8").split(".") meson_version = subprocess.check_output(["meson", "-v"]).decode("utf-8")
if (not meson_present): if not Version(meson_version) >= Version(meson_req):
msg = f"Meson version to old. Found: {meson_version}. Required: {meson_req}.\n"
msg += "Try updating with:\n"
msg += "- pip3 install -U meson.\n"
raise OSError(msg)
else:
msg = "Unable to find valid Meson build system, please install it with:\n" msg = "Unable to find valid Meson build system, please install it with:\n"
msg += "- pip3 install meson.\n" msg += "- pip3 install meson.\n"
raise OSError(msg) raise OSError(msg)
if (int(meson_version[0]) < meson_major_min) or (int(meson_version[0]) == meson_major_min and int(meson_version[1]) < meson_minor_min):
msg = f"Meson version to old. Found: {meson_version[0]}.{meson_version[1]}. Required: {meson_major_min}.{meson_minor_min}.\n"
msg += "Try updating with:\n"
msg += "- pip3 install -U meson.\n"
raise OSError(msg)
def _prepare_rom_software(self): def _prepare_rom_software(self):
# Create directories for all software packages. # Create directories for all software packages.

View File

@ -15,6 +15,7 @@ setup(
license="BSD", license="BSD",
python_requires="~=3.6", python_requires="~=3.6",
install_requires=[ install_requires=[
"packaging",
"pyserial", "pyserial",
"requests", "requests",
], ],