web-dev-qa-db-ja.com

CMakeセットアップから、デフォルトで「-j」オプションを使用する「make」

ターミナルからmakeを呼び出すときはいつでも、CMakeプロジェクトを_make -j N_でビルドする必要があります。毎回_-j_オプションを手動で設定したくありません。

そのために、特定のコマンドラインにCMAKE_MAKE_PROGRAM変数を設定します。私はProcessorCount()関数を使用します。これは、ビルドを並行して実行するためのプロセッサーの数を示します。

makeを実行しても、速度が向上しません。ただし、_make -j N_を実行すると、確実に速く構築されます。

この問題について私を助けていただけませんか? (私はこれをLinuxで開発しています。)

以下は、_CMakeList.txt_で使用するコードのスニペットです。

_include(ProcessorCount)
ProcessorCount(N)
message("number of processors: "  ${N})
if(NOT N EQUAL 0)
  set(CTEST_BUILD_FLAGS -j${N})
  set(ctest_test_args ${ctest_test_args} PARALLEL_LEVEL ${N})
  set(CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM} -j ${N}")      
endif()
message("cmake make program" ${CMAKE_MAKE_PROGRAM})
_

どうもありがとうございました。

11
Hasbestein

CMAKE_MAKE_PROGRAM 変数を設定して、ビルドプロセスに影響を与えます。だが:

  1. この変数は、cmake --buildを介したビルドにのみ影響し、ネイティブツールmake)の呼び出しには影響しません。

    CMAKE_MAKE_PROGRAM変数は、プロジェクトコードで使用するために設定されます。この値は、cmake(1)--buildおよびctest(1)--build-and-testツールでもネイティブビルドプロセスを起動するために使用されます。

  2. この変数は[〜#〜] cache [〜#〜]dの変数である必要があります。 makeのようなジェネレーターによってそのように使用されます:

    これらのジェネレーターは、ユーザーが編集できるように、CMAKE_MAKE_PROGRAMをCMakeキャッシュに格納します。

    つまり、この変数を次のように設定する必要があります。

    set(CMAKE_MAKE_PROGRAM <program> CACHE PATH "Path to build tool" FORCE)
    
  3. この変数はexecutable自体を参照する必要があり、引数を持つプログラムを参照する必要はありません。

    値は、実行可能ファイルへの絶対パス、またはPATHにあると予想される場合は単なるツール名です。

    つまり、値 "make -j 2"はその変数には使用できません(引数をリストとして分割)

    set(CMAKE_MAKE_PROGRAM make -j 2 CACHE PATH "Path to build tool" FORCE)
    

    どちらも役に立ちません)。

要約すると、CMAKE_MAKE_PROGRAM変数をscriptに設定することでcmake --build呼び出しの動作を再定義できます。これにより、makeを並列オプションで呼び出します。しかし、あなたは直接のmake呼び出しの動作に影響しない可能性があります

2
Tsyvarev

ビルドを高速化したい場合は、複数のmakeプロセスを並行して実行できますが、cmakeは実行できません。事前定義された数の並列プロセスですべてのビルドを実行するには、これを[〜#〜] makeflags [〜#〜]で定義できます。

環境スクリプトでMAKEFLAGSを設定します。必要に応じて〜/ .bashrc:

export MAKEFLAGS=-j8

Linuxでは、次のようにMAKEFLAGSをCPUの数-1に設定します(ビルド中は、1つのCPUを他のタスクのために解放しておく)。 VMware:

export MAKEFLAGS=-j$(($(grep -c ^processor /proc/cpuinfo) - 0))
6
Th. Thielemann

このコマンドを使用して環境変数MAKEFLAGSを設定できます

export MAKEFLAGS=-j$(nproc)
2
Herve Mutombo

このメソッドを使用して複数の関数を呼び出すことはできますか? function1,2,3のような並列ではなく、順次、他のアイデアは高く評価されます。

例:

 if(FLAG1)
#some variables/options settings
    function1(${OPTIONS})
    function2(${OPTIONS})
    function3(${OPTIONS})
     ....
endif()

function(fucntion1)
#some variables/options parsing and passed to command.
      execute_process(COMMAND COMMAND1
                    WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
                    RESULT_VARIABLE res
                    TIMEOUT 60)
endfunction()
function(fucntion2)
#some variables/options parsing and passed to command.
      execute_process(COMMAND COMMAND2
                    WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
                    RESULT_VARIABLE res
                    TIMEOUT 60)
endfunction()
0
Ramana

私の解決策は、CPUの数だけでなく、あらゆる種類の他の機能をmake makeで実行する小さなスクリプトを作成することです。

スクリプトをmkと呼び、chmod 755 mkで実行できるので、./mkプロジェクトのルート。簡単なコマンドラインでさまざまなことを実行できるように、いくつかのフラグもあります。たとえば、コードの処理中に多くのエラーが発生した場合、出力をlessにパイプします。 ./mk -lすべての頑丈なUnixのものを再入力する必要なく...

ご覧のとおり、私は-j4をいくつかの場所で使用することができます。のために -lオプション、これは望ましくありません。この場合、最終的に同時に複数のエラーが出力されるためです(以前に試しました!)。

#!/bin/sh -e
#
# Execute make

case "$1" in
"-l")
    make -C ../BUILD/Debug 2>&1 | less -R
    ;;

"-r")
    make -j4 -C ../BUILD/Release
    ;;

"-d")
    rm -rf ../BUILD/Debug/doc/lpp-doc-?.*.tar.gz \
           ../BUILD/Debug/doc/lpp-doc-?.*
    make -C ../BUILD/Debug
    ;;

"-t")
    make -C ../BUILD/Debug
    ../BUILD/Debug/src/lpp tests/suite/syntax-print.logo
    g++ -std=c++14 -I rt l.cpp rt/*.cpp
    ;;

*)
    make -j4 -C ../BUILD/Debug
    ;;

esac

# From the https://github.com/m2osw/lpp project

CMakeでは、Tsyvarevが述べたように、独自のスクリプトを作成しない限り、機能しません。しかし、個人的にはmake scriptからmakeを呼び出すのは賢明ではないと思います。さらに、それは奇妙なスクリプトを期待しないビルドプロセスを壊す可能性があります。最後に、先ほど述べたように、私のスクリプトでは状況に応じてオプションを変更できます。

0
Alexis Wilke