Створення символьного посилання в / usr / bin при створенні RPM


13

Я створюю RPM для додатка, у якого його ще немає. У мене це складання та встановлення в /optкаталозі чудово за допомогою $RPM_BUILD_ROOT, але я також хотів би створити пару символьних посилань, /usr/binщоб програма була доступна на шляху. Усі мої спроби зробити це призвели до помилок "відмовлено у дозволі", тому що я працюю rpmbuildяк користувач, що не має права root, і в ньому не дозволяється створювати файли /usr/bin/.

Ось мій поточний файл .spec:

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

Відповіді:


6

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

Посилання має бути створене в %buildрозділі, і воно також повинно вказувати, де ви встановлюєте RPM.

Перш ніж створити посилання, переконайтеся, що існує каталог призначення, тобто ${RPM_BUILD_ROOT}/%{_bindir}. Ви можете використовувати mkdirабо install -dдля цього.


Я змінив файл .spec відповідно до того, що, на вашу думку, ви запропонували, і я отримую таку помилку: + ln -sf /opt/bupc2.8/bin/upcc / home / eddale / src / rpm / tmp / berkeley_upc-root / usr / bin ln: створення символічного посилання /home/eddale/src/rpm/tmp/berkeley_upc-root/usr/bin' to /opt/bupc2.8/bin/upcc ': Немає такого файлу чи каталогу
Едвард Дейл

Я думаю, що вам потрібно створити каталог призначення, тобто /home/.../usr/bin. Ось як я це роблю: github.com/ciupicri/rpmbuild/blob/master/SPECS/… (рядок 36).
Крістіан Ciupitu

У цьому і була проблема. Я оновив питання, щоб містити остаточну робочу версію. Спасибі!
Едвард Дейл

1

macro %{__ln_s} добре також

Приклад додавання символьної посилання встановити:

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

приберіть видалення символічного посилання:

%postun
rm -f %{_bindir}/exec2

1
Під час оновлення rpm -U старий rpm виконає% postun та знищить цей файл. Новий rpm не матиме посилання, ваш код поганий.
ljdelight
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.