[Rpm-maint] Reworking pythondeps.sh to support multiple parallel Python stacks

David Malcolm dmalcolm at redhat.com
Fri Oct 30 18:12:34 UTC 2009


(Further work towards support deploying multiple python versions via RPM
on one machine)

rpm.org's scripts/pythondeps.sh can be used to autogenerate Provides and
Requires items of the form:
   python(abi) = ${PYVER}
where PYVER is of the form MAJOR.MINOR

"pythondeps.sh" can take a list of buildroot paths as lines on stdin and
generate the "python(abi) = foo" line on stdout.

As I understand things, it's invoked due to these lines in
macros/macros.in:
%__python_provides %{_rpmconfigdir}/pythondeps.sh --provides
%__python_requires %{_rpmconfigdir}/pythondeps.sh --requires
(which is invoked by rpmfcHelper/rpmfcGenerateDepends in build/rpmfc.c
when "_use_internal_dependency_generator" is enabled)

Incidentally, my reading of the above code [1] is that only files that
are categorized as python files get passed to the script.  Since the
python binary is not a python file, it's not passed to the script, so
the provides line is never generated.  In Fedora's "python.spec" we get
around this by manually supplying a couple of provides:
  Provides: python-abi = %{pybasever}
  Provides: python(abi) = %{pybasever}

The current implementation invokes "python" to determine PYVER.  This
assumes that /usr/bin/python is actually installed in the environment,
which isn't the case when rebuilding a "python" rpm in a clean
environment (e.g. mock chroot).

Attached is a reimplementation of the code which allows for multiple
python implementations and removes the assumption that /usr/bin/python
is installed (although in Fedora we don't actually use this for the
provides case as described above).

The code assumes that Python binaries are of the form
    /usr/bin/pythonMAJOR.MINOR
and generate "provides" items of the form
    python(abi) = MAJOR.MINOR

Python libraries are assumed to be of the form
    /usr/lib/pythonMAJOR.MINOR/  and
    /usr/lib64/pythonMAJOR.MINOR/ 
generating (uniquely) lines of the form:
    python(abi) = MAJOR.MINOR    

Examples:
$ echo "/home/david/rpmbuild/BUILDROOT/python3-3.1.1-7.fc11.i386/usr/bin/python3.1" \
  | ./pythondeps.sh --provides
Output: python(abi) = 3.1
(though this path is never actually passed; see note above)

$ echo "/home/david/rpmbuild/BUILDROOT/python3-3.1.1-7.fc11.i386/usr/bin/python3.1-config" \
  | ./pythondeps.sh --provides
(no output)

$ echo "/home/david/rpmbuild/BUILDROOT/python3-3.1.1-7.fc11.i386/usr/lib/python3.1/test/test_bisect.py" \
  | ./pythondeps.sh --requires
Output: python(abi) = 3.1

Thoughts?

Dave
[1] plus adding a "tee -a /tmp/whatever" to the file to capture it, for
playback into my test scripts

-------------- next part --------------
A non-text attachment was scrubbed...
Name: pythondeps.sh
Type: application/x-shellscript
Size: 874 bytes
Desc: not available
URL: <http://lists.rpm.org/pipermail/rpm-maint/attachments/20091030/b75b94aa/attachment.bin>


More information about the Rpm-maint mailing list