Pipe
來自多個程序的管道輸入
我正在嘗試自動化一些 make 命令。除了目標,我們還有一個傳遞給 make 的變數(對應
#ifdef
於程式碼中的 a 集合)。make 命令如下所示:
make <target> <MYCDEF=val>
val
可以取多個值(MYCDEF_VAL1,MYCDEF_VAL2 …)。
target
也可以採用多個值,例如:android_arm、windows_x86、linux_x64等。可以從我們檢查的地方找到MYCDEF_VALn****
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_ 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
)。