【问题标题】:How do I make rpmbuild only build subpackages?如何使 rpmbuild 仅构建子包?
【发布时间】:2014-04-29 17:25:28
【问题描述】:

我正在从单一来源构建一系列 rpm,并且只想构建子包;即我不想创建一个空的主包,只创建子包。

我该怎么做?它是 rpmbuild 开关还是我放入规范文件的东西?

谢谢

【问题讨论】:

    标签: rpmbuild


    【解决方案1】:

    通常您通过没有“%files”部分来做到这一点。只有 '%files subpackage' 部分应该出现在规范文件中。

    背景: '%files' 部分生成主 RPM。 '%files' subpackage 部分生成子包 RPM。

    【讨论】:

    • 这是这里唯一正确的答案。为避免构建主包,只需省略主包的 %files 部分。
    【解决方案2】:

    简短的回答,rpmbuild 不直接允许这样做,即使有可能,就减少构建时间而言,它不会真正为您带来太多好处。 rpm 规范文件中的%build 部分对子包一无所知,因此无论如何它都会构建所有内容。子包仅在%files 部分中发挥作用(除了元数据,如 Requires、Provides 等),其中 rpmbuild 用于知道哪个子包应该发送已在%buildroot 中适当构建和安装的文件。所以本质上你还不如从 SRPM 构建整套包并删除你不需要的包。

    如果您的问题是您想缩短构建时间,您可以首先在您正在编译的软件包的构建脚本中引入支持,以仅选择性地构建软件包的子集(即make librarymake documentation 等)。然后,您可以使用条件宏 [1] 将规范文件的某些部分括起来,然后从命令行定义这些宏:

    rpmbuild -ba --define '_build_library' somespecfile.spec
    

    那么,例如,specfile 中的类似内容应该可以工作:

    [...]
    
    %if 0%{?_build_library:1}
    Package libs
    Summary: Libraries for %{name}
    %description libs
    Libraries for %{name}
    %endif
    
    %if 0%{?_build_docs:1}
    Package docs
    Summary: Documentation for %{name}
    %description docs
    Documentation for %{name}
    %endif
    
    [...]
    
    %build
    %if 0%{?_build_library:1}
    make libs
    %endif
    
    if 0%{?_build_docs:1}
    make docs
    %endif
    
    
    %install
    %if 0%{?_build_library:1}
    %make_install libs
    %endif
    
    if 0%{?_build_docs:1}
    %make_install docs
    %endif
    
    
    %if 0%{?_build_library:1}
    %files libs
    %{_libdir}/*.so*
    %endif
    
    if 0%{?_build_docs:1}
    %files docs
    %doc doc/html
    %endif
    

    不用说这不是非常优雅。

    [1]http://backreference.org/2011/09/17/some-tips-on-rpm-conditional-macros/

    【讨论】:

      【解决方案3】:

      你能发布你的规范文件吗?我使用子包,它从不构建主包。这些是我在规范中放入的字段(在 %prep 之前):

      Name: xxx 
      Version: %{_version}.%{_build}
      Release: %{_drop}
      Summary: xxx
      Group: Applications/Communications
      License: xxx
      URL: xxx
      BuildArch: x86_64
      
      Requires: jpackage-utils
      Requires: java
      
      Distribution: CentOS Linux
      Vendor: xxx
      Packager: xxx
      
      %description
      xxx
      

      【讨论】:

        【解决方案4】:

        这不是您必须在规范中添加的内容,而是您必须省略的内容。我不确定您必须省略哪些字段,但我怀疑它是主包的 %scriptlets 和 %files。

        以下规范构建了两个子包,没有根包:

        Summary : subpackage only rpms
        Name    : root
        Version : 0.0.1
        Release : 1
        License : Whatever
        Group   : Whatever
        URL     : http://stackoverflow.com/questions/22574102/how-do-i-make-rpmbuild-only-build-subpackages
        
        %description
        
        %prep
        %build
        %install
        touch $RPM_BUILD_ROOT/subpackage-{1,2}
        
        %package subpackage-1
        Summary : subpackage-1
        %description subpackage-1
        %files subpackage-1
        /subpackage-1
        
        %package subpackage-2
        Summary : subpackage-2
        %description subpackage-2
        %files subpackage-2
        /subpackage-2
        

        【讨论】:

          猜你喜欢
          • 2013-11-12
          • 2012-09-13
          • 2011-07-13
          • 1970-01-01
          • 2014-04-14
          • 2013-01-03
          • 2014-06-27
          • 2019-04-30
          • 2018-05-11
          相关资源
          最近更新 更多