我对构建二进制 RPM 的安装步骤有点困惑。我认为安装步骤旨在在用户安装二进制包 .rpm 时运行。
我尝试在gitlab上打包一个仓库,这个打包很简单,编译安装一个.so
为了构建包,我执行以下操作:
rpmbuild -bb ~/rpmbuild/SPECS/libinput-config.spec
该进程运行 spec 文件的 %install 部分。
这个上游包确实通过 meson 安装,因此我有
%install
%meson_install
上游的安装过程将编译后的 .so 复制到某个位置,然后运行一个名为的脚本。preload.sh
该脚本对一个路径进行硬编码,可在 PRELOAD 变量中看到:
#!/bin/sh
LIB="${1}/${2}.so"
PRELOAD='/etc/ld.so.preload'
if test -z $(grep ${LIB} ${PRELOAD} 2> /dev/null); then
echo ${LIB} >> ${PRELOAD}
fi
当我运行rpmbuild -bb ~/rpmbuild/SPECS/libinput-config.spec
它时,由于权限问题而失败,因为它正在执行脚本preload.sh
。我不介意权限问题,因为我不认为应该rpmbuild -bb
在我的系统上实际安装任何东西。
但这意味着我不明白该%install
部分应该何时执行。
我希望用 -bb 构建一个二进制包来执行上游包的构建过程,到达 .so,然后收集它并将其存储在二进制文件中。
然后,当用户安装该软件包时,rpm 将使用二进制 rpm 的内容运行安装过程。
为什么rpmbuild -bb
尝试运行 %install 部分?
编辑看来我应该更改自定义介子安装脚本来执行以下操作:
PRELOAD="${DESTDIR}/etc/ld.so.preload"
meson 确保 DESTDIR 位于自定义脚本的环境中,并且似乎 rpm 宏 %meson_install 设置了这个变量。
我必须etc
在 buildroot 中创建目录
%install
mkdir -p $RPM_BUILD_ROOT/etc
%meson_install
答案1
我认为安装步骤设计为在用户安装二进制包 .rpm 时运行。
该%install
部分在安装 .rpm 时不运行。它在 RPM 构建期间运行。它更像是构建的一个阶段。其中有一些命令,用于将文件安装到 ,这$RPM_BUILD_ROOT
或多或少是一个临时目录,您可以在构建期间将文件安装到该目录中。
随后,您将看到%files
列出要打包到实际 .rpm 中的文件的部分。这些文件是在此%install
阶段安装到 RPM 构建根目录中的文件。
您想要在最终用户安装 .rpm 时运行程序/脚本。脚本都是为此而设计的。
%post
if [ $1 == 1 ];then
/path/to/preload.sh arg1 arg2 ...
fi