Pipe

來自多個程序的管道輸入

  • October 3, 2019

我正在嘗試自動化一些 make 命令。除了目標,我們還有一個傳遞給 make 的變數(對應#ifdef於程式碼中的 a 集合)。

make 命令如下所示:

make <target> <MYCDEF=val>

val可以取多個值(MYCDEF_VAL1MYCDEF_VAL2 …)。

target也可以採用多個值,例如:android_armwindows_x86linux_x64等。

可以從我們檢查的地方找到MYCDEF_VALn****config.h

#elif (defined MYCDEF_VALn)

所以,我可以使用所有MYCDEFgawk -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_ val建構,我可以通過管道傳輸第一個腳本的輸出(使用**config.h**):

gawk -f script1 config.h | xargs -I {} -n 1 make -kj windows_x86 MYCDEF={}

同樣,對於具有一個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

有一個oneliner嗎?

使用 GNU 並行:

parallel -j1 make -kj {1} MYCDEF={2} :::: <(gawk -f script2 Makefile) <(gawk -f script1 config.h)

-j1強制 GNU Parallel 串列執行作業(這可能是你想要的,因為你執行的命令是make)。

引用自:https://unix.stackexchange.com/questions/536432