我正在为尚未创建 RPM 的应用程序创建 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
答案1
ln -sf /opt/bupc2.8/bin/upcc ${RPM_BUILD_ROOT}/%{_bindir}
链接需要在部分中创建%build
,并且还需要指向您所在的位置安装转速。
在创建链接之前,请确保目标目录存在,即${RPM_BUILD_ROOT}/%{_bindir}
。您可以使用mkdir
或install -d
来实现这一点。
答案2
macro %{__ln_s}
也很好
例如安装后添加符号链接:
%post
%{__ln_s} -f %{_bindir}/exec %{_bindir}/exec2
删除符号链接卸载示例:
%postun
case "$1" in
0) # last one out put out the lights
rm -f %{_bindir}/exec2
;;
esac
该case
语句确保仅在卸载时删除该文件,而不会在升级、降级或重新安装时删除该文件。%postun
旧软件包的 RPM 运行后 %post
对于新包(即使是相同的版本)。