如果条件在SPEC文件的%Files部分中

cjd*_*iro 5 specifications rpmbuild

我是编写规范文件和构建RPM的新手。目前,我有一个RPM,应该将某些文件部署在2个可能的目录中的1个中,这些目录会随操作系统的不同而不同。

如何在%files部分中验证它们?我不能使用变量...我无法验证两个路径,因为肯定会失败...我试图在%install部分的较早位置定义一个宏,但该宏只会被定义一次,不会被重新定义在每个RPM安装上...

我在这里可以做什么?

谢谢

dot*_*fix 5

我遇到过类似的情况,即在 RELEASE 构建中的所有文件之上进行 DEBUG 构建时,RPM 中包含其他文件。

技巧是将文件列表及其下面的常规文件列表传递给 %files:

%install
# Create a temporary file containing the list of files
EXTRA_FILES=$RPM_BUILD_ROOT/ExtraFiles.list
touch %{EXTRA_FILES}

# If building in DEBUG mode, then include additional test binaries in the package
%if %{build_mode} == "DEBUG"
# %{build_mode} is a variable that is passed to the spec file when invoked by the build script
# Like: rpmbuild --define "build_mode DEBUG"
echo path/to/file1 > %{EXTRA_FILES}
echo path/to/file2 >> %{EXTRA_FILES}
%endif

%files -f %{EXTRA_FILES}
path/to/release/file1
path/to/release/file2
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您可以利用 %install 部分中的 %if 条件,使用操作系统作为传递给的规范变量rpmbuild(或在 RPM 规范本身中检测它),然后将包含列表的文件传递给%files


For*_*est 3

%files部分可以包含变量,但通常这将类似于您定义的路径,因此您不必多次重复它。so %{long_path}/file_name,其中 long_path 是先前在规范文件中定义的。该%files部分是进入 RPM 数据库的所有信息,并且是在构建 RPM 时创建的,因此您无法在安装时根据计算机信息更改这些值。

如果您确实想这样做,您可以在主 tarball 中包含一个 tar 文件,该文件根据某些条件提取(因为规范文件只是 bash)。现在请记住,这是一个糟糕的主意。RPM 数据库不会跟踪这些文件,因此当您删除 RPM 时,这些文件仍然存在。

实际上,您应该构建两个 RPM,这将在您必须将其交给某人的情况下为将来提供更好的支持,并在一年后您需要更新 RPM 时保持自己的理智。

  • 您可以在 RPM 中设置一个 if 条件,以了解在 RPM 本身构建期间进入 %files 部分的内容,但这在安装时不起作用。该文件列表基本上是静态的。您还会遇到这样的问题:您会收到一条错误消息,指出 RPM 找到了文件(在构建期间),但它们已解包(因为它们位于您的 tarball 中,但由于您的 if 原因而未在 %files 部分中声明)陈述)。一般来说,我会尽量避免这样做。 (2认同)