.pyc files

Nalin Dahyabhai nalin at redhat.com
Tue Apr 20 00:23:15 UTC 2004


On Mon, Apr 19, 2004 at 07:26:35PM +0200, Jos Vos wrote:
> I have serious doubts about compiling Python code in brp-... scripts.
> Shouldn't this be under direct control (only) of the %build phase?

It's difficult (if not impossible) to get right in the %build phase.
When you byte-compile a python script, among the things recorded in the
.pyc or .pyo file are the timestamp of the corresponding .py file, and
the path to that file.  The python interpreter uses the timestamp to
determine when a file needs to be recompiled, and the path when
constructing error messages.

If you byte-compile in %build, and then install in %install, you may
change the timestamp on the .py file, which breaks the whole thing.  If
you byte-compile in the %install phase, you have to fixup the paths if
you don't want error messages to refer to %{_tmppath}/.../*.py when an
error is detected.

The first problem is subtle, because it triggers recompiles on a
deployed system, but if you don't use a program you never notice it.
(If you *do* use a program, you unexpectedly fail RPM verifications and
get SELinux access-denied messages here and there.)  The second one just
happens when the packager doesn't know that it's a potential problem
because it's a not-well-publicized part of Packaging Lore.

A fix for both is to use python's compileall module at the end of the
%install phase to go through and recompile all of the .py files in the
buildroot with the right options to fix the second problem, fixing the
first problem as a sort of side-effect.

By now you've probably guessed where I'm going with this -- which is to
say that that's precisely what the brp script we're discussing does.

Nalin





More information about the fedora-devel-list mailing list