【发布时间】:2014-04-29 17:25:28
【问题描述】:
我正在从单一来源构建一系列 rpm,并且只想构建子包;即我不想创建一个空的主包,只创建子包。
我该怎么做?它是 rpmbuild 开关还是我放入规范文件的东西?
谢谢
【问题讨论】:
标签: rpmbuild
我正在从单一来源构建一系列 rpm,并且只想构建子包;即我不想创建一个空的主包,只创建子包。
我该怎么做?它是 rpmbuild 开关还是我放入规范文件的东西?
谢谢
【问题讨论】:
标签: rpmbuild
通常您通过没有“%files”部分来做到这一点。只有 '%files subpackage' 部分应该出现在规范文件中。
背景: '%files' 部分生成主 RPM。 '%files' subpackage 部分生成子包 RPM。
【讨论】:
%files 部分。
简短的回答,rpmbuild 不直接允许这样做,即使有可能,就减少构建时间而言,它不会真正为您带来太多好处。 rpm 规范文件中的%build 部分对子包一无所知,因此无论如何它都会构建所有内容。子包仅在%files 部分中发挥作用(除了元数据,如 Requires、Provides 等),其中 rpmbuild 用于知道哪个子包应该发送已在%buildroot 中适当构建和安装的文件。所以本质上你还不如从 SRPM 构建整套包并删除你不需要的包。
如果您的问题是您想缩短构建时间,您可以首先在您正在编译的软件包的构建脚本中引入支持,以仅选择性地构建软件包的子集(即make library 、make 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/
【讨论】:
你能发布你的规范文件吗?我使用子包,它从不构建主包。这些是我在规范中放入的字段(在 %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
【讨论】:
这不是您必须在规范中添加的内容,而是您必须省略的内容。我不确定您必须省略哪些字段,但我怀疑它是主包的 %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
【讨论】: