Création d'un lien symbolique dans / usr / bin lors de la création d'un RPM

13

Je crée un RPM pour une application qui n'en a pas déjà. Je l'ai construit et installé correctement dans le /optrépertoire en utilisant $RPM_BUILD_ROOT, mais je voudrais également créer quelques liens symboliques /usr/binafin que l'application soit disponible sur le chemin. Toutes mes tentatives pour ce faire ont généré des erreurs "autorisation refusée" car je suis en cours rpmbuildd' exécution en tant qu'utilisateur non root et il n'est pas autorisé à créer des fichiers dans /usr/bin/.

Voici mon fichier .spec actuel:

Summary: Berkeley UPC
Name: berkeley_upc
Version: 2.8.0
Release: 1
Source0: %{name}-%{version}.tar.gz
License: GPL
Group: Development/Tools
BuildRoot: %{_builddir}/%{name}-root
Prefix: /opt/bupc2.8
Prefix: /usr

%description
Berkeley UPC on the BASS for the comp633 class.

%prep
%setup -q

%build
./configure CC=gcc44 CXX=g++44 --disable-aligned-segments --prefix=/opt/bupc2.8
make %{_smp_mflags}

%install
rm -rf $RPM_BUILD_ROOT
make DESTDIR=$RPM_BUILD_ROOT install

mkdir -p ${RPM_BUILD_ROOT}%{_bindir}
mkdir -p ${RPM_BUILD_ROOT}%{_mandir}/man1

ln -sf /opt/bupc2.8/bin/upcc          ${RPM_BUILD_ROOT}%{_bindir}
ln -sf /opt/bupc2.8/bin/upcc_multi    ${RPM_BUILD_ROOT}%{_bindir}
ln -sf /opt/bupc2.8/bin/upcc_multi.pl ${RPM_BUILD_ROOT}%{_bindir}
ln -sf /opt/bupc2.8/bin/upcdecl       ${RPM_BUILD_ROOT}%{_bindir}
ln -sf /opt/bupc2.8/bin/upcrun        ${RPM_BUILD_ROOT}%{_bindir}
ln -sf /opt/bupc2.8/bin/upc_trace     ${RPM_BUILD_ROOT}%{_bindir}

ln -sf /opt/bupc2.8/man/man1/upcc.1      ${RPM_BUILD_ROOT}%{_mandir}/man1
ln -sf /opt/bupc2.8/man/man1/upcdecl.1   ${RPM_BUILD_ROOT}%{_mandir}/man1
ln -sf /opt/bupc2.8/man/man1/upcrun.1    ${RPM_BUILD_ROOT}%{_mandir}/man1
ln -sf /opt/bupc2.8/man/man1/upc_trace.1 ${RPM_BUILD_ROOT}%{_mandir}/man1

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
/opt/bupc2.8
%config /opt/bupc2.8/etc
%config /opt/bupc2.8/opt/etc

%{_bindir}/upcc
%{_bindir}/upcc_multi
%{_bindir}/upcc_multi.pl
%{_bindir}/upcdecl
%{_bindir}/upcrun
%{_bindir}/upc_trace

%{_mandir}/man1/upcc.1.gz
%{_mandir}/man1/upcdecl.1.gz
%{_mandir}/man1/upcrun.1.gz
%{_mandir}/man1/upc_trace.1.gz
Edward Dale
la source

Réponses:

6

ln -sf /opt/bupc2.8/bin/upcc ${RPM_BUILD_ROOT}/%{_bindir}

Le lien doit être créé dans la %buildsection et il doit également pointer vers l'endroit où vous installez le RPM.

Avant de créer le lien, assurez-vous que le répertoire de destination existe, c'est-à-dire ${RPM_BUILD_ROOT}/%{_bindir}. Vous pouvez utiliser mkdirou install -dpour cela.

Cristian Ciupitu
la source
J'ai modifié mon fichier .spec selon ce que je pense que vous avez suggéré et j'obtiens l'erreur suivante: + ln -sf /opt/bupc2.8/bin/upcc / home / eddale / src / rpm / tmp / berkeley_upc-root / usr / bin ln: création d'un lien symbolique /home/eddale/src/rpm/tmp/berkeley_upc-root/usr/bin' to /opt/bupc2.8/bin/upcc ': aucun fichier ou répertoire de ce type
Edward Dale
Je pense que vous devez créer le répertoire de destination, c'est-à-dire /home/.../usr/bin. Voici comment je le fais: github.com/ciupicri/rpmbuild/blob/master/SPECS/… (ligne 36).
Cristian Ciupitu
C'était ça le problème. J'ai mis à jour la question pour contenir la version finale de travail. Merci!
Edward Dale
1

macro %{__ln_s} c'est bien aussi

exemple ajouter un lien symbolique après l'installation:

%post
%{__ln_s} -f %{_bindir}/exec %{_bindir}/exec2

exemple de désinstallation d'un lien symbolique:

%postun
rm -f %{_bindir}/exec2
tuxnux
la source
1
Lors d'une mise à niveau rpm -U, l'ancien rpm exécutera le% postun et détruira ce fichier. Le nouveau rpm n'aura pas de lien, votre code est mauvais.
ljdelight