複数のサブディレクトリにまたがるプロジェクトでは、ビルドにGNU makeを使用します。開発者は-j <number>
フラグを使用してビルドタスクを並列化し、マシンのハードウェアに合った番号を選択できます。サブメイクの同時実行を制限する
しかし、私たちが使用するサードパーティ製ライブラリのMakefileは、パラレル化するのが安全ではありません。すべての依存するターゲット間の明示的な依存性の規則ではなく、ターゲットの暗黙の順序に依存しているようです。
私はサードパーティのMakefileを修正したくないので、明示的に-j 1
パラメータでMakefileを呼び出して、そのライブラリをビルドするためにジョブの数を1に制限します。ルールは次のようになります。
make[1]: warning: -jN forced in submake: disabling jobserver mode.
数を制限するためのより良い方法があるなら、私はここに依頼するつながる:
third_party_lib:
$(MAKE) -j 1 -C [email protected]
必要に応じて、これは動作しますが、これについて警告を発し作ります1つのサブメイク内の並列ジョブの数。
感謝を。ドキュメントには、 "再帰的に呼び出されたmakeコマンドはまだレシピを並行して実行します..."と書かれているので、これを行うには--evalをインクルードするようにMAKE変数を変更する必要があります。私たちのジェンキンスとローカルでしばらくの間テストして、この答えに戻ります。 –
試してもこの提案がうまくいかないと言っていますか?私は、ドキュメントへのあなたの参照を理解しているか分からない。再帰的なmakeが開始され、親makeはそれを並列に実行するように設定します。 '--eval'は再帰的makeによって実行され、' .NOTPARALLEL: '特別なターゲットは再帰的makeのmakefileを編集したのと同じように並列性を無効にします。 MAKE変数の内容を変更したくないのは確かです。 – MadScientist
https://www.gnu.org/software/make/manual/html_node/Special-Targets.htmlから「すべての再帰的に呼び出されるmakeコマンドはまだレシピを並行して実行します」を参照しています。 third_party_lib/Makefileからのタスクは、一度に1つのみ実行されますが、そのサブディレクトリ内のMakefile内のタスクは、再度並行して実行できます。はい、最初のテストは機能しましたが、同時実行エラーはたまにしか表示されませんでした。したがって、より多くのテストが必要です。 –