$RPM_BUILD_ROOT != %{buildroot} (was:Re: Prelink success story :))

Lamar Owen lowen at pari.edu
Fri Feb 27 05:20:14 UTC 2004


On Thursday 26 February 2004 5:19 pm, Michael Schwendt wrote:
> Again, $RPM_BUILD_ROOT is preferred at fedora.us as long as it is
> described as the "official supported" mechanism on getting access to
> buildroot.

FWIW %{buildroot} and $RPM_BUILD_ROOT are not the same due to the way macros 
are processed.  IIRC, the build/install scriptlets can modify $RPM_BUILD_ROOT 
internally, but, again IIRC %{buildroot} gets the expanded buildroot not as 
an environment variable. In fact, a %dump reveals a couple of sets of 
definitions (for different uses: $RPM_BUILD_ROOT could vary between 
scriptlets depending upon you rpmmacros):
You find in __build_pre:

%{?buildroot:RPM_BUILD_ROOT="%{u2p:%{buildroot}}"
  export RPM_BUILD_ROOT}

But in _preScriptEnvironment it's:

%{?buildroot:RPM_BUILD_ROOT="%{buildroot}"
export RPM_BUILD_ROOT
}
meaning that $RPM_BUILD_ROOT is derived from %buildroot.  

So the scriptlets cannot mung with the buildroot if you use %{buildroot}, but 
you can if you use $RPM_BUILD_ROOT (which means you can fix a bad buildroot 
using the envvar).  Macro definitions/redefinitions are not part of the 
scriptlet, of course (just like C preprocessor directives are not part of the 
actual C code).

Now, you CAN mung with %{buildroot} elsewhere, but that's beyond this.  You 
just can't do it programmatically during build script execution.  Some would 
say that's a good thing; others would vehemently disagree.

However, if you need to use the value of buildroot in a macro definition you 
probably should use %buildroot, a'la %makeinstall (whose definition uses 
nearly as many %{buildroot}'s as it does {} pairs).  Of course, there are 
exceptions to this; as long as you realize that the macro definition is 
substituted into the script as a string you can use envvars inside the macro 
definition, but the interpretation is up to the host scriptlet. %mdkicons for 
instance uses $RPM_BUILD_ROOT inside the macro.  But a definition using 
%{buildroot} results in the static string that is the buildroot, and using 
the envvar results in the envvar, which might not be what it needs to be....

Of course, I do reserve the right to be wrong, but I think I verified this 
insome test specs I built up a long time ago.

The point is that the $RPM_BUILD_ROOT recommendation isn't even consistently 
followed in the rpmmacros definitions themselves, meaning that every spec 
file is using a willy-nilly mix of %{buildroot} and $RPM_BUILD_ROOT even if 
those strings do not appear in your spec file itself.  Thus the 
recommendation and checklist item is totally redundant and really deserves to 
be removed, Jeff's comments notwithstanding.  If and when Jeff actually 
changes ${buildroot} basic core rpm build macros will break, and break badly, 
so the likelihood of that change happening is somewhere between slim and 
none, and Slim just left town.  Of course, Jeff has surprised us 
before... :-)

Each have their uses, and the spec file maintainer may intend %{buildroot} 
where it is specified; and $RPM_BUILD_ROOT might be better for another.  But 
it is obvious that %{buildroot} is a little (marginally) easier to type and 
read.
-- 
Lamar Owen
Director of Information Technology
Pisgah Astronomical Research Institute
1 PARI Drive
Rosman, NC  28772
(828)862-5554
www.pari.edu





More information about the devel mailing list