我正在尝试自动化一些 make 命令。除了目标之外,我们还有一个传递给 make 的变量(对应于#ifdef
代码中的一组 a )。
make 命令如下所示:
make <target> <MYCDEF=val>
val
可以采用多个值(MYCDEF_VAL1,MYCDEF_VAL2...)。
target
也可以采用多个值,例如:安卓手臂,windows_x86,linux_x64ETC。
这MYCDEF_VALn可以从a找到config.h
我们在哪里检查
#elif (defined MYCDEF_VALn)
这样,我就能得到所有MYCDEF价值观使用gawk -f script1 config.h
脚本1:
{
if(/defined.*MYCDEF_/)
{
k=index($0, "MYCDEF_");
print substr($0, k, index($0, ")")-k) #all lines of type defined(MYC_DEF_VALn)
}
}
要获得所有目标,我可以阅读Makefile
使用gawk -F: -f script2 Makefile
脚本2:
{if(/^[A-Za-z0-9_]+:$/) print $1}
为所有人打造MYCDEF_具有一个目标的 vals 我可以通过管道传输第一个脚本的输出(使用config.h
):
gawk -f script1 config.h | xargs -I {} -n 1 make -kj windows_x86 MYCDEF={}
同样,对于所有具有 1 的目标MYCDEF_val,我可以从第二个脚本进行管道传输(使用 Makefile)。
gawk -f script2 Makefile| xargs -I {} -n 1 make -kj {} MYCDEF=MYCDEF_VAL1
现在,我们希望以以下所有价值观来构建MYCDEF_对于所有目标。可以使用 for 循环来完成:
for i in $(gawk -f script2 Makefile)
do
gawk -f script1 config.h | xargs -I {} -n 1 make -kj $i MYCDEF={}
done
有这个的单线吗?
答案1
使用 GNU 并行:
parallel -j1 make -kj {1} MYCDEF={2} :::: <(gawk -f script2 Makefile) <(gawk -f script1 config.h)
-j1
强制 GNU Parallel 以串行方式运行作业(鉴于您运行的命令,这可能是您想要的make
)。