いくつかの make コマンドを自動化しようとしています。ターゲットに加えて、makeに渡される変数もあります(#ifdef
コードのaセットに対応します)。
make コマンドは次のようになります。
make <target> <MYCDEF=val>
val
複数の値を取ることができます。MYCDEF_VAL1、MYCDEF_VAL2...).
target
次のように複数の値を取ることも可能です。Androidの腕、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_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)
-j1
GNU Parallel がタスクを直列に実行するように強制します (実行中のコマンドが与えられたら、おそらく望むものでしょうmake
)。