[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

More dh_python questions



Hi,

        Digging into the current dh_python, I have come across
 behaviour that I can't explain, related to the handling of the -V
 flag. Take the case of private pure Python modules. Suppose I have
 two packages, python-foo and python-bar. In python-foo, I call
 dh_python -V X.Y, which means that the .py files are meant to be
 handled by a specific version of python, namely pythonX.Y. Suppose,
 in python-bar, I instead set XS-Python-Version to X.Y, which means
 only pythonX.Y is supported.

        First question: is  XS-Python-Version a mandatory field under
 policy? It should be, as we can see below, but currently Python
 policy does not say so.

        I posit that in either case it has been specified that only
 version X.Y of python is supported -- but the behaviour of dh_python
 is different.

,----
| Package: python-foo
| Depends:  pythonX.Y
| XB-Python-Version: X.Y
| Provides: pythonX.Y-foo
`----

,----
| Package: python-bar
| XB-Python-Version: X.Y
| Provides: pythonX.Y-bar
`----

        Why are we not getting a Depends line in python-bar even
 though XS-Python-Version states only one version of python is
 supported? If we had python-baz, an extension module, which has
 XS-Python-Version: X.Y , we would get:

,----
| Package: python-baz
| XB-Python-Version: X.Y
| Provides: pythonX.Y-baz
| Depends: python (>= X.Y), python (<< X.Y+1)
`----

        which makes sense.  In other words, for private extension
 modules, we ensure that only one version of python is supported, and
 no other, but we don't do so for private pure python modules

        Analysis of code follows.

        Take chunk One. See how either $deps is modified, or
 $verdeps{$usepython} is set, depending on whether or not -V flag was
 used? 
----------------------------------------------------------------------
291     if (/\.py$/ and $private_pydirs_regex and $fn =~ m/(?:$private_pydirs_regex)/) {
292       # Private python module
293       verbose_print("Found private module: $fn");
294       my $dir;
295       foreach $dir (@dirs) {
296         if ($fn =~ m/\Q$dir\E/) {
297           $dir =~ s/^$tmp//;
298           verbose_print("Memorizing dir to byte-compile: $dir");
299           $private_dirs_list{"$dir"} = 1;
300         }
301       }
302       if ($dh{V_FLAG_SET}) {
303         $verdeps{$usepython} |= PY_PRIVATE_MODULE;
304       } else {
305         $deps |= PY_PRIVATE_MODULE;
306       }
307     } elsif (/\.so$/ and $private_sodirs_regex and $fn =~ m/(?:$private_sodirs_regex)/) {
----------------------------------------------------------------------

        Next up: we add to depends for pure python modules, but only if
 -V had been called above.
----------------------------------------------------------------------
374   # Common dependency handling
375   foreach my $pyver (keys %verdeps) {
 ...
380     # Always add pythonX.Y dependency if some private modules are
381     # byte-compiled with it (or if extensions are
382     # byte-compiled with it)
383     if ($verdeps{$pyver} & (PY_PRIVATE_MODULE|SO_PRIVATE_MODULE)) {
384       addsubstvar($package, "python:Depends", $pyver);
385     }
386   }
----------------------------------------------------------------------

        If we had not used -V, however, we get this: We set the
 variable versions_field, either to current, or the contents of
 XS-Python-Version. In the case of bar, we get X.Y.
----------------------------------------------------------------------
424     # Private modules 
425     if ($deps & PY_PRIVATE_MODULE) {
426       # Package with private modules can only support one version at a time
427       # (even if the modules can be automatically byte-compiled for any new
428       # python version).
429       unless ($versions_field) {
430         # Unless min/max are the same we put "current"
431         if ($min_version and ($min_version eq $max_version)) {
432           $versions_field = $min_version;
433         } else {
434           $versions_field = "current";
435         }
436       }
437     }
----------------------------------------------------------------------

        What is done with that variable?
----------------------------------------------------------------------
445     if (scalar keys %pyversions_found) {
...
471     } else {
472       # Still try to describe the versions that the package support
473       $versions_field = $python_header unless $versions_field;
474       $versions_field = "all" unless $versions_field;
475       addsubstvar($package, "python:Versions", $versions_field);
476 
477       # Generate provides for all python versions supported
478       if ($package =~ /^python-/) {
479         foreach (grep { $officially_supported{$_} } @versions) {
480           my $virtual = $package;
481           $virtual =~ s/^python-/$python$_-/;
482           addsubstvar($package, "python:Provides", $virtual);
483         }
484       }
485     }
----------------------------------------------------------------------
    Hmm, python_header is initialized from XS-Python-Version, which,
 if it were mandatory, would mean that we would get X.Y in either
 case. So, we get a XB-Python-Version, and we get a Provides, in
 either case. But if  XS-Python-Version is missing from python-foo, we
 would get a XB-Python-Version: all and no provides, even though we
 told dh_python that only one version of python can run our .py files.

        manoj
-- 
Trying to break out of the Tempter's control, one's mind writhes to
and fro, like a fish pulled from its watery home onto dry ground. 34
Manoj Srivastava   <srivasta@debian.org>  <http://www.debian.org/%7Esrivasta/>
1024D/BF24424C print 4966 F272 D093 B493 410B  924B 21BA DABB BF24 424C



Reply to: