大量のコアを搭載したマシンに Makefile がありますが-jX
、プロジェクトをコンパイルするときに常に書き込みを忘れているようで、必要以上に時間がかかります。
-j
make がこのマシンで複数のジョブを自動的に並行して実行するように、環境変数またはその他の永続的な構成ファイルを介してフラグを設定する方法はありますか?
大量のコアを搭載したマシンに Makefile がありますが-jX
、プロジェクトをコンパイルするときに常に書き込みを忘れているようで、必要以上に時間がかかります。
-j
make がこのマシンで複数のジョブを自動的に並行して実行するように、環境変数またはその他の永続的な構成ファイルを介してフラグを設定する方法はありますか?
Linux を使用していると仮定します。これは私のものです~/.bashrc
# parallel make
export NUMCPUS=`grep -c '^processor' /proc/cpuinfo`
alias pmake='time nice make -j$NUMCPUS --load-average=$NUMCPUS'
使用例
samm@host src> echo $NUMCPUS
8
samm@host src> pmake
になりtime nice make -j8 --load-average=8
ます。
これを に入れることに関する特定の質問に答えるために、Makefile
このロジックを Makefile 全体に振りかけるのは現実的ではありません。これを最上位の Makefile に入れることも、サブディレクトリから構築することが多く、それらも並行して構築したいため、優れた解決策ではありません。ただし、ソース階層がかなりフラットな場合は、うまくいく可能性があります。
環境変数はMAKEFLAGS
、すべてのmake
実行の一部であるフラグを渡すことができるようです (少なくとも GNU make の場合)。私自身はあまりうまくいきませんでしたが、使用可能なコアの数に適した数のジョブを自動的に実行するの-l
ではなく、使用できる可能性があります。-j
私は通常、bash スクリプトで次のようにこれを行います。
make -j$(nproc)
エイリアスはスクリプト内では展開されません。別のmake
スクリプトを作成し、$PATH
ディレクトリの 1 つに配置することをお勧めします。
#!/bin/sh
if [ -f /proc/cpuinfo ]; then
CPUS=`grep processor /proc/cpuinfo | wc -l`
else
CPUS=1
fi
/usr/bin/make -j`expr $CPUS + 1` "$@"
次のような行を Makefile に追加できます。
NUMJOBS=${NUMJOBS:-" -j4 "}
次に${NUMJOBS}
、ルールに行を追加するか、別のMakefile
var に追加します ( などMAKEFLAGS
)。存在する場合、これは NUMJOBS 環境変数を使用します。そうでない場合は、自動的に を使用します-j4
。好みに合わせて調整または名前を変更できます。
(NB: 個人的には、特に他の人に配布する場合は、デフォルトを-j1
orにすることを好みます""
。これは、複数のコアも持っていますが、多くの異なるプラットフォームでコンパイルし、設定を無効にするのを忘れる-jX
ことがよくあるためです。 )
私はただ置くだろう
alias make='make -j'
~/.profile
またはで~/.bashrc
。
マニュアルによると:
「-j」オプションの後に整数のように見えるものがない場合、ジョブ スロットの数に制限はありません。