2017-06-10 27 views
1

複数のサブディレクトリにまたがるプロジェクトでは、ビルドに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つのサブメイク内の並列ジョブの数。

答えて

2

.NOTPARALLEL:特殊ターゲットを、並列化しないメイクファイルに追加することができます。

あなたはコマンドラインで--evalオプションを使用することができ、それらのmakefileを変更したくない場合は

--evalは3.82を作るGNUに追加されました注意してください):提案のための

third_party_lib: 
     $(MAKE) --eval .NOTPARALLEL: -C [email protected] 
+0

感謝を。ドキュメントには、 "再帰的に呼び出されたmakeコマンドはまだレシピを並行して実行します..."と書かれているので、これを行うには--evalをインクルードするようにMAKE変数を変更する必要があります。私たちのジェンキンスとローカルでしばらくの間テストして、この答えに戻ります。 –

+0

試してもこの提案がうまくいかないと言っていますか?私は、ドキュメントへのあなたの参照を理解しているか分からない。再帰的なmakeが開始され、親makeはそれを並列に実行するように設定します。 '--eval'は再帰的makeによって実行され、' .NOTPARALLEL: '特別なターゲットは再帰的makeのmakefileを編集したのと同じように並列性を無効にします。 MAKE変数の内容を変更したくないのは確かです。 – MadScientist

+0

https://www.gnu.org/software/make/manual/html_node/Special-Targets.htmlから「すべての再帰的に呼び出されるmakeコマンドはまだレシピを並行して実行します」を参照しています。 third_party_lib/Makefileからのタスクは、一度に1つのみ実行されますが、そのサブディレクトリ内のMakefile内のタスクは、再度並行して実行できます。はい、最初のテストは機能しましたが、同時実行エラーはたまにしか表示されませんでした。したがって、より多くのテストが必要です。 –

関連する問題