ターミナルから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})
_
どうもありがとうございました。
CMAKE_MAKE_PROGRAM 変数を設定して、ビルドプロセスに影響を与えます。だが:
この変数は、cmake --build
を介したビルドにのみ影響し、ネイティブツール(make
)の呼び出しには影響しません。
CMAKE_MAKE_PROGRAM
変数は、プロジェクトコードで使用するために設定されます。この値は、cmake(1)--build
およびctest(1)--build-and-test
ツールでもネイティブビルドプロセスを起動するために使用されます。
この変数は[〜#〜] cache [〜#〜]dの変数である必要があります。 makeのようなジェネレーターによってそのように使用されます:
これらのジェネレーターは、ユーザーが編集できるように、CMAKE_MAKE_PROGRAMをCMakeキャッシュに格納します。
つまり、この変数を次のように設定する必要があります。
set(CMAKE_MAKE_PROGRAM <program> CACHE PATH "Path to build tool" FORCE)
この変数は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
呼び出しの動作に影響しない可能性があります。
ビルドを高速化したい場合は、複数のmakeプロセスを並行して実行できますが、cmakeは実行できません。事前定義された数の並列プロセスですべてのビルドを実行するには、これを[〜#〜] makeflags [〜#〜]で定義できます。
環境スクリプトでMAKEFLAGSを設定します。必要に応じて〜/ .bashrc:
export MAKEFLAGS=-j8
Linuxでは、次のようにMAKEFLAGSをCPUの数-1に設定します(ビルド中は、1つのCPUを他のタスクのために解放しておく)。 VMware:
export MAKEFLAGS=-j$(($(grep -c ^processor /proc/cpuinfo) - 0))
このコマンドを使用して環境変数MAKEFLAGSを設定できます
export MAKEFLAGS=-j$(nproc)
このメソッドを使用して複数の関数を呼び出すことはできますか? 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()
私の解決策は、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を呼び出すのは賢明ではないと思います。さらに、それは奇妙なスクリプトを期待しないビルドプロセスを壊す可能性があります。最後に、先ほど述べたように、私のスクリプトでは状況に応じてオプションを変更できます。