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

时间:2013-09-09 15:27:56

标签: rpmbuild specifications

我是一个新的编写规范文件和构建RPM的人。目前我有一个RPM应该在两个可能的目录中的一个中部署一些文件,这些目录会因操作系统而异。

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

我能在这做什么?

由于

4 个答案:

答案 0 :(得分:3)

我遇到类似的情况,如果在RELEASE版本中的所有文件之上构建DEBUG,则RPM中会包含其他文件。

诀窍是将文件列表传递给%文件以及它下面的常规文件列表:

%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

答案 1 :(得分:2)

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

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

实际上你应该构建两个RPM,如果你不得不把这个转发给某个人,这将有助于更好地支持未来,并且在你需要更新的一年后保持自己的理智RPM。

答案 2 :(得分:1)

Forrest建议使用最佳解决方案,但如果实际上不可行,您可以在安装后部分检测操作系统版本,将脚本移动到适当的位置,然后在卸载后将其删除,例如:< / p>

# 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更容易出错,但如果需要支持许多不同的操作系统,则会更好地扩展。

答案 3 :(得分:1)

这就是我解决问题的方法

第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:我不能给你完整的代码,因此给出了所有有用的代码片段