[lug] passing config parameters to autoconf during .src.rpm rebuild

Alan Robertson alanr at unix.sh
Sun Aug 18 23:36:37 MDT 2002


Sean Reifschneider wrote:
> On Sat, Aug 17, 2002 at 07:26:35PM -0600, Alan Robertson wrote:
> 
>>My rpms, by contrast, are configured by configure.  These type of RPMs 
>>annoy Rob Riggs ;-).  Hi Rob!
>>
> 
> They also annoy Sean, and I say for good reason.  It sounds like you're
> doing something that at least makes the resulting SRPM duplicate the values
> you entered.  However, an SRPM isn't generated by a --rebuild...

I was hoping for some discussion ;-)

> In my RPMs, I set the user-replacable parts at the top, so the build can
> easily be customized for a few things.  You can also define things from the
> command-line by telling the command-line to evaluate "%define xflags
> --with-user=ups", for example, then:
> 
>    ./configure %{xflags}
> 
> I really don't like this though, because the resulting SRPM, if you do an
> "rpm --rebuild" on it won't produce the same output.

??  Either I don't understand what you're saying, or this isn't true...  The 
spec file is generated by the configure process...

OK... Let me see if I can explain this better...

To make a .src.rpm from source, do one of these:

	./configure foo-options
	make rpm
OR:
	./bootstrap foo-options
	make rpm
OR
	./ConfigureMe rpm

and you'll get src and binary RPMS out of the process.

Once you have a source RPM in your hands, then just do an rpm --rebuild, and 
whatever the person who made your RPM chose for configure flags will get 
propagated into the binary RPM.  No matter what they put into the configure 
options, they propagate into the .src.rpm, and subsequently into the 
generated binary RPMs.

And they stay there through any number of --rebuilds.

Here's the magic line in heartbeat.spec.in:

	./configure @ac_configure_args@

Autoconf replaces the @ac_configure_args@ with whatever arguments it was 
given.  Then, those arguments become part of the .src.rpm.

As a side benefit, this method can do *anything* with the RPM, including 
things you can't do with RPM macros.

 > Therefore, you have
> to remember what options you used to build the code last time, and are kind
> of circumventing one of the benefits that RPM gives you: reproducability.

It's always reproducible.  And it's always flexible.  And you don't have to 
write anything down as long as you don't lose your RPMs.

Once you make that first src RPM, you don't have to remember anything.

If you did something custom, then the next time you make a src RPM from the 
source, then you'll need to know what you did last time.  To find out what 
you did last time, look in your previous generation RPM and see what flags 
you used (they'll be there in the specfile).

If you don't ever want to have to figure anything out or remember anything, 
run the ConfigureMe script.  And, it works correctly on multiple distros 
(basically every RPM-based distro) without any changes.  The same cannot be 
said for a normal RPM.

If you have custom options that you want set for KRUD, we'll gladly put them 
in the ConfigureMe script.

Here's the relevant function from ConfigureMe().
---------------------------------------
ConfigureLinux() {
   DFLAGS=""
   if
     [ -f /etc/UnitedLinux-release -a -s /etc/UnitedLinux-release ]
   then
     distro=UL
     PACKAGECMD="make rpm"
     DFLAGS="--with-ucd-snmp-devel=ucdsnmp --with-group-id=90 
--with-ccmuser-id=90"
   elif
     [ -f /etc/SuSE-release -a -s /etc/SuSE-release ]
   then
     distro=SuSE
     PACKAGECMD="make rpm"
     DFLAGS="--with-ucd-snmp-devel=ucdsnmp --with-group-id=90 
--with-ccmuser-id=90"
   elif
     [ -f /etc/redhat-release -a -s /etc/redhat-release ]
   then
     distro=RedHat
     PACKAGECMD="make rpm"
   elif
     [ -f /etc/conectiva-release -a -s /etc/conectiva-release ]
   then
     distro=Conectiva
     PACKAGECMD="make rpm"
     DFLAGS="--with-group-id=17 --mandir=/usr/share/man 
--infodir=/usr/share/info --with-ccmuser-id=17"
   else
     distro="Generic"
   fi
   CFENV="$distro Linux"
   FLAGS="--prefix=/usr --sysconfdir=/etc --localstatedir=/var $DFLAGS"
}
-------------------------------------

Patches are being accepted  ;-)

This scheme is capable of building non-RPM packages, and also handling 
non-Linux OSes.  And, ignorant users who are running on various distros 
don't have to know anything.  The distro-specific knowledge is in the build 
process.


	-- Alan Robertson
	   alanr at unix.sh




More information about the LUG mailing list