diff mbox series

[1/4] configure: keep track of Python version

Message ID 20181109150710.31085-2-crosa@redhat.com
State New
Headers show
Series Record Python version and misc test/CI fixes | expand

Commit Message

Cleber Rosa Nov. 9, 2018, 3:07 p.m. UTC
Some functionality is dependent on the Python version
detected/configured on configure.  While it's possible to run the
Python version later and check for the version, doing it once is
preferable.  Also, it's a relevant information to keep in build logs,
as the overall behavior of the build can be affected by it.

Signed-off-by: Cleber Rosa <crosa@redhat.com>
---
 configure | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

Comments

Eduardo Habkost Nov. 9, 2018, 3:49 p.m. UTC | #1
On Fri, Nov 09, 2018 at 10:07:07AM -0500, Cleber Rosa wrote:
> Some functionality is dependent on the Python version
> detected/configured on configure.  While it's possible to run the
> Python version later and check for the version, doing it once is
> preferable.  Also, it's a relevant information to keep in build logs,
> as the overall behavior of the build can be affected by it.
> 
> Signed-off-by: Cleber Rosa <crosa@redhat.com>
> ---
>  configure | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/configure b/configure
> index 74e313a810..67fff0290d 100755
> --- a/configure
> +++ b/configure
> @@ -1740,6 +1740,9 @@ if ! $python -c 'import sys; sys.exit(sys.version_info < (2,7))'; then
>        "Use --python=/path/to/python to specify a supported Python."
>  fi
>  
> +# Preserve python version since some functionality is dependent on it
> +python_version=$($python -V 2>&1 | sed -e 's/Python\ //')

What about:
  $($python -c 'import sys;print(sys.version)')
?

It is very verbose, but I think that's a good thing.

> +
>  # Suppress writing compiled files
>  python="$python -B"
>  
> @@ -5918,7 +5921,7 @@ echo "LDFLAGS           $LDFLAGS"
>  echo "QEMU_LDFLAGS      $QEMU_LDFLAGS"
>  echo "make              $make"
>  echo "install           $install"
> -echo "python            $python"
> +echo "python            $python ($python_version)"
>  if test "$slirp" = "yes" ; then
>      echo "smbd              $smbd"
>  fi
> @@ -6823,6 +6826,7 @@ echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
>  echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
>  echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
>  echo "PYTHON=$python" >> $config_host_mak
> +echo "PYTHON_VERSION=$python_version" >> $config_host_mak

The output of "python -V" and "sys.version" seems to be meant for
humans, not software.  If we really want something to be used in
conditional makefile rules, I'd prefer to use sys.version_info.
e.g.:

  python_major_version="$($python -c 'import sys;print(sys.version_info[0])')"
  echo "PYTHON_MAJOR_VERSION=$python_major_version"


>  echo "CC=$cc" >> $config_host_mak
>  if $iasl -h > /dev/null 2>&1; then
>    echo "IASL=$iasl" >> $config_host_mak
> -- 
> 2.19.1
>
Cleber Rosa Nov. 9, 2018, 4:39 p.m. UTC | #2
On 11/9/18 10:49 AM, Eduardo Habkost wrote:
> On Fri, Nov 09, 2018 at 10:07:07AM -0500, Cleber Rosa wrote:
>> Some functionality is dependent on the Python version
>> detected/configured on configure.  While it's possible to run the
>> Python version later and check for the version, doing it once is
>> preferable.  Also, it's a relevant information to keep in build logs,
>> as the overall behavior of the build can be affected by it.
>>
>> Signed-off-by: Cleber Rosa <crosa@redhat.com>
>> ---
>>  configure | 6 +++++-
>>  1 file changed, 5 insertions(+), 1 deletion(-)
>>
>> diff --git a/configure b/configure
>> index 74e313a810..67fff0290d 100755
>> --- a/configure
>> +++ b/configure
>> @@ -1740,6 +1740,9 @@ if ! $python -c 'import sys; sys.exit(sys.version_info < (2,7))'; then
>>        "Use --python=/path/to/python to specify a supported Python."
>>  fi
>>  
>> +# Preserve python version since some functionality is dependent on it
>> +python_version=$($python -V 2>&1 | sed -e 's/Python\ //')
> 
> What about:
>   $($python -c 'import sys;print(sys.version)')
> ?
> 
> It is very verbose, but I think that's a good thing.
> 

Well, something like:

'3.7.1 (default, Oct 23 2018, 18:19:07) \n[GCC 8.2.1 20180801 (Red Hat
8.2.1-2)]'

Doesn't qualify as simply the Python *version*.  The documentation[1]
puts it clearly: "A string containing the version number of the Python
interpreter plus additional information on the build number and compiler
used. This string is displayed when the interactive interpreter is started."

I can't see how the compiler used on the Python build, or the build
date, can be significant to someone debugging the type of Python code
that will be on QEMU.

>> +
>>  # Suppress writing compiled files
>>  python="$python -B"
>>  
>> @@ -5918,7 +5921,7 @@ echo "LDFLAGS           $LDFLAGS"
>>  echo "QEMU_LDFLAGS      $QEMU_LDFLAGS"
>>  echo "make              $make"
>>  echo "install           $install"
>> -echo "python            $python"
>> +echo "python            $python ($python_version)"
>>  if test "$slirp" = "yes" ; then
>>      echo "smbd              $smbd"
>>  fi
>> @@ -6823,6 +6826,7 @@ echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
>>  echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
>>  echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
>>  echo "PYTHON=$python" >> $config_host_mak
>> +echo "PYTHON_VERSION=$python_version" >> $config_host_mak
> 
> The output of "python -V" and "sys.version" seems to be meant for
> humans, not software.  If we really want something to be used in
> conditional makefile rules, I'd prefer to use sys.version_info.
> e.g.:
> 

"Python -V" is quite different from "sys.version".  Indeed it includes
the "Python " prefix, but that's all, everything else is the version number.

>   python_major_version="$($python -c 'import sys;print(sys.version_info[0])')"
>   echo "PYTHON_MAJOR_VERSION=$python_major_version"
> 
> 

No, I'm actually interested in the other version components, not just
the major version.  As I tried to explain in another thread, differences
from Python 3.0 to 3.4 are many, and from 3.4 to 3.6 and so on.

Then, we can either introduce "PYTHON_MAJOR_VERSION",
"PYTHON_MINOR_VERSION", "PYTHON_RELEASE" of sorts, or just have a single
dot separated version string.

- Cleber

[1] - https://docs.python.org/3/library/sys.html#sys.version

