我有点新的写作规范文件和建筑RPM的。目前,我有一个应该在1 2的目录可能会与操作系统部署变化的一些文件一个RPM。
我怎么能中,%文件部分中,验证它们?我无法使用可变...我不能确认这两个路径,因为一个将肯定失败......我试图定义一个宏早些时候%安装部分,但它只会被定义一次,并且不会被重新定义每个RPM安装...
我该怎么办吗?
谢谢
该%files
部分可以有变量的原因,但通常这会是这样的一个定义,这样你就不必重复了一堆你的路径。所以%{long_path}/file_name
,其中long_path先前在规范文件中定义。该%files
部分是所有进入RPM数据库中的信息,当你创建RPM,所以你将无法安装时改变基于机器信息,这些值被创建。
如果你真的想这样做,你可能包括被提取取决于一定的条件下主压缩档内tar文件(因为该规范文件仅仅是bash)的。现在,请记住,这是一个可怕的想法。这些文件不会被RPM数据库进行跟踪,所以当你删除这些文件仍然会存在RPM。
在现实中,你应该建立两个RPM,这将允许更好地支持前进到未来,你必须交出这一关的人的事件,以及从现在保存一年你自己的理智,当你需要更新RPM。
我曾在那里的其他文件中列入了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
阿甘建议最好的解决办法,但如果这是不可能的实际,您可以在安装后的部分在运行时检测到操作系统版本,将脚本到适当的位置,然后将其删除,卸载后,如:
# 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步 :
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:我不能给你完整的代码,因此给所有有用的片段