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
>
>

Reply via email to