无法从spec文件中生成rpm:文件未找到错误

时间:2016-09-28 09:47:18

标签: rpm rpmbuild

我有一个预制的目录结构,我想从中获取rpm。 在我的spec文件中,我指定了要包含在rpm中的该目录结构中的所有文件,并且在执行rpmbuild时,我将buildroot设置为(从我可以告诉的)正确的目录:

%files
/usr/local/bin/test/Test
/usr/local/bin/test/something.awk
/usr/share/snmp/mibs
/etc/init.d/test

我的rpmbuild命令如下所示:

rpmbuild --rmspec --buildroot=bin/<files dir> -bb bin/tmp.spec

buildroot目录和&amp;我的spec文件的位置是相对的。 目录结构如下所示:

/home/<me>/Projects/<project>/ <-- I execute rpmbuild from here
/home/<me>/Projects/<project>/bin/tmp.spec
/home/<me>/Projects/<project>/bin/<files dir>/ <-- All files/directories mentioned in spec file reside here
/home/<me>/Projects/<project>/bin/<files dir>/usr/local/bin/test/Test
/home/<me>/Projects/<project>/bin/<files dir>/usr/local/bin/test/something.awk
/home/<me>/Projects/<project>/bin/<files dir>/usr/share/snmp/mibs/ <-- directory with a few MIB files, which I all want to include
/home/<me>/Projects/<project>/bin/<files dir>/etc/init.d/test

但是,执行rpmbuild命令时会出现以下错误:

Processing files: <rpm>
error: File not found: /bin/<files dir>/usr/local/bin/test/Test
error: File not found: /bin/<files dir>/usr/local/bin/test/something.awk
error: File not found: /bin/<files dir>/usr/share/snmp/mibs
error: File not found: /bin/<files dir>/etc/init.d/test


RPM build errors:
    File not found: /bin/<files dir>/usr/local/bin/test/Test
    File not found: /bin/<files dir>/usr/local/bin/test/something.awk
    File not found: /bin/<files dir>/usr/share/snmp/mibs
    File not found: /bin/<files dir>/etc/init.d/test

规范文件不包含任何%prep,%build或%install指令,因为在构建rpm文件之前预先制作了完整的文件结构。 我确信这是一件小事,我错过了,我怀疑这是一个rpmbuild使用不同于我指定的目录的情况。 我一直在玩buildroot&amp; _topdir指令,包括相对和&amp;绝对路径,但无济于事......

1 个答案:

答案 0 :(得分:3)

在我看来,你对buildroot的语义感到困惑。 --buildroot选项和%{buildroot}宏指向构建根。让我详细说明一下:

%install部分,您位于提取源代码的目录中(这已由%setup部分中的%prep宏完成)。现在您应该在构建根目录中创建文件/目录结构。所以:

%install
install -d %{buildroot}/usr/local/bin/test/
cp -a something.awk  %{buildroot}/usr/local/bin/test/

这假设something.awk位于Source0的tar.gz文件中,并且它位于该存档的根目录中(该存档中没有前导路径)。

始终定义

%buildroot。通常是~/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.$arch的形式。当您使用示例中的--buildroot=bin/<files dir>选项覆盖它时,%install中的上一个脚本会将something.awk复制到'bin // usr / local / bin / test / something.awk'中。哪个不是错误本身,但也没有意义。如果您之前将文件复制到./bin目录中,那么您应该知道%{buildroot}部分之前通常会擦除%install。因此,您必须在本节中将这些文件复制到'%{buildroot}中。

那么错误的原因是什么?当你说:

%files
/usr/local/bin/test/something.awk

然后rpmbuild查找文件%{buildroot}/usr/local/bin/test/something.awk。它不存在所以rpmbuild产生“找不到文件”。所以你显然错过了%install部分中的操作。如果你在那里添加它,那么它将工作。您也可以省略--buildroot选项。