为什么要在RPM规范文件中使用%files指令,以及如何在该部分中自动执行文件列表?

问题描述

为什么需要%files,为什么不能通过列出$RPM_BUILD_ROOT目录内容自动创建它?
例如,在该规范文件中,我必须在脚本中使用一些修改,从而为我构建一个RPM包。我必须cd进入~/RPM/SOURCES,然后在其中find .,并将echo的每一行插入.spec文件中,以设置%files部分。该工具可以使用与后台相同的技术自动执行此操作,但可以从$RPM_BUILD_ROOT目录执行该操作吗?

%install
mkdir -p $RPM_BUILD_ROOT/opt/MyCompany/MyProduct/
cp -rf -- ~/RPM/SOURCES/* $RPM_BUILD_ROOT/opt/MyCompany/MyProduct/

%files
/opt/MyCompany/MyProduct/file_1
/opt/MyCompany/MyProduct/file_2
/opt/MyCompany/MyProduct/file_3
... - a lot of lines here
/opt/MyCompany/MyProduct/file_100000

UPD
是的,可以自动使用所有复制的文件(文档http://ftp.rpm.org/max-rpm/s1-rpm-inside-files-list-directives.html
就我而言,%files可以这样重写

%files
/opt/MyCompany/MyProduct/*

它将从$RPM_BUILD_ROOT/opt/MyCompany/MyProduct获取文件,因此要使用star,我们需要省略$RPM_BUILD_ROOT%{buildroot}的构建根(这是rpm搜索文件IIUC的认路径)

解决方法

为什么需要%file,为什么不能通过列出自动创建它 $ RPM_BUILD_ROOT目录内容?

通常一个规范文件会创建多个(子)程序包-然后还会 multiple %files sections are needed

即使存在一些自动%file section generators, NB有 %files -f option, 通常,无法自动拆分文件。

值得一提的是,大多数软件包维护者都不维护软件 源代码,但仅打包“上游”版本。如果%files部分 而是手动维护(与通配符模式相反), 软件包维护者可以控制一切,因为他是 通知有关软件安装布局的更改(例如,当新 文件出现在具有新版本的/usr/bin中,rpmbuild开始抱怨 有一个新的“未打包”文件,请参见下文)。

该工具可以使用我在 后台,但是从$ RPM_BUILD_ROOT目录中获取?

您甚至不必手动运行find。只要%install创建 $ RPM_BUILD_ROOT中的文件,如果您未在%files中提及它们-您将获得报告 像这样:

$ rpmbuild -bb *.spec
...
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/user/rpmbuild/BUILDROOT/test-1-1.x86_64
error: Installed (but unpackaged) file(s) found:
   /usr/bin/not-packaged

RPM build errors:
    Installed (but unpackaged) file(s) found:
   /usr/bin/not-packaged

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...