>>  echo "CC=$cc" >> $config_host_mak
>>  if $iasl -h > /dev/null 2>&1; then
>>    echo "IASL=$iasl" >> $config_host_mak
>> -- 
>> 2.19.1
>>
>
Eduardo Habkost Nov. 9, 2018, 6:25 p.m. UTC | #3
On Fri, Nov 09, 2018 at 11:39:32AM -0500, Cleber Rosa wrote:
> 
> 
> On 11/9/18 10:49 AM, Eduardo Habkost wrote:
> > On Fri, Nov 09, 2018 at 10:07:07AM -0500, Cleber Rosa wrote:
> >> Some functionality is dependent on the Python version
> >> detected/configured on configure.  While it's possible to run the
> >> Python version later and check for the version, doing it once is
> >> preferable.  Also, it's a relevant information to keep in build logs,
> >> as the overall behavior of the build can be affected by it.
> >>
> >> Signed-off-by: Cleber Rosa <crosa@redhat.com>
> >> ---
> >>  configure | 6 +++++-
> >>  1 file changed, 5 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/configure b/configure
> >> index 74e313a810..67fff0290d 100755
> >> --- a/configure
> >> +++ b/configure
> >> @@ -1740,6 +1740,9 @@ if ! $python -c 'import sys; sys.exit(sys.version_info < (2,7))'; then
> >>        "Use --python=/path/to/python to specify a supported Python."
> >>  fi
> >>  
> >> +# Preserve python version since some functionality is dependent on it
> >> +python_version=$($python -V 2>&1 | sed -e 's/Python\ //')
> > 
> > What about:
> >   $($python -c 'import sys;print(sys.version)')
> > ?
> > 
> > It is very verbose, but I think that's a good thing.
> > 
> 
> Well, something like:
> 
> '3.7.1 (default, Oct 23 2018, 18:19:07) \n[GCC 8.2.1 20180801 (Red Hat
> 8.2.1-2)]'
> 
> Doesn't qualify as simply the Python *version*.  The documentation[1]
> puts it clearly: "A string containing the version number of the Python
> interpreter plus additional information on the build number and compiler
> used. This string is displayed when the interactive interpreter is started."
> 
> I can't see how the compiler used on the Python build, or the build
> date, can be significant to someone debugging the type of Python code
> that will be on QEMU.

No problem to me.

> 
> >> +
> >>  # Suppress writing compiled files
> >>  python="$python -B"
> >>  
> >> @@ -5918,7 +5921,7 @@ echo "LDFLAGS           $LDFLAGS"
> >>  echo "QEMU_LDFLAGS      $QEMU_LDFLAGS"
> >>  echo "make              $make"
> >>  echo "install           $install"
> >> -echo "python            $python"
> >> +echo "python            $python ($python_version)"
> >>  if test "$slirp" = "yes" ; then
> >>      echo "smbd              $smbd"
> >>  fi
> >> @@ -6823,6 +6826,7 @@ echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
> >>  echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
> >>  echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
> >>  echo "PYTHON=$python" >> $config_host_mak
> >> +echo "PYTHON_VERSION=$python_version" >> $config_host_mak
> > 
> > The output of "python -V" and "sys.version" seems to be meant for
> > humans, not software.  If we really want something to be used in
> > conditional makefile rules, I'd prefer to use sys.version_info.
> > e.g.:
> > 
> 
> "Python -V" is quite different from "sys.version".  Indeed it includes
> the "Python " prefix, but that's all, everything else is the version number.

Is this a guarantee documented somewhere?

> 
> >   python_major_version="$($python -c 'import sys;print(sys.version_info[0])')"
> >   echo "PYTHON_MAJOR_VERSION=$python_major_version"
> > 
> > 
> 
> No, I'm actually interested in the other version components, not just
> the major version.  As I tried to explain in another thread, differences
> from Python 3.0 to 3.4 are many, and from 3.4 to 3.6 and so on.

Do you have any examples in mind?  I really doubt we will need to
look at the Python minor version number inside shell scripts or
makefiles.

> 
> Then, we can either introduce "PYTHON_MAJOR_VERSION",
> "PYTHON_MINOR_VERSION", "PYTHON_RELEASE" of sorts, or just have a single
> dot separated version string.

A dot separated version string would work for me, too.  I don't
mind the format that much, because I expect the new variable to
become unnecessary in the next year.  :)
Cleber Rosa Nov. 9, 2018, 7:09 p.m. UTC | #4
On 11/9/18 1:25 PM, Eduardo Habkost wrote:
> On Fri, Nov 09, 2018 at 11:39:32AM -0500, Cleber Rosa wrote:
>>
>>
>> On 11/9/18 10:49 AM, Eduardo Habkost wrote:
>>> On Fri, Nov 09, 2018 at 10:07:07AM -0500, Cleber Rosa wrote:
>>>> Some functionality is dependent on the Python version
>>>> detected/configured on configure.  While it's possible to run the
>>>> Python version later and check for the version, doing it once is
>>>> preferable.  Also, it's a relevant information to keep in build logs,
>>>> as the overall behavior of the build can be affected by it.
>>>>
>>>> Signed-off-by: Cleber Rosa <crosa@redhat.com>
>>>> ---
>>>>  configure | 6 +++++-
>>>>  1 file changed, 5 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/configure b/configure
>>>> index 74e313a810..67fff0290d 100755
>>>> --- a/configure
>>>> +++ b/configure
>>>> @@ -1740,6 +1740,9 @@ if ! $python -c 'import sys; sys.exit(sys.version_info < (2,7))'; then
>>>>        "Use --python=/path/to/python to specify a supported Python."
>>>>  fi
>>>>  
>>>> +# Preserve python version since some functionality is dependent on it
>>>> +python_version=$($python -V 2>&1 | sed -e 's/Python\ //')
>>>
>>> What about:
>>>   $($python -c 'import sys;print(sys.version)')
>>> ?
>>>
>>> It is very verbose, but I think that's a good thing.
>>>
>>
>> Well, something like:
>>
>> '3.7.1 (default, Oct 23 2018, 18:19:07) \n[GCC 8.2.1 20180801 (Red Hat
>> 8.2.1-2)]'
>>
>> Doesn't qualify as simply the Python *version*.  The documentation[1]
>> puts it clearly: "A string containing the version number of the Python
>> interpreter plus additional information on the build number and compiler
>> used. This string is displayed when the interactive interpreter is started."
>>
>> I can't see how the compiler used on the Python build, or the build
>> date, can be significant to someone debugging the type of Python code
>> that will be on QEMU.
> 
> No problem to me.
> 
>>
>>>> +
>>>>  # Suppress writing compiled files
>>>>  python="$python -B"
>>>>  
>>>> @@ -5918,7 +5921,7 @@ echo "LDFLAGS           $LDFLAGS"
>>>>  echo "QEMU_LDFLAGS      $QEMU_LDFLAGS"
>>>>  echo "make              $make"
>>>>  echo "install           $install"
>>>> -echo "python            $python"
>>>> +echo "python            $python ($python_version)"
>>>>  if test "$slirp" = "yes" ; then
>>>>      echo "smbd              $smbd"
>>>>  fi
>>>> @@ -6823,6 +6826,7 @@ echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
>>>>  echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
>>>>  echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
>>>>  echo "PYTHON=$python" >> $config_host_mak
>>>> +echo "PYTHON_VERSION=$python_version" >> $config_host_mak
>>>
>>> The output of "python -V" and "sys.version" seems to be meant for
>>> humans, not software.  If we really want something to be used in
>>> conditional makefile rules, I'd prefer to use sys.version_info.
>>> e.g.:
>>>
>>
>> "Python -V" is quite different from "sys.version".  Indeed it includes
>> the "Python " prefix, but that's all, everything else is the version number.
> 
> Is this a guarantee documented somewhere?
> 
>>
>>>   python_major_version="$($python -c 'import sys;print(sys.version_info[0])')"
>>>   echo "PYTHON_MAJOR_VERSION=$python_major_version"
>>>
>>>
>>
>> No, I'm actually interested in the other version components, not just
>> the major version.  As I tried to explain in another thread, differences
>> from Python 3.0 to 3.4 are many, and from 3.4 to 3.6 and so on.
> 
> Do you have any examples in mind?  I really doubt we will need to
> look at the Python minor version number inside shell scripts or
> makefiles.
> 

