web-dev-qa-db-ja.com

CMakeのset_target_propertiesはCMAKE_CXX_FLAGSをオーバーライドしますか?

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によって上書きされるのを防ぐには?

54
Milan Hanus

最初のものを使用してください:

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

52
richq

受け入れられた 回答 はまだ機能していますが、2013年以降は古くなっています。
この回答は、CMake v2.8.12、v3.3、v3.13の新しい機能に基づいています。

CMake-2.8.12(2013)以降

CMAKE_CXX_FLAGSを設定する2つの新しいコマンド:

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})

CMake-3.3(2015)以降

アントンペトロフジェネレーター式 の使用を提案します ar31の回答

CMakeジェネレーター式${BUILD_FLAGS}を以下に適用します:

  • $<COMPILE_LANGUAGE:CXX>を使用するC++言語(CCUDAでもかまいません)
  • $<CXX_COMPILER_ID:Clang>を使用するClangコンパイラ
    GNUの場合はgccでも、Visual C++の場合はMSVCでも構いません... 完全なリスト を参照してください)
    (言語がCの場合は、代わりに$<C_COMPILER_ID:Clang>を使用してください)
  • サポートされているC++機能またはコンパイラバージョン ...など( ドキュメント を参照)

あなたの場合、次を使用できます:

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}>)

CMake-3.13(2018)以降

新しい関数 target_link_options() は、 Craig Scott で述べたように、リンカーにオプションを渡すことができます。

CおよびC++ファイルのさまざまなオプション

最適な方法は、2つの異なるターゲットを使用してCファイルとC++ファイルを区別することです。

49
olibre