6

我对编写规范文件和构建 RPM 有点陌生。目前,我有一个 RPM,它应该在 2 个可能的目录中的 1 个中部署一些文件,这些目录会因操作系统而异。

我如何在 %files 部分中验证它们?我不能使用变量...我无法验证这两个路径,因为一个肯定会失败...我尝试在 %install 部分的前面定义一个宏,但它只会定义一次并且不会重新定义在每个 RPM 安装...

我能在这里做什么?

谢谢

4

4 回答 4

4

我遇到过类似的情况,即在 DEBUG 构建的情况下,RPM 中包含了额外的文件,而不是 RELEASE 构建中的所有文件。

诀窍是将文件列表传递给 %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

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

于 2014-01-30T14:10:47.710 回答
2

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

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

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

于 2013-09-10T05:32:54.133 回答
2

这就是我解决问题的方法

步骤1 :

   In Build section .. somewhere I wrote :
 %build
  .....
  #check my condition here & if true define some macro
  %define is_valid %( if [ -f /usr/bin/myfile ]; then echo "1" ; else echo "0"; fi )
 #after his normal continuation
 .....
 ...

第 2 步:在安装部分

  %install
  ......
  #do something in that condition
  if %is_valid
  install -m 0644 <file>
  %endif
  #rest all your stuff
  ................

第 3 步:在文件部分

   %files
   %if %is_valid 
   %{_dir}/<file>
   %endif

而已

有用。

PS:我不能给你完整的代码,因此给出所有有用的片段

于 2015-02-05T12:43:24.470 回答
1

Forrest 建议了最好的解决方案,但如果这不可行,您可以在安装后部分在运行时检测操作系统版本,将脚本移动到适当的位置,然后在卸载后将其删除,例如:

# rpm spec snippets
%define OS_version %(hacky os detection)
...
Source2: script.sh
...
%install
install %{_sourcedir}/script.sh %{buildroot}/some/known/location
...
%post

%if %{OS_version} == "..."
  mv /some/known/location/script.sh /distro/specific/script.sh
%elif %{OS_version} == "..."
...

%preun
rm -rf /all/script/locations

比在不同的操作系统上构建不同的 RPM 更容易出错,但如果您需要支持许多不同的操作系统,则可以更好地扩展。

于 2013-10-30T21:57:32.980 回答