I guess I failed to make myself clear, because it looks like you're
missing my point here.  The situation that I envision is a developer
writes a Python based test, runs it locally, gets a PASS, puts in a
patch, sends it upstream.  It gets executed on a number of different CI
environments.  It fails on one (or some).  What's causing the failure?
The Python *minor* version may be a significant difference.

Like I said before, printing that is the most important functionality at
this point.  It is indeed debatable whether we'll need to keep it
available for make/shell usage.

>>
>> Then, we can either introduce "PYTHON_MAJOR_VERSION",
>> "PYTHON_MINOR_VERSION", "PYTHON_RELEASE" of sorts, or just have a single
>> dot separated version string.
> 
> A dot separated version string would work for me, too.  I don't
> mind the format that much, because I expect the new variable to
> become unnecessary in the next year.  :)
> 

Cool.  Thanks for the feedback.  Just to get this right, what do I need
to change here?

- Cleber.
Cleber Rosa Nov. 9, 2018, 7:51 p.m. UTC | #5
On 11/9/18 1:25 PM, Eduardo Habkost wrote:
>>
>> "Python -V" is quite different from "sys.version".  Indeed it includes
>> the "Python " prefix, but that's all, everything else is the version number.
> 
> Is this a guarantee documented somewhere?
> 

Oops, looks like I missed that comment, and failed to address it.  Now,
I must say I don't expect a documented guarantee about this will exist,
but it looks like this is an acknowledged use case:

https://bugs.python.org/issue18338

- Cleber.
Eduardo Habkost Nov. 9, 2018, 9:25 p.m. UTC | #6
On Fri, Nov 09, 2018 at 02:51:11PM -0500, Cleber Rosa wrote:
> 
> 
> On 11/9/18 1:25 PM, Eduardo Habkost wrote:
> >>
> >> "Python -V" is quite different from "sys.version".  Indeed it includes
> >> the "Python " prefix, but that's all, everything else is the version number.
> > 
> > Is this a guarantee documented somewhere?
> > 
> 
> Oops, looks like I missed that comment, and failed to address it.  Now,
> I must say I don't expect a documented guarantee about this will exist,
> but it looks like this is an acknowledged use case:
> 
> https://bugs.python.org/issue18338

Well, considering that it even has a unit test checking for a
specific format[1], I think the usage in this patch can be
considered acceptable.

[1] https://hg.python.org/cpython/rev/e6384b8b2325
Eduardo Habkost Nov. 9, 2018, 9:26 p.m. UTC | #7
On Fri, Nov 09, 2018 at 10:07:07AM -0500, Cleber Rosa wrote:
> Some functionality is dependent on the Python version
> detected/configured on configure.  While it's possible to run the
> Python version later and check for the version, doing it once is
> preferable.  Also, it's a relevant information to keep in build logs,
> as the overall behavior of the build can be affected by it.
> 
> Signed-off-by: Cleber Rosa <crosa@redhat.com>

Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Peter Maydell Aug. 22, 2019, 4:48 p.m. UTC | #8
On Fri, 9 Nov 2018 at 15:09, Cleber Rosa <crosa@redhat.com> wrote:
>
> Some functionality is dependent on the Python version
> detected/configured on configure.  While it's possible to run the
> Python version later and check for the version, doing it once is
> preferable.  Also, it's a relevant information to keep in build logs,
> as the overall behavior of the build can be affected by it.
>
> Signed-off-by: Cleber Rosa <crosa@redhat.com>
> ---
>  configure | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/configure b/configure
> index 74e313a810..67fff0290d 100755
> --- a/configure
> +++ b/configure
> @@ -1740,6 +1740,9 @@ if ! $python -c 'import sys; sys.exit(sys.version_info < (2,7))'; then
>        "Use --python=/path/to/python to specify a supported Python."
>  fi
>
> +# Preserve python version since some functionality is dependent on it
> +python_version=$($python -V 2>&1 | sed -e 's/Python\ //')
> +

Hi. Somebody on IRC has just fallen over a problem where
their python's "-V" output prints multiple lines, which
means that "$python_version" here is multiple lines, which
means that the eventual config-host.mak has invalid syntax
because we assume here:

> @@ -6823,6 +6826,7 @@ echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
>  echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
>  echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
>  echo "PYTHON=$python" >> $config_host_mak
> +echo "PYTHON_VERSION=$python_version" >> $config_host_mak
>  echo "CC=$cc" >> $config_host_mak
>  if $iasl -h > /dev/null 2>&1; then
>    echo "IASL=$iasl" >> $config_host_mak

that it's only one line, and will generate bogus makefile
syntax if it's got an embedded newline. (Problem system
seems to be Fedora 29.)

I've reread this thread, where there seems to have been
some discussion about just running Python itself to
get the sys.version value (which is how we check for
"is this python too old" earlier in the configure script).
But I'm not really clear why trying to parse -V output is better:
it's definitely less reliable, as demonstrated by this bug.

