我是一个新的编写规范文件和构建RPM的人。目前我有一个RPM应该在两个可能的目录中的一个中部署一些文件,这些目录会因操作系统而异。
如何在%files部分中验证它们?我不能使用变量...我无法验证两个路径,因为一个肯定会失败...我试图在%install部分中更早地定义一个宏,但它将只定义一次并且不会被重新定义在每个RPM安装......
我能在这做什么?
由于
答案 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:我不能给你完整的代码,因此给出了所有有用的代码片段