2017-01-16 18 views
5

端末からmakeを呼び出すときはいつでも私のCMakeプロジェクトをmake -j Nでビルドします。毎回手動で-jオプションを設定したくありません。CMakeセットアップから '-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}) 

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

+1

なし一部。だから、あなたは何をスピードアップしたいですか? ** cmakeフェーズは並列化できないことに注意してください**:CMakeスクリプトは、pythonのような他のスクリプト言語のように、行ごとに順次処理されます。反対に、**ビルドフェーズ**は並列化され、 'make -j'はまさにこれを行います。 – Tsyvarev

+1

CMake/buildパフォーマンスに関するいくつかのアドバイス:http://stackoverflow.com/q/37327526/2799037 – usr1234567

+0

私はそれが実行されないことを知っています、それはCMakeList.txtのセグメントです、私は単にCMAKE_MAKE_PROGRAMを設定しようとしています。毎回ターミナルで明示的に設定するのではなく、私が端末からmakeを呼び出すたびに "make -j N"を呼び出すようにします。 – BatiCode

答えて

0

ビアの設定CMAKE_MAKE_PROGRAMビルドプロセスに影響を与えたい変数。しかし:

  1. この変数はcmake --build経由のみのビルドに影響し、ないネイティブツールのmake)コール:

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

  2. この変数は、のCACHEです。それをユーザーが編集できるように、CMakeのキャッシュに

    これらの発電機ストアCMAKE_MAKE_PROGRAM:様発電機を作るすることにより、このような方法で使用されています。ある

    、あなたが

    set(CMAKE_MAKE_PROGRAM <program> CACHE PATH "Path to build tool" FORCE) 
    
  3. でこの変数を設定する必要があります。この変数は、実行自体にではなく、引数を指定してプログラムを参照してください:

    値を実行可能ファイルへの絶対パスか、PATHにあると予想される場合はツール名のみになります。値が(リスト

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

    として分割引数はあまり役に立たない)その変数のために使用することはできません「-j 2が作る」、である

    。要約すると

、あなたはパラレルオプションでmakeを呼び出すスクリプトCMAKE_MAKE_PROGRAM変数を設定するとcmake --build呼び出しの動作を再定義することがあります。しかし、は、直接makeの呼び出しには影響しません。

+0

詳細な回答ありがとう – BatiCode

+0

"make -jN"のエイリアスを作成する –

1

ビルドをスピードアップしたい場合は、複数のmakeプロセスを同時に実行できますが、cmakeは実行できません。 定義済みの並列プロセス数ですべてのビルドを実行するには、MAKEFLAGSでこれを定義できます。

環境スクリプトにMAKEFLAGSを設定します。例えば、(ビルドしながら、他のタスクのために1つのCPU自由にしてください)とダイナミックressourcesの環境で有用である: - :あなたが望むよう〜/ .bashrcの1

export MAKEFLAGS=-j8 

次のセットは、CPUの数にMAKEFLAGS VMware:

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

このコマンドに

export MAKEFLAGS=-j$(nproc) 
+0

Make 4.1では動作しません。やってみなよ。 – sanmai

0

を使用してのenv変数MAKEFLAGSを設定することができ、この方法は、複数の機能を呼び出すために使用することができますか? 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() 
関連する問題