Given that the only thing as far as I can tell that we
do with PYTHON_VERSION is use it in tests/Makefile.inc
to suppress a bit of test functionality if we don't have
Python 3, could we stop trying to parse -V output and run
python to print sys.version_info instead, and/or just
have the makefile variable track "is this python 2",
since that's what we really care about and would mean we
don't have to then search the string for "v2"  ?

thanks
-- PMM
Cleber Rosa Aug. 22, 2019, 9:19 p.m. UTC | #9
On Thu, Aug 22, 2019 at 05:48:46PM +0100, Peter Maydell wrote:
> On Fri, 9 Nov 2018 at 15:09, Cleber Rosa <crosa@redhat.com> wrote:
> >
> > Some functionality is dependent on the Python version
> > detected/configured on configure.  While it's possible to run the
> > Python version later and check for the version, doing it once is
> > preferable.  Also, it's a relevant information to keep in build logs,
> > as the overall behavior of the build can be affected by it.
> >
> > Signed-off-by: Cleber Rosa <crosa@redhat.com>
> > ---
> >  configure | 6 +++++-
> >  1 file changed, 5 insertions(+), 1 deletion(-)
> >
> > diff --git a/configure b/configure
> > index 74e313a810..67fff0290d 100755
> > --- a/configure
> > +++ b/configure
> > @@ -1740,6 +1740,9 @@ if ! $python -c 'import sys; sys.exit(sys.version_info < (2,7))'; then
> >        "Use --python=/path/to/python to specify a supported Python."
> >  fi
> >
> > +# Preserve python version since some functionality is dependent on it
> > +python_version=$($python -V 2>&1 | sed -e 's/Python\ //')
> > +
> 
> Hi. Somebody on IRC has just fallen over a problem where
> their python's "-V" output prints multiple lines, which
> means that "$python_version" here is multiple lines, which
> means that the eventual config-host.mak has invalid syntax
> because we assume here:
>

We've tried a number of things, and just when I thought we wouldn't be
able to make any sense out of it, I arrived at a still senseless but
precise reproducer.  TL;DR: it has to do with interactive shells and
that exact Python build.

Reproducer (docker may also do the trick here):

  $ podman run --rm -ti fedora:29 /bin/bash -c 'dnf -y install http://mirror.siena.edu/fedora/linux/releases/29/Everything/x86_64/os/Packages/p/python3-3.7.0-9.fc29.x86_64.rpm; python3 -V'
  Python 3.7.0 (default, Aug 30 2018, 14:32:33) 
  [GCC 8.2.1 20180801 (Red Hat 8.2.1-2)]

With an interactive shell instead:

  $ podman run --rm -ti fedora:29 /bin/bash -i -c 'dnf -y install http://mirror.siena.edu/fedora/linux/releases/29/Everything/x86_64/os/Packages/p/python3-3.7.0-9.fc29.x86_64.rpm; python3 -V'
  Python 3.7.0

How this behavior came to be, baffles me.  But, it seems to be fixed
on newer versions.

> > @@ -6823,6 +6826,7 @@ echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
> >  echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
> >  echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
> >  echo "PYTHON=$python" >> $config_host_mak
> > +echo "PYTHON_VERSION=$python_version" >> $config_host_mak
> >  echo "CC=$cc" >> $config_host_mak
> >  if $iasl -h > /dev/null 2>&1; then
> >    echo "IASL=$iasl" >> $config_host_mak
> 
> that it's only one line, and will generate bogus makefile
> syntax if it's got an embedded newline. (Problem system
> seems to be Fedora 29.)
>

The assumption could be guaranteed by a "head -1", and while
it's not a failproof solution, it would at least not corrupt
the makefile and the whole build system.

> I've reread this thread, where there seems to have been
> some discussion about just running Python itself to
> get the sys.version value (which is how we check for
> "is this python too old" earlier in the configure script).
> But I'm not really clear why trying to parse -V output is better:
> it's definitely less reliable, as demonstrated by this bug.
>
> Given that the only thing as far as I can tell that we
> do with PYTHON_VERSION is use it in tests/Makefile.inc
> to suppress a bit of test functionality if we don't have
> Python 3, could we stop trying to parse -V output and run
> python to print sys.version_info instead, and/or just
> have the makefile variable track "is this python 2",
> since that's what we really care about and would mean we
> don't have to then search the string for "v2"  ?

Because I've been bitten way too many times with differences in Python
minor versions, I see a lot of value in keeping the version
information in the build system.  But, the same information can
certainly be obtained in a more resilient way.  Would you object something
like:

  python_version=$($python -c 'import sys; print(sys.version().split()[0])')

Or an even more paranoid version?  On my side, I understand the
fragility of the current approach, but I also appreciate the
information it stores.

> 
> thanks
> -- PMM

