CMakeプロジェクトの開始時に、変数CMAKE_CXX_FLAGSに一般的なコンパイルフラグを設定しています。
set(CMAKE_CXX_FLAGS "-W -Wall ${CMAKE_CXX_FLAGS}")
後で、追加の構成固有のコンパイルフラグ(BUILD_FLAGSに格納)を追加する必要があります。これには次のコマンドを使用できますか?
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS ${BUILD_FLAGS})
または、CMAKE_CXX_FLAGSを手動で追加する必要がありますか?
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${BUILD_FLAGS}")
cMAKE_CXX_FLAGSがBUILD_FLAGSによって上書きされるのを防ぐには?
最初のものを使用してください:
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS ${BUILD_FLAGS})
BUILD_FLAGSに格納されているフラグは、TARGETのソースをコンパイルするときにCMAKE_CXX_FLAGSの後に追加されます。ドキュメントはこれをほのめかしていますが、確認のために試しました。
COMPILE_FLAGS
Additional flags to use when compiling this target's sources. The COMPILE_FLAGS property sets additional compiler flags used to build sources within the target. Use COMPILE_DEFINITIONS to pass additional preprocessor definitions.
完全なコマンドラインは、次と同等です。
${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS} -o foo.o -c foo.cc
そして、ラモンが言ったように、あなたはいつでもmake VERBOSE=1
。
受け入れられた 回答 はまだ機能していますが、2013年以降は古くなっています。
この回答は、CMake v2.8.12、v3.3、v3.13の新しい機能に基づいています。
CMAKE_CXX_FLAGS
を設定する2つの新しいコマンド:
target_compile_options()
(1つの単一ターゲット用)add_compile_options()
(すべてのターゲット用)cmake-2.8.12以降、最後のバージョンのドキュメントはあまり変更されていません。
あなたの場合、次を使用できます:
target_compile_options(${TARGET} PRIVATE ${BUILD_FLAGS})
または、単一のターゲットがある場合:
add_compile_options(${BUILD_FLAGS})
target_compile_options(mylib PRIVATE -O2) # only internal
target_compile_options(mylib INTERFACE -gl) # only external
target_compile_options(mylib PUBLIC -g) # same as PRIVATE + INTERFACE
# multiple targets and flags
target_compile_options(mylib1 mylib2 PRIVATE -Wall -Wextra)
target_compile_options( mylib PUBLIC -DUSEXX) # Bad
target_compile_definitions(mylib PUBLIC -DUSEXX) # OK
add_compile_options(-Wall -Wextra) # for all targets in current directory
add_compile_options(-DUSEXX) # Bad
add_definitions(-DUSEXX) # OK
COMPILE_FLAGS
cmake-3.0ドキュメンテーション 非推奨としてCOMPILE_FLAGS
にフラグを立てます:
COMPILE_FLAGS
このターゲットのソースをコンパイルするときに使用する追加のフラグ。
COMPILE_FLAGS
プロパティは、ターゲット内でソースをビルドするために使用される追加のコンパイラフラグを設定します。COMPILE_DEFINITIONS
を使用して、追加のプリプロセッサ定義を渡します。このプロパティは非推奨です。代わりに
COMPILE_OPTIONS
プロパティまたはtarget_compile_options
コマンドを使用してください。
set_target_properties()
を引き続き使用する場合は、COMPILE_OPTIONS
の代わりにCOMPILE_FLAGS
を使用できます。
set_target_properties(${TARGET} PROPERTIES COMPILE_OPTIONS ${BUILD_FLAGS})
アントンペトロフジェネレーター式 の使用を提案します ar31の回答 。
CMakeジェネレーター式は${BUILD_FLAGS}
を以下に適用します:
$<COMPILE_LANGUAGE:CXX>
を使用するC++言語(C
、CUDA
でもかまいません)$<CXX_COMPILER_ID:Clang>
を使用するClangコンパイラGNU
の場合はgcc
でも、Visual C++の場合はMSVC
でも構いません... 完全なリスト を参照してください)$<C_COMPILER_ID:Clang>
を使用してください)あなたの場合、次を使用できます:
target_compile_options(${TARGET} PRIVATE
$<$<COMPILE_LANGUAGE:CXX>:${BUILD_FLAGS_FOR_CXX}>
$<$<COMPILE_LANGUAGE:C>:${BUILD_FLAGS_FOR_C}>)
またはコンパイラについて:
target_compile_options(${TARGET} PRIVATE
$<$<CXX_COMPILER_ID:Clang>:${BUILD_FLAGS_FOR_CLANG}>
$<$<CXX_COMPILER_ID:GNU>:${BUILD_FLAGS_FOR_GCC}>
$<$<CXX_COMPILER_ID:MSVC>:${BUILD_FLAGS_FOR_VISUAL}>)
新しい関数 target_link_options()
は、 Craig Scott で述べたように、リンカーにオプションを渡すことができます。
最適な方法は、2つの異なるターゲットを使用してCファイルとC++ファイルを区別することです。