rpmbuild规范文件和rpm - 一些深刻的混淆

时间:2018-06-08 03:42:48

标签: linux centos rpm rpmbuild rpm-spec

我尝试使用rpmbuild执行以下操作。

我有一个预建项目,在一个目录中大约有100个文件,作为tar文件。我想创建一个捆绑这些文件的RPM,当使用rpm -i安装在新机器上时,将解压缩文件,在/ usr / bin下创建一个目录,然后将它们复制到那里。最后,它应该运行一个bash脚本文件。

运行rpmbuild -bs会创建一个SRPM,但是当我尝试使用rpm -i安装它时,没有任何反应。

运行rpmbuild -bb会运行所有步骤 - 配置,构建,安装等,其中大部分都是我不需要的。但是,它不会创建RPM,并且安装步骤是我在目标机器上使用rpm -i时所期望的,而不是在我试图创建RPM的机器上。

我想我错过了一些基本的东西。任何提示?

1 个答案:

答案 0 :(得分:2)

  

运行rpmbuild -bs会创建一个SRPM,但是当我尝试安装它时   使用rpm -i,没有任何反应。

没有。成功安装SRPM会将spec文件和源(包括补丁)安装到RPM构建树中,随时可以使用它构建RPM。但是,根据您构建它的位置以及安装它的人,可能只是用相同的副本覆盖了原始源和规范。 SRPM不是您想要的,但您仍应创建一个以供将来使用。

  

运行rpmbuild -bb运行所有步骤 - 配置,构建,安装,   等等,其中大部分我都不需要。

确定,但您不需要的步骤不必任何事情。听起来你可以使用空的%build scriptlet,并且如果你知道如何,也可以使用空的%prep scriptlet。大多数工作都可以在%install完成,这很好。

  

但是,它不会创建RPM,

那会令人惊讶。你确定你在正确的地方寻找吗?它将进入RPM构建区域中RPMS/的适当的特定于arch的子目录。例如,RPMS/x86_64/mypackage-1.2.3-1.x86_64.rpm

但是,只有rpmbuild成功,当然。由于各种原因,它可能在%install阶段后失败,但如果发生则会发出诊断。

  

并且安装步骤是我期望在目标上发生的   机器,当我使用rpm -i,而不是在我试图创建的机器上   RPM on。

那么,这在一定程度上取决于您如何在规范中编写安装scriptlet。如果您正确地编写它,它将安装要打包的文件到rpmbuild指定给您的临时区域。

  

我想我错过了一些基本的东西。任何提示?

我认为你缺少几个基本的东西:

  1. 构建RPM的规则#1:不要以root用户身份构建RPM!您说安装步骤符合预期rpm -i要做的事情告诉我您违反了这个规则。只有在以root用户身份构建时,rpmbuild才能将文件写入系统目录。

  2. %install scriptlet(您在spec文件中提供)应该将文件写入以rpmbuild提供的构建根为根的文件系统映像,而不是以实际文件系统根为根的主树。 %install scriptlet可以通过%{buildroot}宏或$BUILDROOT shell变量识别构建根。 scriptlet应该创建该目录及其所需的任何子目录,并编写文件以安装那里

  3. 可以提供在程序包安装和/或删除时运行的脚本,这些很常见,但请确保您的程序只能在目标系统上执行,在程序包的文件之后已安装。例如,创建本地用户和配置系统服务。不要使用此类scriptlet执行您可能已经在程序包中烘焙的任何内容,例如设置文件所有权或权限或修改文件。

  4. 总的来说,听起来你想要这些内容:

    Name:           mypackage
    Version:        1.2.3
    Release:        1%{?dist}
    Summary:        My package
    
    License:        proprietary
    Source0:        mypackage-1.2.3.tar.gz
    
    # Only rather old rpmbuild requires you to choose a build root yourself
    # BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
    
    # You probably can let rpmbuild discover the dependencies for you
    # Requires:       
    
    %description
    My cool package.
    
    %prep
    # empty 
    
    %build
    # empty
    
    %install
    # make sure to start clean
    rm -rf %{buildroot}
    
    # Create the buildroot and appropriate directory structure within
    mkdir -p %{buildroot}%{_bindir}
    cd %{buildroot}%{_bindir}
    
    # Unpack the tarball directly into the build root.
    # This is a bit unusual, but it works when your tarball contains pre-built
    # binaries.  The macro %{S:0} refers to source 0.
    tar -xzf %{S:0}
    
    # Optionally move / rename the unpacked directory or its contents    
    mv mypackage-1.2.3 mypackage
    
    %files
    # Installed files will be owned by root:root, but they will have whatever
    # modes they do in the build root:
    %defattr(-,root,root,-)
    
    # Or whatever the install directory was, less the build root portion:
    %{_bindir}/mypackage
    
    %post
    # post-installation script inline here ...
    # Can use the installed files, including running scripts among them.
    # Make sure that this script cannot exit with a nonzero exit status.
    
    %changelog
    * Fri Jun 08 2018 user3587642 <user3587642@mail.com> 1.2.3-1
    - Initial spec