Thanks!
- Cleber.
Eduardo Habkost Aug. 22, 2019, 9:54 p.m. UTC | #10
On Thu, Aug 22, 2019 at 05:19:26PM -0400, Cleber Rosa wrote:
> On Thu, Aug 22, 2019 at 05:48:46PM +0100, Peter Maydell wrote:
> > On Fri, 9 Nov 2018 at 15:09, Cleber Rosa <crosa@redhat.com> wrote:
> > >
> > > Some functionality is dependent on the Python version
> > > detected/configured on configure.  While it's possible to run the
> > > Python version later and check for the version, doing it once is
> > > preferable.  Also, it's a relevant information to keep in build logs,
> > > as the overall behavior of the build can be affected by it.
> > >
> > > Signed-off-by: Cleber Rosa <crosa@redhat.com>
> > > ---
> > >  configure | 6 +++++-
> > >  1 file changed, 5 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/configure b/configure
> > > index 74e313a810..67fff0290d 100755
> > > --- a/configure
> > > +++ b/configure
> > > @@ -1740,6 +1740,9 @@ if ! $python -c 'import sys; sys.exit(sys.version_info < (2,7))'; then
> > >        "Use --python=/path/to/python to specify a supported Python."
> > >  fi
> > >
> > > +# Preserve python version since some functionality is dependent on it
> > > +python_version=$($python -V 2>&1 | sed -e 's/Python\ //')
> > > +
> > 
> > Hi. Somebody on IRC has just fallen over a problem where
> > their python's "-V" output prints multiple lines, which
> > means that "$python_version" here is multiple lines, which
> > means that the eventual config-host.mak has invalid syntax
> > because we assume here:
> >
> 
> We've tried a number of things, and just when I thought we wouldn't be
> able to make any sense out of it, I arrived at a still senseless but
> precise reproducer.  TL;DR: it has to do with interactive shells and
> that exact Python build.
> 
> Reproducer (docker may also do the trick here):
> 
>   $ podman run --rm -ti fedora:29 /bin/bash -c 'dnf -y install http://mirror.siena.edu/fedora/linux/releases/29/Everything/x86_64/os/Packages/p/python3-3.7.0-9.fc29.x86_64.rpm; python3 -V'
>   Python 3.7.0 (default, Aug 30 2018, 14:32:33) 
>   [GCC 8.2.1 20180801 (Red Hat 8.2.1-2)]
> 
> With an interactive shell instead:
> 
>   $ podman run --rm -ti fedora:29 /bin/bash -i -c 'dnf -y install http://mirror.siena.edu/fedora/linux/releases/29/Everything/x86_64/os/Packages/p/python3-3.7.0-9.fc29.x86_64.rpm; python3 -V'
>   Python 3.7.0
> 
> How this behavior came to be, baffles me.  But, it seems to be fixed
> on newer versions.
> 
> > > @@ -6823,6 +6826,7 @@ echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
> > >  echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
> > >  echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
> > >  echo "PYTHON=$python" >> $config_host_mak
> > > +echo "PYTHON_VERSION=$python_version" >> $config_host_mak
> > >  echo "CC=$cc" >> $config_host_mak
> > >  if $iasl -h > /dev/null 2>&1; then
> > >    echo "IASL=$iasl" >> $config_host_mak
> > 
> > that it's only one line, and will generate bogus makefile
> > syntax if it's got an embedded newline. (Problem system
> > seems to be Fedora 29.)
> >
> 
> The assumption could be guaranteed by a "head -1", and while
> it's not a failproof solution, it would at least not corrupt
> the makefile and the whole build system.
> 
> > I've reread this thread, where there seems to have been
> > some discussion about just running Python itself to
> > get the sys.version value (which is how we check for
> > "is this python too old" earlier in the configure script).
> > But I'm not really clear why trying to parse -V output is better:
> > it's definitely less reliable, as demonstrated by this bug.

Agreed.

> >
> > Given that the only thing as far as I can tell that we
> > do with PYTHON_VERSION is use it in tests/Makefile.inc
> > to suppress a bit of test functionality if we don't have
> > Python 3, could we stop trying to parse -V output and run
> > python to print sys.version_info instead, and/or just
> > have the makefile variable track "is this python 2",
> > since that's what we really care about and would mean we
> > don't have to then search the string for "v2"  ?
> 
> Because I've been bitten way too many times with differences in Python
> minor versions, I see a lot of value in keeping the version
> information in the build system.  But, the same information can
> certainly be obtained in a more resilient way.  Would you object something
> like:
> 
>   python_version=$($python -c 'import sys; print(sys.version().split()[0])')

Sounds much better, but why sys.version().split() instead of
sys.version_info?

  python_version=$($python -c 'import sys; print(sys.version_info[0])')

> 
> Or an even more paranoid version?  On my side, I understand the
> fragility of the current approach, but I also appreciate the
> information it stores.

We have only one place where $(PYTHON_VERSION) is used, and that
code will be removed once we stop supporting Python 2.  I don't
see the point of trying to store extra information that is not
used anywhere in our makefiles.
Cleber Rosa Aug. 23, 2019, 1:40 p.m. UTC | #11
On Thu, Aug 22, 2019 at 06:54:20PM -0300, Eduardo Habkost wrote:
> On Thu, Aug 22, 2019 at 05:19:26PM -0400, Cleber Rosa wrote:
> > On Thu, Aug 22, 2019 at 05:48:46PM +0100, Peter Maydell wrote:
> > > On Fri, 9 Nov 2018 at 15:09, Cleber Rosa <crosa@redhat.com> wrote:
> > > >
> > > > Some functionality is dependent on the Python version
> > > > detected/configured on configure.  While it's possible to run the
> > > > Python version later and check for the version, doing it once is
> > > > preferable.  Also, it's a relevant information to keep in build logs,
> > > > as the overall behavior of the build can be affected by it.
> > > >
> > > > Signed-off-by: Cleber Rosa <crosa@redhat.com>
> > > > ---
> > > >  configure | 6 +++++-
> > > >  1 file changed, 5 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/configure b/configure
> > > > index 74e313a810..67fff0290d 100755
> > > > --- a/configure
> > > > +++ b/configure
> > > > @@ -1740,6 +1740,9 @@ if ! $python -c 'import sys; sys.exit(sys.version_info < (2,7))'; then
> > > >        "Use --python=/path/to/python to specify a supported Python."
> > > >  fi
> > > >
> > > > +# Preserve python version since some functionality is dependent on it
> > > > +python_version=$($python -V 2>&1 | sed -e 's/Python\ //')
> > > > +
> > > 
> > > Hi. Somebody on IRC has just fallen over a problem where
> > > their python's "-V" output prints multiple lines, which
> > > means that "$python_version" here is multiple lines, which
> > > means that the eventual config-host.mak has invalid syntax
> > > because we assume here:
> > >
> > 
> > We've tried a number of things, and just when I thought we wouldn't be
> > able to make any sense out of it, I arrived at a still senseless but
> > precise reproducer.  TL;DR: it has to do with interactive shells and
> > that exact Python build.
> > 
> > Reproducer (docker may also do the trick here):
> > 
> >   $ podman run --rm -ti fedora:29 /bin/bash -c 'dnf -y install http://mirror.siena.edu/fedora/linux/releases/29/Everything/x86_64/os/Packages/p/python3-3.7.0-9.fc29.x86_64.rpm; python3 -V'
> >   Python 3.7.0 (default, Aug 30 2018, 14:32:33) 
> >   [GCC 8.2.1 20180801 (Red Hat 8.2.1-2)]
> > 
> > With an interactive shell instead:
> > 
> >   $ podman run --rm -ti fedora:29 /bin/bash -i -c 'dnf -y install http://mirror.siena.edu/fedora/linux/releases/29/Everything/x86_64/os/Packages/p/python3-3.7.0-9.fc29.x86_64.rpm; python3 -V'
> >   Python 3.7.0
> > 
> > How this behavior came to be, baffles me.  But, it seems to be fixed
> > on newer versions.
> > 
> > > > @@ -6823,6 +6826,7 @@ echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
> > > >  echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
> > > >  echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
> > > >  echo "PYTHON=$python" >> $config_host_mak
> > > > +echo "PYTHON_VERSION=$python_version" >> $config_host_mak
> > > >  echo "CC=$cc" >> $config_host_mak
> > > >  if $iasl -h > /dev/null 2>&1; then
> > > >    echo "IASL=$iasl" >> $config_host_mak
> > > 
> > > that it's only one line, and will generate bogus makefile
> > > syntax if it's got an embedded newline. (Problem system
> > > seems to be Fedora 29.)
> > >
> > 
> > The assumption could be guaranteed by a "head -1", and while
> > it's not a failproof solution, it would at least not corrupt
> > the makefile and the whole build system.
> > 
> > > I've reread this thread, where there seems to have been
> > > some discussion about just running Python itself to
> > > get the sys.version value (which is how we check for
> > > "is this python too old" earlier in the configure script).
> > > But I'm not really clear why trying to parse -V output is better:
> > > it's definitely less reliable, as demonstrated by this bug.
> 
> Agreed.
> 
> > >
> > > Given that the only thing as far as I can tell that we
> > > do with PYTHON_VERSION is use it in tests/Makefile.inc
> > > to suppress a bit of test functionality if we don't have
> > > Python 3, could we stop trying to parse -V output and run
> > > python to print sys.version_info instead, and/or just
> > > have the makefile variable track "is this python 2",
> > > since that's what we really care about and would mean we
> > > don't have to then search the string for "v2"  ?
> > 
> > Because I've been bitten way too many times with differences in Python
> > minor versions, I see a lot of value in keeping the version
> > information in the build system.  But, the same information can
> > certainly be obtained in a more resilient way.  Would you object something
> > like:
> > 
> >   python_version=$($python -c 'import sys; print(sys.version().split()[0])')
> 
> Sounds much better, but why sys.version().split() instead of
> sys.version_info?
> 
>   python_version=$($python -c 'import sys; print(sys.version_info[0])')
>

