[Rpm-maint] [PATCH] Allow '--short-circuit' for '-bb'
Michal Schmidt
mschmidt at redhat.com
Thu Jun 17 15:50:50 UTC 2010
Short-circuiting has been intentionally only allowed for the %build and
%install stages, but not for the final building of the binary package.
The supposed reason for having this limitation is that it's necessary to
ensure the repeatability of builds.
For instance, Jeff Johnson in 2003 said
(http://www.redhat.com/archives/rpm-list/2003-October/msg00037.html):
> This is a design feature of rpm, guaranteeing that binary packages
> result from a complete build, not from hacking on intermediated stages.
> So, no, there are no plans to implement this (non-) fetaure.
> PITA, yes. But the guarantee is important.
A bit more recently Tom "spot" Callaway supported this view
(http://lists.rpm.org/pipermail/rpm-maint/2008-June/002136.html):
> Hm. FWIW, my opinion is that people shouldn't be short-circuiting
> builds like you're describing, it only opens the door to
> non-reproducable builds. Obviously, others disagree with that. :)
Indeed, there are others who disagree.
I believe the limitation should be removed because:
1. It prevents some valid use-cases.
When developing a patch for a program, it's useful to be able
to test the modified program in the natural environment,
i.e. as it is installed in the system from an RPM package.
The developer often goes through several iterations of the patch
before he gets it right. The necessity to do a full rebuild of the
program on every iteration in order to get the RPM is prohibitively
expensive.
2. It fails to achieve its declared purpose (repeatability of builds).
The source package does not by itself sufficiently define the
conditions for a repeatable build, because a different toolchain
may be used or there are other versions of the build dependencies.
After all, that's why we have mock+Koji and other distributions'
build systems.
3. It breeds ugly workarounds.
In both email threads I referenced there was a post from someone who
suggested a more or less kludgy workaround.
One amazingly efficient and trivial-to-use workaround is even
included in Fedora:
https://admin.fedoraproject.org/pkgdb/acls/name/shortrpm
Take a look at its source if you enjoy nasty LD_PRELOAD tricks.
(No offence meant to Lubomir. I admire his hack and am grateful for
it. And I'm sure he'll be glad when shortrpm will no longer be
necessary.)
4. The danger it's supposed to prevent is overstated.
Distributions do proper builds from sources anyway so they don't have
to care. I don't know who the "many many people who attempt to abuse
it" spot wrote about are. Reasonable people will understand that
they should not publish shorted builds. Malicious people have
zillions of other ways to create trojaned binary RPMs.
Apparently Mandriva has been shipping a similar patch for years (there's
a mention of a "one-liner from Mandrake" in the 2003 thread, and they
still have rpm-4.6.0-rc1-bb-shortcircuit.patch today).
The world failed to end.
BTW, Jeff J. must have changed his mind at some point, because rpm5
allows short-circuiting of -bb.
Michal
---
doc/rpmbuild.8 | 5 +++--
rpmqv.c | 2 ++
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/doc/rpmbuild.8 b/doc/rpmbuild.8
index 6ad5bf1..f2f16f9 100644
--- a/doc/rpmbuild.8
+++ b/doc/rpmbuild.8
@@ -170,8 +170,9 @@ used standalone, eg. "\fBrpmbuild\fR \fB--rmspec foo.spec\fR").
.TP
\fB--short-circuit\fR
Skip straight to specified stage (i.e., skip all stages leading
-up to the specified stage). Only valid with \fB-bc\fR
-and \fB-bi\fR.
+up to the specified stage). Only valid with \fB-bc\fR, \fB-bi\fR
+or \fB-bb\fR. Useful for local testing only. Packages built this
+way should not be distributed.
.TP
\fB--sign\fR
Embed a GPG signature in the package. This signature can be used
diff --git a/rpmqv.c b/rpmqv.c
index be2707c..6104e2f 100644
--- a/rpmqv.c
+++ b/rpmqv.c
@@ -660,6 +660,8 @@ int main(int argc, char *argv[])
case 'b':
ba->buildAmount |= RPMBUILD_PACKAGEBINARY;
ba->buildAmount |= RPMBUILD_CLEAN;
+ if ((ba->buildChar == 'b') && ba->shortCircuit)
+ break;
case 'i':
ba->buildAmount |= RPMBUILD_INSTALL;
ba->buildAmount |= RPMBUILD_CHECK;
More information about the Rpm-maint
mailing list