巧用rpmbuild的expand宏实现模板功能
需求:构建生成的二进制包的个数不确定,由某些条件决定。
比如,我们想为系统中的所有内核版本构建某个外来模块,如果系统中有2个内核版本,就生成两个2个二进制包,分别对应相应的版本,如果系统中有3个内核版本,就生成3个二进制包。
我们的需求是实现动态个数的%package
。
很多人在讨论spec是不是一种脚本,很显然不是,它本身没有变量,也不支持循环。但是是支持条件判断的,也支持自定义宏。
回到正题,如果以其它编程语言的逻辑来看,貌似需要的功能是一个变量和若干次循环。但是在spec文件中,就得想另外的办法了。
expand,展开,其实相当于二次执行,类似于bash的eval。它将展开的内容作为spec文件的一部分。
我们就利用bash的循环功能,构建动态个数的%package
。
下面给出一个demo,可以根据构建时传入的宏来生成不同个数的二进制包。
rpmbuild -D "packages a b c" -bb SPECS/test.spec
将生成test-a、test-b、test-c三个二进制包。
%{!?packages: %define packages a}
Name: test
Version: 1.0
Release: 1
Summary: test
License: GPL
%description
test
%install
for sub in %packages; do
touch %{buildroot}/$sub
done
%{expand:%(/bin/bash -c "for sub in %packages; do
cat <<EOF
%package \$sub
Summary: \$sub
%description \$sub
%files \$sub
/\$sub
EOF
done")}