I meant to capture not only the major version, but the minor and release
as well.  My reasoning (may not appeal more people):

 "Because I've been bitten way too many times with differences in Python
  minor versions, I see a lot of value in keeping the version
  information in the build system."

> > 
> > Or an even more paranoid version?  On my side, I understand the
> > fragility of the current approach, but I also appreciate the
> > information it stores.
> 
> We have only one place where $(PYTHON_VERSION) is used, and that
> code will be removed once we stop supporting Python 2.  I don't
> see the point of trying to store extra information that is not
> used anywhere in our makefiles.
>
> -- 
> Eduardo
> 

I see it being used by humans, so that brings a lot of subjetivity
into the matter.  IMO this is not out of place within the build
system, given that a lot of requirements detected by configure will
print out their versions (GTK, nettle, spice, etc).

But I'm certainly OK with dropping it if no value is perceived by
anyone else.

Cheers,
- Cleber.
Peter Maydell Aug. 23, 2019, 1:44 p.m. UTC | #12
On Fri, 23 Aug 2019 at 14:41, Cleber Rosa <crosa@redhat.com> wrote:
> I see it being used by humans, so that brings a lot of subjetivity
> into the matter.  IMO this is not out of place within the build
> system, given that a lot of requirements detected by configure will
> print out their versions (GTK, nettle, spice, etc).
>
> But I'm certainly OK with dropping it if no value is perceived by
> anyone else.

I'd be happy with keeping it in the human-readable output
that configure emits: if it's the wrong format there that's
pretty harmless. But we shouldn't feed it into the makefiles
unless we really need it, and we shouldn't let the format
of whatever we do feed into the makefiles be driven by
the desire to print something human-readable in configure's
output -- there's no need for the two things to be the
exact same string.

thanks
-- PMM
Eduardo Habkost Aug. 23, 2019, 3:04 p.m. UTC | #13
On Fri, Aug 23, 2019 at 09:40:54AM -0400, Cleber Rosa wrote:
> On Thu, Aug 22, 2019 at 06:54:20PM -0300, Eduardo Habkost wrote:
> > On Thu, Aug 22, 2019 at 05:19:26PM -0400, Cleber Rosa wrote:
> > > On Thu, Aug 22, 2019 at 05:48:46PM +0100, Peter Maydell wrote:
> > > > On Fri, 9 Nov 2018 at 15:09, Cleber Rosa <crosa@redhat.com> wrote:
> > > > >
> > > > > Some functionality is dependent on the Python version
> > > > > detected/configured on configure.  While it's possible to run the
> > > > > Python version later and check for the version, doing it once is
> > > > > preferable.  Also, it's a relevant information to keep in build logs,
> > > > > as the overall behavior of the build can be affected by it.
> > > > >
> > > > > Signed-off-by: Cleber Rosa <crosa@redhat.com>
> > > > > ---
> > > > >  configure | 6 +++++-
> > > > >  1 file changed, 5 insertions(+), 1 deletion(-)
> > > > >
> > > > > diff --git a/configure b/configure
> > > > > index 74e313a810..67fff0290d 100755
> > > > > --- a/configure
> > > > > +++ b/configure
> > > > > @@ -1740,6 +1740,9 @@ if ! $python -c 'import sys; sys.exit(sys.version_info < (2,7))'; then
> > > > >        "Use --python=/path/to/python to specify a supported Python."
> > > > >  fi
> > > > >
> > > > > +# Preserve python version since some functionality is dependent on it
> > > > > +python_version=$($python -V 2>&1 | sed -e 's/Python\ //')
> > > > > +
> > > > 
> > > > Hi. Somebody on IRC has just fallen over a problem where
> > > > their python's "-V" output prints multiple lines, which
> > > > means that "$python_version" here is multiple lines, which
> > > > means that the eventual config-host.mak has invalid syntax
> > > > because we assume here:
> > > >
> > > 
> > > We've tried a number of things, and just when I thought we wouldn't be
> > > able to make any sense out of it, I arrived at a still senseless but
> > > precise reproducer.  TL;DR: it has to do with interactive shells and
> > > that exact Python build.
> > > 
> > > Reproducer (docker may also do the trick here):
> > > 
> > >   $ podman run --rm -ti fedora:29 /bin/bash -c 'dnf -y install http://mirror.siena.edu/fedora/linux/releases/29/Everything/x86_64/os/Packages/p/python3-3.7.0-9.fc29.x86_64.rpm; python3 -V'
> > >   Python 3.7.0 (default, Aug 30 2018, 14:32:33) 
> > >   [GCC 8.2.1 20180801 (Red Hat 8.2.1-2)]
> > > 
> > > With an interactive shell instead:
> > > 
> > >   $ podman run --rm -ti fedora:29 /bin/bash -i -c 'dnf -y install http://mirror.siena.edu/fedora/linux/releases/29/Everything/x86_64/os/Packages/p/python3-3.7.0-9.fc29.x86_64.rpm; python3 -V'
> > >   Python 3.7.0
> > > 
> > > How this behavior came to be, baffles me.  But, it seems to be fixed
> > > on newer versions.
> > > 
> > > > > @@ -6823,6 +6826,7 @@ echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
> > > > >  echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
> > > > >  echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
> > > > >  echo "PYTHON=$python" >> $config_host_mak
> > > > > +echo "PYTHON_VERSION=$python_version" >> $config_host_mak
> > > > >  echo "CC=$cc" >> $config_host_mak
> > > > >  if $iasl -h > /dev/null 2>&1; then
> > > > >    echo "IASL=$iasl" >> $config_host_mak
> > > > 
> > > > that it's only one line, and will generate bogus makefile
> > > > syntax if it's got an embedded newline. (Problem system
> > > > seems to be Fedora 29.)
> > > >
> > > 
> > > The assumption could be guaranteed by a "head -1", and while
> > > it's not a failproof solution, it would at least not corrupt
> > > the makefile and the whole build system.
> > > 
> > > > I've reread this thread, where there seems to have been
> > > > some discussion about just running Python itself to
> > > > get the sys.version value (which is how we check for
> > > > "is this python too old" earlier in the configure script).
> > > > But I'm not really clear why trying to parse -V output is better:
> > > > it's definitely less reliable, as demonstrated by this bug.
> > 
> > Agreed.
> > 
> > > >
> > > > Given that the only thing as far as I can tell that we
> > > > do with PYTHON_VERSION is use it in tests/Makefile.inc
> > > > to suppress a bit of test functionality if we don't have
> > > > Python 3, could we stop trying to parse -V output and run
> > > > python to print sys.version_info instead, and/or just
> > > > have the makefile variable track "is this python 2",
> > > > since that's what we really care about and would mean we
> > > > don't have to then search the string for "v2"  ?
> > > 
> > > Because I've been bitten way too many times with differences in Python
> > > minor versions, I see a lot of value in keeping the version
> > > information in the build system.  But, the same information can
> > > certainly be obtained in a more resilient way.  Would you object something
> > > like:
> > > 
> > >   python_version=$($python -c 'import sys; print(sys.version().split()[0])')
> > 
> > Sounds much better, but why sys.version().split() instead of
> > sys.version_info?
> > 
> >   python_version=$($python -c 'import sys; print(sys.version_info[0])')
> >
> 
> I meant to capture not only the major version, but the minor and release
> as well.  My reasoning (may not appeal more people):
> 
>  "Because I've been bitten way too many times with differences in Python
>   minor versions, I see a lot of value in keeping the version
>   information in the build system."
> 
> > > 
> > > Or an even more paranoid version?  On my side, I understand the
> > > fragility of the current approach, but I also appreciate the
> > > information it stores.
> > 
> > We have only one place where $(PYTHON_VERSION) is used, and that
> > code will be removed once we stop supporting Python 2.  I don't
> > see the point of trying to store extra information that is not
> > used anywhere in our makefiles.
[...]
> 
> I see it being used by humans, so that brings a lot of subjetivity
> into the matter.  IMO this is not out of place within the build
> system, given that a lot of requirements detected by configure will
> print out their versions (GTK, nettle, spice, etc).

