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

问题描述 投票:4回答:4

我有点新的写作规范文件和建筑RPM的。目前,我有一个应该在1 2的目录可能会与操作系统部署变化的一些文件一个RPM。

我怎么能中,%文件部分中,验证它们?我无法使用可变...我不能确认这两个路径,因为一个将肯定失败......我试图定义一个宏早些时候%安装部分,但它只会被定义一次,并且不会被重新定义每个RPM安装...

我该怎么办吗?

谢谢

rpmbuild specifications
4个回答
2
投票

%files部分可以有变量的原因,但通常这会是这样的一个定义,这样你就不必重复了一堆你的路径。所以%{long_path}/file_name,其中long_path先前在规范文件中定义。该%files部分是所有进入RPM数据库中的信息,当你创建RPM,所以你将无法安装时改变基于机器信息,这些值被创建。

如果你真的想这样做,你可能包括被提取取决于一定的条件下主压缩档内tar文件(因为该规范文件仅仅是bash)的。现在,请记住,这是一个可怕的想法。这些文件不会被RPM数据库进行跟踪,所以当你删除这些文件仍然会存在RPM。

在现实中,你应该建立两个RPM,这将允许更好地支持前进到未来,你必须交出这一关的人的事件,以及从现在保存一年你自己的理智,当你需要更新RPM。


3
投票

我曾在那里的其他文件中列入了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

你的情况,您可以利用%,如果有条件的安装%部分,使用OS传递给rpmbuild一个规范变量(或检测到它在RPM规范本身),然后通过文件,其中包含列表中%files


1
投票

阿甘建议最好的解决办法,但如果这是不可能的实际,您可以在安装后的部分在运行时检测到操作系统版本,将脚本到适当的位置,然后将其删除,卸载后,如:

# 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容易,但会变得更好一点,如果你需要支持许多不同的操作系统。


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

© www.soinside.com 2019 - 2024. All rights reserved.