[rpm] Correct way of writing spec file when packaging symlinks
Panu Matilainen
pmatilai at laiskiainen.org
Mon Oct 20 07:31:13 UTC 2014
On 10/19/2014 01:16 AM, Domen Vrankar wrote:
> I also have one further question.
>
> I was reading this stack overflow thread
> (http://stackoverflow.com/questions/7521980/packaging-symlinks-via-rpmbuild)
> and began to wonder if it is better to write spec file this way:
>
> |%install
> rm -rf %{buildroot}
> mkdir %{buildroot}
> ln -sf /foo/bin %{buildroot}/bar/newbin
>
> %files
> /newbin
> |
>
> Or is it better to put symlink creation in %post section:
>
> %post|
> ln -sf /foo/bin /bar/newbin|
As a rule of thumb, when possible its always better to package than do
things in install scriptlets.
>
> The problem that I'm having is that I can not create a relocatable rpm
> with either of the above options. If I use --prefix= during installation
> then the first option points to an invalid location and the second
> option fails with an error during installation but the rpm still gets
> installed so both cases fail but make some changes to file system.
...but relocation eliminates the "when possible" out of the picture.
> Can either of these options be made relocatable?
> For e.g. is there a variable that can be used in second case (something
> like |ln -sf %{foo_prefix}||/bin |||%{bar_prefix}|/newbin so
> %{foo_prefix} and %{bar_prefix} get changed during rpm installation
> depending on specified prefixes?
Those macros are expanded at the time of package build, whereas
relocation is done at install-time. Relocations are passed to scriplets
via RPM_INSTALL_PREFIX[n] environment variables (where n >= 0).
- Panu -
> 2014-10-18 23:34 GMT+02:00 Domen Vrankar <domen.vrankar at gmail.com
> <mailto:domen.vrankar at gmail.com>>:
>
> Hi,
>
> I was searching the web and couldn't find an answer on how to
> correctly write a spec file when packaging symlinks.
>
> One option that I found was
>
> %config /path/symlink
>
> and the other was simply
>
> /path/symlink
>
> Based on Documentation
> http://www.rpm.org/max-rpm/s1-rpm-inside-files-list-directives.html
> am I correct in assuming that the second version (without any %
> prefix) is the correct format?
Well that depends on what you want. Symlinks can be marked %config, but
%config files have different semantics. If you have a symlink that is
created or altered in install-time scriptlets, its probably best to
package it as a %ghost (so it doesn't actually get packaged at all, but
is considered owned and will be removed with the package):
%ghost /path/symlink
or at least tell rpm not to verify the link target, eg
%verify(not link) /path/symlink
> Is there any difference in prefix if symlink points to directory or
> file?
Yes there is, because those target are entirely different beasts.
Symlinks to directories are generally considered equal to the target
directory by rpm, rather than the symlink (known as "fingerprinting" in
rpm jargon). These constructs are not problematic in itself, but they
are hard to change on package upgrades and because of that, often best
avoided. Symlinks to files are not special in rpm though.
- Panu -
More information about the Rpm-list
mailing list