回答:
更新:この回答は、モダンCMake時代以前のものです。すべての健全なCMakeユーザーは、CMAKE_CXX_FLAGS
直接いじるのを控え、target_compile_options
代わりにコマンドを呼び出す必要があります。推奨されるベストプラクティスを示すmrtsの回答を確認してください。
あなたはこれに似た何かをすることができます:
if(MSVC)
# Force to always compile with W4
if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
endif()
elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
# Update if necessary
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic")
endif()
/Wall
clangと同じように、警告に対して「減算」戦略を実行したい場合に使用できます-Weverything
。有効にする警告を選択する代わりに、すべてを有効にしてから、無効にする特定の警告を選択します。
最近のCMakeでは、以下がうまく機能します:
if(MSVC)
target_compile_options(${TARGET_NAME} PRIVATE /W4 /WX)
else()
target_compile_options(${TARGET_NAME} PRIVATE -Wall -Wextra -pedantic -Werror)
endif()
私の同僚は別のバージョンを提案しました:
target_compile_options(${TARGET_NAME} PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:/W4 /WX>
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wall -Wextra -pedantic -Werror>
)
${TARGET_NAME}
実際のターゲット名に置き換えます。-Werror
オプションで、すべての警告をエラーに変えます。
またはadd_compile_options(...)
、コメントの@aldoで提案されているように、すべてのターゲットに適用する場合に使用します。
また、違いを理解してくださいPRIVATE
とのPUBLIC
(公共のオプションが指定されたターゲットに依存ターゲットによって継承されます)。
add_compile_options(...)
すべてのターゲットに適用したい場合。
else()
またはで条件を繰り返す必要はありませんendif()
。
add_compile_options()
は、警告がを介して追加されたターゲットに伝播することadd_subdirectory()
です。この方法で外部ライブラリを含める場合、そのライブラリが異なる警告レベルで設計されていると、多くの警告が表示される可能性があります。
私が書いたいくつかのCMakeモジュールには、実験的なクロスプラットフォームの警告抑制が含まれています。
sugar_generate_warning_flags(
target_compile_options
target_properties
ENABLE conversion
TREAT_AS_ERRORS ALL
)
set_target_properties(
foo
PROPERTIES
${target_properties}
COMPILE_OPTIONS
"${target_compile_options}"
)
Xcodeの結果:
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION
Xcode属性を設定します(別名ビルド設定 -> 警告 -> 疑わしい暗黙の変換 -> YES)-Werror
Makefile gccおよびclang:
-Wconversion
、-Werror
ビジュアルスタジオ:
/WX
、/w14244
これが私がこれまでに見つけた最良のソリューションです(コンパイラチェックを含む)。
if(CMAKE_BUILD_TOOL MATCHES "(msdev|devenv|nmake)")
add_definitions(/W2)
endif()
これにより、Visual Studioで警告レベル2が設定されます。私は-W2
それがGCCでも機能するだろうと推測しています(テストされていません)。
@Williamsからの更新:-Wall
GCC向けのはずです。
-W -Wall -Wextra -pedantic
です。-Wextra
IIRC -W
はGCCの新しいバージョンで置き換えられましたが、互換性のために両方とも残します。
あたりとしてcmakeの3.17.1ドキュメント:
if (MSVC)
# warning level 4 and all warnings as errors
add_compile_options(/W4 /WX)
else()
# lots of warnings and all warnings as errors
add_compile_options(-Wall -Wextra -pedantic -Werror)
endif()
GCCとClangはこれらのフラグを共有しているため、3つすべてをカバーする必要があります。
add_compile_options
ディレクトリ全体target_compile_options
ですが、1つのターゲットのみです。
if(MSVC)
string(REGEX REPLACE "/W[1-3]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endif()
target_compile_options
- を使用すると、cmakeは二重/W*
フラグを使用しようとします。これにより、コンパイラによって警告が表示されます。
add_compile_options
大量の警告を取得するためにのみ使用/W3
していました/W4
。CMakeがこの基本的なオプション(警告レベルの設定)に対処していないという事実は、信じられないほどです。
/Wall
フラグ(という名前EnableAllWarnings
)をサポートしていることに注意してください。よりも多くの警告が生成されます/W4
。しかし、私の経験から、それはあまりにも多くの警告を出します。