巧用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")}

posted on 2023-04-02 20:58  ddev  阅读(52)  评论(0编辑  收藏  举报