16

ソースツリーに並列CMakeベースのビルドをセットアップしようとしていますが、

$ cmake .
$ make -j2

私は得る:

jobserver unavailable: using -j1.  Add '+' to parent make rule

警告として。どうにかしてそれを修正することが可能かどうか誰かが考えを持っていますか?

4

4 に答える 4

24

生成されたMakefileで、サブmakeを呼び出すときは、$(MAKE)('make'だけでなく)を使用するか、行の前に+を付ける必要があります。つまり、ルールは次のようになります。

mysubdir:
    $(MAKE) -C mysubdir

またはこのように:

mysubdir:
    +make -C mysubdir

これらの2つの方法のいずれかを行わない場合、makeはその警告を表示します。

私はcmakeについて何も知らないので、おそらくそれは正しくないMakefileを生成しています。または多分あなたはあなたの側で何か間違ったことをしました。

于 2010-11-21T15:18:56.903 に答える
9

私の場合(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

お役に立てれば。

于 2016-12-21T17:20:26.217 に答える
0

これはcmakeの問題ではなく、makeのみの問題のようです。

于 2010-08-20T13:29:11.800 に答える
-1

グーグルするだけで、distccを使用しているように見えます(例:ここ

于 2010-06-01T20:59:06.637 に答える