複数プロセスのパイプ入力

複数プロセスのパイプ入力

いくつかの make コマンドを自動化しようとしています。ターゲットに加えて、makeに渡される変数もあります(#ifdefコードのaセットに対応します)。

make コマンドは次のようになります。

make <target> <MYCDEF=val>

val複数の値を取ることができます。MYCDEF_VAL1MYCDEF_VAL2...).

target次のように複数の値を取ることも可能です。Androidの腕windows_x86linux_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_1つのvalsターゲットを使用して、最初のスクリプトの出力をパイプすることができます(次を使用)。config.h):

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

同様に、1を持つすべてのターゲットについてMYCDEF_val、Makefileを使用して2番目のスクリプトからパイプできます。

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)

-j1GNU Parallel がタスクを直列に実行するように強制します (実行中のコマンドが与えられたら、おそらく望むものでしょうmake)。

関連情報