ソースツリーに並列CMakeベースのビルドをセットアップしようとしていますが、
$ cmake .
$ make -j2
私は得る:
jobserver unavailable: using -j1. Add '+' to parent make rule
警告として。どうにかしてそれを修正することが可能かどうか誰かが考えを持っていますか?
ソースツリーに並列CMakeベースのビルドをセットアップしようとしていますが、
$ cmake .
$ make -j2
私は得る:
jobserver unavailable: using -j1. Add '+' to parent make rule
警告として。どうにかしてそれを修正することが可能かどうか誰かが考えを持っていますか?
生成されたMakefileで、サブmakeを呼び出すときは、$(MAKE)('make'だけでなく)を使用するか、行の前に+を付ける必要があります。つまり、ルールは次のようになります。
mysubdir:
$(MAKE) -C mysubdir
またはこのように:
mysubdir:
+make -C mysubdir
これらの2つの方法のいずれかを行わない場合、makeはその警告を表示します。
私はcmakeについて何も知らないので、おそらくそれは正しくないMakefileを生成しています。または多分あなたはあなたの側で何か間違ったことをしました。
私の場合(CMake 3.5.2を使用)、些細なことcd build && cmake .. && make -j5
は問題なく機能します。
しかし、イディオムを介してカスタムターゲットを(他のターゲットの依存関係として)構築すると、 jobserveravailablecmake --build . --target foo
エラーが発生します。
このような:
add_custom_target(buildroot
COMMAND ${CMAKE_COMMAND} --build . --target install
COMMENT "Populating buildroot..."
)
add_dependencies(deb buildroot)
add_dependencies(rpm buildroot) #... etc
—ユーザーができるように、make deb
そしてそれは正しく機能します。CMakeは、必要に応じてmakefileを再生成し、コンパイルを実行し、install
すべてをとまったく同じようにmake install
実行してから、カスタムスクリプトを実行して、入力されたビルドルートを必要な形状または形式にパッケージ化します。
案の定、やりたいのですmake -j15 deb
が、失敗します。
さて、CMake開発者によるメーリングリストで説明されているように、根本的な原因は、驚くべきことに(またはそうではなく)、GNUMake内にあります。回避策があります。
根本的な原因はmake
、ジョブサーバー環境を、そうではないと思われる子プロセスに渡さないことmake
です。
説明のために、プロセスツリー(ps -A f
)ブランチ
を次に示します。
…
\_ bash
\_ make -j15 deb
\_ make -f CMakeFiles/Makefile2 deb
\_ make -f CMakeFiles/buildroot.dir/build.make CMakeFiles/buildroot.dir/build
\_ /usr/bin/cmake --build . --target install ⦿
\_ /usr/bin/gmake install
…
⦿ポイントで、make
ジョブサーバー環境を削除し、最終的にシングルスレッドコンパイルを引き起こします。
リンクされた電子メールで示されているように、私にとってうまく機能した回避策+env
は、すべてのカスタムコマンドの前に。を付けることです。このような:
add_custom_target(buildroot
#-- this ↓↓↓ here -- https://stackoverflow.com/a/41268443/531179
COMMAND +env ${CMAKE_COMMAND} --build . --target install
COMMENT "Populating buildroot..."
)
add_dependencies(deb buildroot)
add_dependencies(rpm buildroot) #... etc
結局、これは適切なmakefileのルールに表示されbuildroot
(CMakeはそれらの束を生成します)、GNU Makeが適切に動作し、尊重するようにします-j
。
お役に立てれば。
これはcmakeの問題ではなく、makeのみの問題のようです。
グーグルするだけで、distccを使用しているように見えます(例:ここ)