Absolutely, but are we talking about the output printed by
./configure, or about variables in config-host.mak?

config-host.mak is not for humans, it's just input for our
makefile code.  The output printed by ./configure on stdout is
for humans, and I'd agree completely if ./configure keeps
printing full Python version information on stdout.

> [...]
Cleber Rosa Aug. 23, 2019, 5:42 p.m. UTC | #14
On Fri, Aug 23, 2019 at 02:44:15PM +0100, Peter Maydell wrote:
> On Fri, 23 Aug 2019 at 14:41, Cleber Rosa <crosa@redhat.com> wrote:
> > I see it being used by humans, so that brings a lot of subjetivity
> > into the matter.  IMO this is not out of place within the build
> > system, given that a lot of requirements detected by configure will
> > print out their versions (GTK, nettle, spice, etc).
> >
> > But I'm certainly OK with dropping it if no value is perceived by
> > anyone else.
> 
> I'd be happy with keeping it in the human-readable output
> that configure emits: if it's the wrong format there that's
> pretty harmless. But we shouldn't feed it into the makefiles
> unless we really need it, and we shouldn't let the format
> of whatever we do feed into the makefiles be driven by
> the desire to print something human-readable in configure's
> output -- there's no need for the two things to be the
> exact same string.
> 
> thanks
> -- PMM

I couldn't agree more.  The shortcut taken to print both the human
readable version and use that to check the version in the makefile was
unfortunate.

I'll send a fix proposal in a few.

