RPM बनाते समय / usr / bin में सिमलिंक बनाना


13

मैं एक ऐसे एप्लिकेशन के लिए RPM बना रहा हूं जिसमें पहले से एक नहीं है। मैंने इसे निर्माण और /optनिर्देशिका में ठीक स्थापित करने का उपयोग कर लिया है $RPM_BUILD_ROOT, लेकिन मैं एक युगल सिम्बलिंक भी बनाना चाहूंगा, /usr/binताकि आवेदन पथ पर उपलब्ध हो। ऐसा करने के मेरे सभी प्रयासों ने "अनुमति से इनकार" त्रुटियों को उत्पन्न किया है क्योंकि मैं rpmbuildएक गैर-रूट उपयोगकर्ता के रूप में चल रहा हूं और इसमें फ़ाइलों को बनाने की अनुमति नहीं है /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_BUILD_ROOT}/%{_bindir}। आप इसके लिए उपयोग कर सकते हैं mkdirया कर सकते हैं install -d।


मैंने अपनी .spec फ़ाइल को मेरे द्वारा सुझाई गई जानकारी के अनुसार संपादित किया और मुझे निम्नलिखित त्रुटि मिल रही है: + ln -sf /opt/bupc2.8/bin/upcc / home / eddale / src / rpm / tmp / berpley_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)।
— बजे क्रिस्टियन सियुपिटु

यही समस्या थी। मैंने अंतिम कार्यशील संस्करण को शामिल करने के लिए प्रश्न को अपडेट किया है। धन्यवाद!
— एडवर्ड डेल

1

macro %{__ln_s} अच्छा भी है

उदाहरण जोड़ने प्रतीकात्मक लिंक पोस्ट स्थापित:

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

उदाहरण निकालें प्रतीकात्मक लिंक की स्थापना रद्द करें:

%postun
rm -f %{_bindir}/exec2

1
एक rpm -U अपग्रेड के दौरान, पुराना rpm% postun निष्पादित करेगा और उस फ़ाइल को नष्ट कर देगा। नए आरपीएम में लिंक नहीं होगा, आपका कोड खराब है।
— ljdelight
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.