[Python-modules-team] Bug#643873: Bug#643873: Making Numpy transition less painful

Jakub Wilk jwilk at debian.org
Mon Oct 31 21:07:25 UTC 2011


* Sandro Tosi <morph at debian.org>, 2011-10-31, 19:57:
>>Dependencies generated by dh_numpy
>>==================================
>>dh_numpy would generate dependency either on "python-numpy-abi$N" (by 
>>default) or on "python-numpy-api$N" (if a special option, say, 
>>--strict, is used).

I just realized that, in order to make packages using Cython happy, the 
first one will have to be:

"python-numpy-abi$N, python-numpy (>= $V)"

where $V is the first version with the current API. [0]

>>The second option would be needed for packages which are overzealous 
>>at checking ABI unless/until we fix them (we have at least one package 
>>in the archive which does that).

[1]

>do you think it's possible for the same source package to generate 2 
>binaries one needing python-numpy-abi$N and the other needing 
>python-numpy-api$N ?

It'd quite crazy, but in theory, yes, that could happen.

>how would you imagine to handle this? with "dh_numpy -pbin1 
>--strict\ndh_numpy -pbin2"

Exactly.

>>Avoiding strict dependencies for arch:all packages
>>==================================================
>>dh_numpy should not generate any dependencies in arch:all packages. 
>>Such packages cannot rely on Numpy ABI, and rebuilding them for 
>>transition purposes is causes lot of trouble. (We already had to do 
>>this in the past!) For the same reason, 
>>/usr/share/python/dist/python-numpy needs to go away.
>
>so just a python-numpy added to python:Depends?

I was rather thinking about not touching such packages at all. But 
adding unversioned python-numpy to ${python:Depends} would work, too.

>how does it fix with a source that generates an arch:all and an 
>arch:any (the latter using either -abi or -api)?

dh_numpy would generate different substitutions for each of them. I 
don't see any problem here.

>>Gracefully handling the upcoming transition
>>-------------------------------------------
>>A number of packages in the archive already has dependency on 
>>"python-numpy (<< 1:1.6)", which is not satisfiable by the package in 
>>experimental. To avoid this transition (or at least reduce its size) 
>>we could do one of two things:
>>1) Implement the proposed changes first in unstable, schedule binNMUs, 
>>then upload Numpy 1.6 to unstable.
>>2) Implement the proposed changes only for Numpy 1.6, but make 
>>dh_numpy generate alternative versioned dependencies:
>>"python-numpy (>= 1:1.5.1), python-numpy-abi$N | python-numpy (<< 1:1.6.2)".
>>Then upload Numpy 1.6, schedule binNMUs.
>
>Mh, my lazy instinct would say 2) that has also the advantage to bring
>1.6 into unstable (but I guess 1.7 is coming soon).

Yeah, that option sounded very appealing, but turned out not feasible 
after all. See my comment about Cython at the top of this mail.  
C_API_VERSION has been bumped from 4 to 6, so $V should be at least >= 
1:1.6.

>Please also note taht my perl foo is barely None, so I'd need some help 
>in extending dh_numpy :)

No problem, I can do the coding part once we agree how everything should 
work. :)


[0] Cython generates this code for importing C types:

|    if (!strict && ((PyTypeObject *)result)->tp_basicsize > (Py_ssize_t)size) {
|        PyOS_snprintf(warning, sizeof(warning),
|            "%s.%s size changed, may indicate binary incompatibility",
|            module_name, class_name);
|        #if PY_VERSION_HEX < 0x02050000
|        if (PyErr_Warn(NULL, warning) < 0) goto bad;
|        #else
|        if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad;
|        #endif
|    }
|    else if (((PyTypeObject *)result)->tp_basicsize != (Py_ssize_t)size) {
|        PyErr_Format(PyExc_ValueError,
|            "%s.%s has the wrong size, try recompiling",
|            module_name, class_name);
|        goto bad;
|    }

That is, import will fail if the size imported type is shorter at 
runtime that at build time.


[1] Pyrex (and very old versions of Cython) generates this code for 
importing C types:

|     if (((PyTypeObject *)result)->tp_basicsize != size) {
|         PyErr_Format(PyExc_ValueError,
|             "%s.%s does not appear to be the correct type object",
|             module_name, class_name);
|         goto bad;

So import will fail with exception if the size imported type is 
different at runtime that at build time.

-- 
Jakub Wilk





More information about the Python-modules-team mailing list