来自多个进程的管道输入

来自多个进程的管道输入

我正在尝试自动化一些 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)。

相关内容