宏定义保护
类似 %if 0%{?suse_version}
这样的语法,前面的 0
的用法其实与 shell 中的 if [ x$i = x ]; then ... fi
类似,就是为了避免变量 i
没定义时报错。
预定义宏
$ rpm -ql rpm | grep macros
/usr/lib/rpm/macros
/usr/lib/rpm/macros.d
/usr/lib/rpm/platform/aarch64-linux/macros
...
/usr/lib/rpm/platform/x86_64-linux/macros
/usr/share/doc/rpm-4.11.3/macros
$ ll /etc/rpm/
total 132
-rw-r--r--. 1 root root 170 Mar 9 2019 macros.blender
-rw-r--r--. 1 root root 1470 Nov 5 2016 macros.cmake
-rw-r--r--. 1 root root 53 Apr 11 2018 macros.cups
-rw-r--r--. 1 root root 66 Oct 8 2018 macros.dist
-rw-r--r--. 1 root root 1806 Apr 13 2018 macros.dwz
-rw-r--r--. 1 root root 324 Sep 20 2017 macros.emacs
-rw-r--r--. 1 root root 13543 Nov 21 2015 macros.fjava
-rw-r--r--. 1 root root 2673 Jan 25 2014 macros.gconf2
-rw-r--r--. 1 root root 215 Apr 13 2018 macros.ghc-srpm
-rw-r--r--. 1 root root 227 Apr 13 2018 macros.gnat-srpm
-rw-r--r--. 1 root root 4700 Nov 21 2015 macros.jpackage
-rw-r--r--. 1 root root 105 Apr 13 2018 macros.mono-srpm
-rw-r--r--. 1 root root 228 Apr 13 2018 macros.nodejs-srpm
-rw-r--r--. 1 root root 115 Apr 13 2018 macros.ocaml-srpm
-rw-r--r--. 1 root root 5134 Mar 2 2017 macros.perl
-rw-r--r--. 1 root root 794 Jun 10 2014 macros.perl-srpm
-rw-r--r--. 1 root root 2336 Nov 6 2016 macros.pesign
-rw-r--r--. 1 root root 297 Nov 6 2016 macros.prelink
-rw-r--r--. 1 root root 886 Oct 14 00:03 macros.pybytecompile
-rw-r--r--. 1 root root 3348 Oct 14 00:03 macros.python
-rw-r--r--. 1 root root 1495 Oct 14 00:03 macros.python2
-rw-r--r--. 1 root root 1839 Oct 14 00:03 macros.python3
...
$ cat /usr/lib/rpm/macros | grep ___build_pre
%___build_pre \
%{___build_pre}\
%__spec_prep_pre %{___build_pre}
%__spec_build_pre %{___build_pre}
%__spec_install_pre %{___build_pre}
%__spec_check_pre %{___build_pre}
#%__spec_autodep_pre %{___build_pre}
%__spec_clean_pre %{___build_pre}
%__spec_rmbuild_pre %{___build_pre}
without
为 rpmbuild 增加 --without tcmalloc
选项:
%bcond_without tcmalloc
如果在 rpmbuild 时不指定,则默认增加 tcmalloc 支持。
with
为 rpmbuild 增加 --with tcmalloc
选项:
%bcond_with tcmalloc
如果在 rpmbuild 时不指定,则默认移除 tcmalloc 支持。
if/else/endif
在 spec 正文中可以以如下的方式使用条件构建:
%if %{with selinux}
...
%else
...
%endif
查询 BuildRequires
$ rpmspec -q --buildrequires ceph.spec
$ rpmspec -q --srpm --requires ceph.spec
$ rpmspec --parse ceph.spec 2>/dev/null | grep BuildRequires
比如为了安装 ceph 的构建依赖,可以使用如下的命令:
$ sed -e 's/@//g' < ceph.spec.in > ceph.spec
$ sed -i -e 's/%bcond_with make_check/%bcond_without make_check/g' ceph.spec
$ sudo yum install -y --skip-broken $(rpmspec --parse ceph.spec 2>/dev/null | grep BuildRequires | awk '{ print $2 }' | xargs)
禁止修改源代码属性
// rpm/build/parsePrep.c
doSetupMacro
/* Fix the permissions of the setup build tree */
{ char *fix = rpmExpand("%{_fixperms} .", NULL);
if (fix && *fix != '%') {
appendLineStringBuf(spec->prep, fix);
}
free(fix);
}
$ rpm --eval %{_fixperms}
/usr/bin/chmod -Rf a+rX,u+w,g-w,o-w
$ rpmbuild -ba --define "_topdir ${BUILDAREA}" --define "dist ${DIST}" --define "_fixperms %{nil}"
参考资料
Scriptlets
https://docs.fedoraproject.org/en-US/packaging-guidelines/Scriptlets/
Some tips on RPM conditional macros
https://backreference.org/2011/09/17/some-tips-on-rpm-conditional-macros/
Automatic Dependencies
http://ftp.rpm.org/max-rpm/s1-rpm-depend-auto-depend.html
Manual Dependencies
http://ftp.rpm.org/max-rpm/s1-rpm-depend-manual-dependencies.html
Upgrade paths — renaming or splitting packages
https://fedoraproject.org/wiki/Upgrade_paths_%E2%80%94_renaming_or_splitting_packages
RPM Packaging Guide
https://rpm-packaging-guide.github.io/
rpm documentation
https://rpm.org/documentation.html
Maximum RPM
http://ftp.rpm.org/max-rpm/index.html
RPM to parse BuildRequires from .spec
https://bugzilla.redhat.com/show_bug.cgi?id=540807
EXTRACING RPM BUILD DEPENDENCIES FROM RPM SPEC FILES
https://www.terriblecode.com/blog/extracing-rpm-build-dependencies-from-rpm-spec-files/
how to override rpm macro
https://serverfault.com/questions/217640/how-to-override-rpm-macro
RPM packager’s cheat sheet
https://ro-che.info/articles/2018-01-25-rpm-packager-cheat-sheet
What is a Dependency, Anyway
https://weldr.io/RPM-Dependencies/
Dependencies
https://rpm.org/user_doc/dependencies.html
Dnf ignore weak dependencies
https://bgstack15.wordpress.com/2017/05/13/dnf-ignore-weak-dependencies/
rpm: use Recommends on fedora also
https://github.com/ceph/ceph/pull/26819
最后修改于 2019-02-01