我必须为一些驱动程序构建一个rpm包。 我需要从 .tar.gz 存档构建 rpm。 tar 球还包含 .spec 文件。 我已经按照此处所述设置了 rpmbuild 环境:http://wiki.centos.org/HowTos/SetupRpmBuildEnvironment
我的目录结构是这样的:
/home/rpmbuild
/home/rpmbuild/BUILD
/home/rpmbuild/RPMS
/home/rpmbuild/SOURCES
/home/rpmbuild/SPECS
/home/rpmbuild/SRPMS
.tar.gz 文件包含spec 文件并放置在/home/rpmbuild/SOURCES 中
如果我导航到该目录并运行以下命令,rpm 包将正确构建,但放置在 /root/rpmbuild/RPMS 而不是 /home/rpmbuild/RPMS (我期望的位置)。
sudo rpmbuild -ta driver.tar.gz
我认为这是因为我使用 sudo 运行 rpmbuild。 我的想法正确吗? 有没有办法让它在 /home/rpmbuild 中构建?
我知道以 root 身份使用 rpmbuild 是不好的做法,但如果我不以 root 身份运行它,我会遇到许多错误(没有权限访问 root 拥有的目录 - 例如 /tmp/orbit-root)。 似乎更改每个目录的权限比将它们更改回来要困难得多。
这是解决这个问题的正确方法吗? 我非常感谢您的帮助。
不要使用以下命令为 rpm 创建安装树:
rpmdev-setuptree
使用以下命令在要构建 rpm 的位置创建 rpm 树:
mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
现在,将文件夹中的相应文件复制为 specs 和 tar.gz 并在 rpmbuild 目录中运行以下命令:
rpmbuild --define "_topdir `pwd`" -v -ba SPECS/{*spec_file.specs*}
非特权用户应该有权访问
BUILDROOT
。我会检查 .rpmmacros
内的 $HOME/rpmbuild
文件,它定义了您的顶级目录在哪里。
我已经像这样设置了我的
.rpmmacros
:
%packager YourName
%_topdir /home/build/rpmbuild
%_tmppath /home/build/rpmbuild/tmp
如果您需要对系统目录的非root写入权限, 那么您的
%install
scriptlet 未安装到 %{buildroot}
。
您需要修补您的版本才能安装到
%{buildroot}
。
对于 autoconf 生成的 Makefiles,通常这样做
make DESTDIR=%{buildroot} ...
为了使构建文件远离默认位置,我通过使用
--root
选项来指定不同的构建根目录 rpmbuild
:
rpmbuild --root /home/rpmbuild -ta driver.tar.gz
它将将该目录视为总根目录并尝试使用
/home/rpmbuild/root/rpmbuild/{BUILDROOT,RPMS}
和 /home/rpmbuild/root/rpmbuild/var/tmp
。 您可能需要在调用命令之前创建后者。您可以通过在 /root/
命令前添加 rpmbuild
来删除名称中的 HOME=""
部分。