Best,
- Cleber.
Cleber Rosa Aug. 23, 2019, 5:44 p.m. UTC | #15
On Fri, Aug 23, 2019 at 12:04:46PM -0300, Eduardo Habkost wrote:
> On Fri, Aug 23, 2019 at 09:40:54AM -0400, Cleber Rosa wrote:
> > On Thu, Aug 22, 2019 at 06:54:20PM -0300, Eduardo Habkost wrote:
> > > On Thu, Aug 22, 2019 at 05:19:26PM -0400, Cleber Rosa wrote:
> > > > On Thu, Aug 22, 2019 at 05:48:46PM +0100, Peter Maydell wrote:
> > > > > On Fri, 9 Nov 2018 at 15:09, Cleber Rosa <crosa@redhat.com> wrote:
> > > > > >
> > > > > > Some functionality is dependent on the Python version
> > > > > > detected/configured on configure.  While it's possible to run the
> > > > > > Python version later and check for the version, doing it once is
> > > > > > preferable.  Also, it's a relevant information to keep in build logs,
> > > > > > as the overall behavior of the build can be affected by it.
> > > > > >
> > > > > > Signed-off-by: Cleber Rosa <crosa@redhat.com>
> > > > > > ---
> > > > > >  configure | 6 +++++-
> > > > > >  1 file changed, 5 insertions(+), 1 deletion(-)
> > > > > >
> > > > > > diff --git a/configure b/configure
> > > > > > index 74e313a810..67fff0290d 100755
> > > > > > --- a/configure
> > > > > > +++ b/configure
> > > > > > @@ -1740,6 +1740,9 @@ if ! $python -c 'import sys; sys.exit(sys.version_info < (2,7))'; then
> > > > > >        "Use --python=/path/to/python to specify a supported Python."
> > > > > >  fi
> > > > > >
> > > > > > +# Preserve python version since some functionality is dependent on it
> > > > > > +python_version=$($python -V 2>&1 | sed -e 's/Python\ //')
> > > > > > +
> > > > > 
> > > > > Hi. Somebody on IRC has just fallen over a problem where
> > > > > their python's "-V" output prints multiple lines, which
> > > > > means that "$python_version" here is multiple lines, which
> > > > > means that the eventual config-host.mak has invalid syntax
> > > > > because we assume here:
> > > > >
> > > > 
> > > > We've tried a number of things, and just when I thought we wouldn't be
> > > > able to make any sense out of it, I arrived at a still senseless but
> > > > precise reproducer.  TL;DR: it has to do with interactive shells and
> > > > that exact Python build.
> > > > 
> > > > Reproducer (docker may also do the trick here):
> > > > 
> > > >   $ podman run --rm -ti fedora:29 /bin/bash -c 'dnf -y install http://mirror.siena.edu/fedora/linux/releases/29/Everything/x86_64/os/Packages/p/python3-3.7.0-9.fc29.x86_64.rpm; python3 -V'
> > > >   Python 3.7.0 (default, Aug 30 2018, 14:32:33) 
> > > >   [GCC 8.2.1 20180801 (Red Hat 8.2.1-2)]
> > > > 
> > > > With an interactive shell instead:
> > > > 
> > > >   $ podman run --rm -ti fedora:29 /bin/bash -i -c 'dnf -y install http://mirror.siena.edu/fedora/linux/releases/29/Everything/x86_64/os/Packages/p/python3-3.7.0-9.fc29.x86_64.rpm; python3 -V'
> > > >   Python 3.7.0
> > > > 
> > > > How this behavior came to be, baffles me.  But, it seems to be fixed
> > > > on newer versions.
> > > > 
> > > > > > @@ -6823,6 +6826,7 @@ echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
> > > > > >  echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
> > > > > >  echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
> > > > > >  echo "PYTHON=$python" >> $config_host_mak
> > > > > > +echo "PYTHON_VERSION=$python_version" >> $config_host_mak
> > > > > >  echo "CC=$cc" >> $config_host_mak
> > > > > >  if $iasl -h > /dev/null 2>&1; then
> > > > > >    echo "IASL=$iasl" >> $config_host_mak
> > > > > 
> > > > > that it's only one line, and will generate bogus makefile
> > > > > syntax if it's got an embedded newline. (Problem system
> > > > > seems to be Fedora 29.)
> > > > >
> > > > 
> > > > The assumption could be guaranteed by a "head -1", and while
> > > > it's not a failproof solution, it would at least not corrupt
> > > > the makefile and the whole build system.
> > > > 
> > > > > I've reread this thread, where there seems to have been
> > > > > some discussion about just running Python itself to
> > > > > get the sys.version value (which is how we check for
> > > > > "is this python too old" earlier in the configure script).
> > > > > But I'm not really clear why trying to parse -V output is better:
> > > > > it's definitely less reliable, as demonstrated by this bug.
> > > 
> > > Agreed.
> > > 
> > > > >
> > > > > Given that the only thing as far as I can tell that we
> > > > > do with PYTHON_VERSION is use it in tests/Makefile.inc
> > > > > to suppress a bit of test functionality if we don't have
> > > > > Python 3, could we stop trying to parse -V output and run
> > > > > python to print sys.version_info instead, and/or just
> > > > > have the makefile variable track "is this python 2",
> > > > > since that's what we really care about and would mean we
> > > > > don't have to then search the string for "v2"  ?
> > > > 
> > > > Because I've been bitten way too many times with differences in Python
> > > > minor versions, I see a lot of value in keeping the version
> > > > information in the build system.  But, the same information can
> > > > certainly be obtained in a more resilient way.  Would you object something
> > > > like:
> > > > 
> > > >   python_version=$($python -c 'import sys; print(sys.version().split()[0])')
> > > 
> > > Sounds much better, but why sys.version().split() instead of
> > > sys.version_info?
> > > 
> > >   python_version=$($python -c 'import sys; print(sys.version_info[0])')
> > >
> > 
> > I meant to capture not only the major version, but the minor and release
> > as well.  My reasoning (may not appeal more people):
> > 
> >  "Because I've been bitten way too many times with differences in Python
> >   minor versions, I see a lot of value in keeping the version
> >   information in the build system."
> > 
> > > > 
> > > > Or an even more paranoid version?  On my side, I understand the
> > > > fragility of the current approach, but I also appreciate the
> > > > information it stores.
> > > 
> > > We have only one place where $(PYTHON_VERSION) is used, and that
> > > code will be removed once we stop supporting Python 2.  I don't
> > > see the point of trying to store extra information that is not
> > > used anywhere in our makefiles.
> [...]
> > 
> > I see it being used by humans, so that brings a lot of subjetivity
> > into the matter.  IMO this is not out of place within the build
> > system, given that a lot of requirements detected by configure will
> > print out their versions (GTK, nettle, spice, etc).
> 
> Absolutely, but are we talking about the output printed by
> ./configure, or about variables in config-host.mak?
>

Sure, that was a major oversight (or a ill planned shortcut).

> config-host.mak is not for humans, it's just input for our
> makefile code.  The output printed by ./configure on stdout is
> for humans, and I'd agree completely if ./configure keeps
> printing full Python version information on stdout.
> 
> > [...]
> 
> -- 
> Eduardo
> 

Yes, absolutely agree.  I'll send a fix proposal in a few.

Regards!
- Cleber.
diff mbox series

Patch

diff --git a/configure b/configure
index 74e313a810..67fff0290d 100755
--- a/configure
+++ b/configure
@@ -1740,6 +1740,9 @@  if ! $python -c 'import sys; sys.exit(sys.version_info < (2,7))'; then
       "Use --python=/path/to/python to specify a supported Python."
 fi
 
+# Preserve python version since some functionality is dependent on it
+python_version=$($python -V 2>&1 | sed -e 's/Python\ //')
+
 # Suppress writing compiled files
 python="$python -B"
 
@@ -5918,7 +5921,7 @@  echo "LDFLAGS           $LDFLAGS"
 echo "QEMU_LDFLAGS      $QEMU_LDFLAGS"
 echo "make              $make"
 echo "install           $install"
-echo "python            $python"
+echo "python            $python ($python_version)"
 if test "$slirp" = "yes" ; then
     echo "smbd              $smbd"
 fi
@@ -6823,6 +6826,7 @@  echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
 echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
 echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
 echo "PYTHON=$python" >> $config_host_mak
+echo "PYTHON_VERSION=$python_version" >> $config_host_mak
 echo "CC=$cc" >> $config_host_mak
 if $iasl -h > /dev/null 2>&1; then
   echo "IASL=$iasl" >> $config_host_mak