On Mon, Apr 24, 2023, 2:03 PM John Snow <js...@redhat.com> wrote: > This commit changes how we detect and install meson. It notably removes > '--meson='. > > The previous patch creates a lightweight Python virtual environment > unconditionally using the user's configured $python that inherits system > packages. If Meson is installed there and meets our minimum version > requirements, we will use that Meson. > > In the event that Meson is installed but *not for the chosen Python > interpreter*, not found, or of insufficient version, we will attempt to > install Meson from vendored source into the newly created Python virtual > environment. This vendored installation is considered to replace the > mechanism from prior tarball distributions. > > This commit restores the ability to use a system meson, but in turn > temporarily removes the ability to use a meson as obtained from the > internet at configure-time (git submodules, as it stood prior to this > patch); that ability will be restored in the next commit. > > As a result of this patch, the Python interpreter we use for both our > own build scripts *and* Meson extensions are always known to be the > exact same Python. As a further benefit, there will also be a symlink > available in the build directory that points to the correct, configured > python and can be used by e.g. manual tests to invoke the correct, > configured Python unambiguously. > > Signed-off-by: John Snow <js...@redhat.com> > --- > configure | 72 ++++++++--------------------- > .gitlab-ci.d/buildtest-template.yml | 4 +- > 2 files changed, 21 insertions(+), 55 deletions(-) > > diff --git a/configure b/configure > index 462fe604d6..e9947369b2 100755 > --- a/configure > +++ b/configure > @@ -731,8 +731,6 @@ for opt do > ;; > --skip-meson) skip_meson=yes > ;; > - --meson=*) meson="$optarg" > - ;; > --ninja=*) ninja="$optarg" > ;; > --smbd=*) smbd="$optarg" > @@ -1016,7 +1014,6 @@ Advanced options (experts only): > --cross-prefix-ARCH=PREFIX cross compiler prefix when building ARCH > guest test cases > --make=MAKE use specified make [$make] > --python=PYTHON use specified python [$python] > - --meson=MESON use specified meson [$meson] > --ninja=NINJA use specified ninja [$ninja] > --smbd=SMBD use specified smbd [$smbd] > --with-git=GIT use specified git [$git] > @@ -1089,7 +1086,8 @@ fi > > # Resolve PATH > python="$(command -v "$python")" > -explicit_python=yes > +# This variable is intended to be used only for error messages: > +target_python=$python > > # Create a Python virtual environment using our configured python. > # The stdout of this script will be the location of a symlink that > @@ -1101,7 +1099,6 @@ explicit_python=yes > # - venv is cleared if it exists already; > # - venv is allowed to use system packages; > # - all setup is performed **offline**; > -# - No packages are installed by default; > # - pip is not installed into the venv when possible, > # but ensurepip is called as a fallback when necessary. > > @@ -1116,58 +1113,27 @@ fi > # Suppress writing compiled files > python="$python -B" > > -has_meson() { > - local python_dir=$(dirname "$python") > - # PEP405: pyvenv.cfg is either adjacent to the Python executable > - # or one directory above > - if test -f $python_dir/pyvenv.cfg || test -f $python_dir/../pyvenv.cfg; > then > - # Ensure that Meson and Python come from the same virtual environment > - test -x "$python_dir/meson" && > - test "$(command -v meson)" -ef "$python_dir/meson" > - else > - has meson > - fi > -} > > -if test -z "$meson"; then > - if test "$explicit_python" = no && has_meson && version_ge "$(meson > --version)" 0.61.5; then > - meson=meson > - elif test "$git_submodules_action" != 'ignore' ; then > - meson=git > - elif test -e "${source_path}/meson/meson.py" ; then > - meson=internal > - else > - if test "$explicit_python" = yes; then > - error_exit "--python requires using QEMU's embedded Meson > distribution, but it was not found." > - else > - error_exit "Meson not found. Use --meson=/path/to/meson" > - fi > +if ! $python "${source_path}/python/scripts/mkvenv.py" ensure \ > + --dir "${source_path}/python/wheels" \ > + "meson>=0.61.5" ; > +then > + # We're very out of luck. Try to give a good diagnostic. > + if test -e pyvenv/bin/meson; then > + echo "Meson is too old:
Does a minimum version still get printed? I've needed to know that in the past when I got the error... Warner $(pyvenv/bin/meson --version)" > + elif has meson ; then > + echo "Meson was found installed on your system," \ > + "but not for the configured Python interpreter > ($target_python)." > + echo "(Hint: check '$(which meson)' to see which interpreter its > shebang uses.)" > fi > -else > - # Meson uses its own Python interpreter to invoke other Python > scripts, > - # but the user wants to use the one they specified with --python. > - # > - # We do not want to override the distro Python interpreter (and > sometimes > - # cannot: for example in Homebrew /usr/bin/meson is a bash script), so > - # just require --meson=git|internal together with --python. > - if test "$explicit_python" = yes; then > - case "$meson" in > - git | internal) ;; > - *) error_exit "--python requires using QEMU's embedded Meson > distribution." ;; > - esac > - fi > -fi > - > -if test "$meson" = git; then > - git_submodules="${git_submodules} meson" > + exit 1 > fi > > -case "$meson" in > - git | internal) > - meson="$python ${source_path}/meson/meson.py" > - ;; > - *) meson=$(command -v "$meson") ;; > -esac > +# At this point, we expect Meson to be installed and available. > +# We expect mkvenv or pip to have created pyvenv/bin/meson for us. > +# We ignore PATH completely here: we want to use the venv's Meson > +# *exclusively*. > +meson="$(cd pyvenv/bin; pwd)/meson" > > echo "MKVENV ok!" > > diff --git a/.gitlab-ci.d/buildtest-template.yml > b/.gitlab-ci.d/buildtest-template.yml > index a6cfe9be97..7edb50b760 100644 > --- a/.gitlab-ci.d/buildtest-template.yml > +++ b/.gitlab-ci.d/buildtest-template.yml > @@ -12,12 +12,12 @@ > - mkdir build > - cd build > - ../configure --enable-werror --disable-docs --enable-fdt=system > - ${LD_JOBS:+--meson=git} ${TARGETS:+--target-list="$TARGETS"} > + ${TARGETS:+--target-list="$TARGETS"} > $CONFIGURE_ARGS || > { cat config.log meson-logs/meson-log.txt && exit 1; } > - if test -n "$LD_JOBS"; > then > - ../meson/meson.py configure . -Dbackend_max_links="$LD_JOBS" ; > + pyvenv/bin/meson configure . -Dbackend_max_links="$LD_JOBS" ; > fi || exit 1; > - make -j"$JOBS" > - if test -n "$MAKE_CHECK_ARGS"; > -- > 2.39.2 > >