GNU makeのすべての規則の直列化:ベストプラクティス?

GNU makeのすべての規則の直列化:ベストプラクティス?

メイクファイルがあるのに確認したいです。すべてのルール順次実行されます。つまり、並列実行処刑される。

私は持っていると信じています3つの方法この目標を達成するには:

  • そして.NOTPARALLELターゲット、
  • を呼び出してmake使用しますmake -j 1
  • たとえば、makefileで直接フラグを設定すると、次のようになります。MAKEFLAGS := -j 1

3つの間に「ベストプラクティス」があり、どちらがより強力ですか?

たとえば、これはあまりにも多くですか?

MAKEFLAGS := --jobs=1

.NOTPARALLEL:
all:foo bar

.NOTPARALLEL:
foo:bar

.NOTPARALLEL:
bar:
    @echo "test" 

ベストアンサー1

はい、これはとても良いです。

3つのオプションに関する限り:

  • 2つの理由でthisを設定しないでくださいMAKEFLAGS。コマンドラインに渡されたフラグに問題が発生し、MAKEFLAGS外部から強く修正できるように動作しません。これら2つの問題が実際に実行されている様子を確認するには、@echo $(MAKEFLAGS)シナリオにルールを追加してbar実行してくださいmake -n bar

  • make -j 1望ましい効果がありますが、一時的にすべてを直列に実行したい場合に最適です。これは、使用されるリソースを制限したい場合や並列実行の問題をデバッグする場合に便利です。これは少なくともGNU Makeではデフォルトでもあります。デフォルトでは、Makeは一度に1つのジョブのみを実行します。

  • .NOTPARALLEL:必要な効果を得るには一度だけ指定するだけで、シリアライゼーション要件がMakefileのプロパティである状況に適しています。つまりすべての実行は、可能な外部影響なしに継続的に行われるべきです。

しかし、ビルドが多用される予定であれば、時間をかけてルールの並列実行が問題を引き起こす理由を特定し、適切な依存関係を追加する方が良いと思います。 GNU Makeのサポート前提条件のみ注文「斬新な」依存関係を適用せずに強制的に注文するために使用できます。この場合、これはしばしば役立ちます。バラよりこの回答SOで見つけた質問に。

おすすめ記事