我有一个非常简单的tar.gz文件,我想用RPM包安装Java文件。我创建了这个spec文件:
Name: test
Version: 1.0
Release: 1%{?dist}
Summary: test installation script
Group: Utilities
License: GPL
URL: http://oracle-base.com/articles/linux/linux-build-simple-rpm-packages.php
Source0: test-1.0.tar.gz
BuildArch: x86_64
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
#BuildRequires:
#Requires:
%description
test installation script
%prep
%setup -c /opt/test
%build
#%%configure
#make %{?_smp_mflags}
%install
rm -rf $RPM_BUILD_ROOT
#make install DESTDIR=$RPM_BUILD_ROOT
#install -d $RPM_BUILD_ROOT/opt/agent
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root,-)
%doc
%changelog
我不清楚如何配置应该提取目标文件的目标目录。你能告诉我我失踪的是什么吗?
答案 0 :(得分:2)
RPM包的构建过程应该在构建目录中完全运行,不以任何方式触及主机系统。
所以%setup -c /opt/test
不正确,因为它在主机系统中创建了一个目录。相反,您应该只使用%setup -q
并让默认宏在默认构建目录中提取源tarball。 (如果你的tarball不包含顶层目录,也就是它是一个“tar-bomb”,那么你可以使用-c
标志和相对路径来创建当前目录中的顶层目录。
如果您没有任何资源来构建,那么您根本不需要%build
部分。
%install
部分旨在将文件从本地构建目录复制到buildroot下的最终目录。因此(如在该链接指南中),它应该将文件复制到$RPM_BUILD_ROOT/opt/test
或$RPM_BUILD_ROOT
下适当的任何其他路径。
那些路径(没有$RPM_BUILD_ROOT
前缀)是需要在%files
部分列出的内容。
Fedora项目在构建RPM时some documentation可能对您有用。 Maximum RPM这本书虽然陈旧且有点过时,但它仍然是一个很好的信息来源。
答案 1 :(得分:2)
另一个答案已经解释了%setup -c命令的问题,以及构建RPM的一般原则。
我将添加以下内容,这可能有助于您了解RPM构建脚本应如何工作:
%install
rm -rf $RPM_BUILD_ROOT
#make install DESTDIR=$RPM_BUILD_ROOT
上面的代码片段,来自骨架规范文件,为您提供了一个很大的线索。你应该在这里做的是在$ RPM_BUILD_ROOT下创建一个安装映像。
因此,如果你想在/ opt / test中安装文件,你可能想做类似的事情:
%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/opt/test/bin
cp <something> $RPM_BUILD_ROOT/opt/test/bin/something
RPM构建脚本应该在$ RPM_BUILD_ROOT下创建基本上是安装映像的内容。 rpm然后打包它,并生成二进制可安装rpm文件,安装$ RPM_BUILD_ROOT的内容。
您还需要一个%files部分列出所有已安装的单个文件,作为完整性检查。 rpm将仅打包$ RPM_BUILD_ROOT中列出的文件。
因此,您的一般准则是:
在设置部分中,将tarball解压缩到当前工作目录中。 rpm为构建创建一个临时目录。默认情况下,%setup将解压缩那里的文件。
在安装部分中,将您想要的内容从当前工作目录复制到$ RPM_BUILD_ROOT。这将成为安装映像。