Respostas:
ATUALIZAÇÃO: Esta resposta é anterior à era Modern CMake. Todo usuário sensato do CMake deve evitar mexer com o CMAKE_CXX_FLAGSdiretamente e chamar o target_compile_optionscomando. Verifique a resposta dos mrts que apresenta as melhores práticas recomendadas.
Você pode fazer algo semelhante a isto:
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()
/Wallpode ser usado se você quiser seguir uma estratégia 'subtrativa' para avisos, assim como a do clang -Weverything. Em vez de selecionar avisos para ativar, você ativa tudo e, em seguida, seleciona avisos específicos para desativar.
No CMake moderno, o seguinte funciona bem:
if(MSVC)
target_compile_options(${TARGET_NAME} PRIVATE /W4 /WX)
else()
target_compile_options(${TARGET_NAME} PRIVATE -Wall -Wextra -pedantic -Werror)
endif()
Meu colega sugeriu uma versão alternativa:
target_compile_options(${TARGET_NAME} PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:/W4 /WX>
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wall -Wextra -pedantic -Werror>
)
Substitua ${TARGET_NAME}pelo nome real do alvo. -Werroré opcional, transforma todos os avisos em erros.
Ou use add_compile_options(...)se quiser aplicá-lo a todos os destinos, conforme sugerido por @aldo nos comentários.
Além disso, certifique-se de entender a diferença entre PRIVATEe PUBLIC(as opções públicas serão herdadas por destinos que dependem do destino fornecido).
add_compile_options(...)se você deseja aplicá-lo a todos os alvos.
else()ou endif().
add_compile_options()é que os avisos se propagam para os alvos adicionados via add_subdirectory(). Se você incluir bibliotecas externas dessa forma, poderá obter muitos avisos se essa biblioteca tiver sido projetada com níveis de aviso diferentes.
Alguns módulos do CMake que escrevi incluem supressão experimental de aviso de plataforma cruzada :
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}"
)
Resultado para Xcode:
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSIONatributo Xcode (também conhecido como configurações de construção -> avisos -> conversões implícitas suspeitas -> SIM )-WerrorMakefile gcc e clang:
-Wconversion,-WerrorEstúdio visual:
/WX,/w14244Aqui está a melhor solução que encontrei até agora (incluindo uma verificação do compilador):
if(CMAKE_BUILD_TOOL MATCHES "(msdev|devenv|nmake)")
add_definitions(/W2)
endif()
Isso definirá o nível de aviso 2 no Visual Studio. Suponho que com um -W2funcionaria no GCC também (não testado).
Atualização de @Williams: Deve ser -Wallpara o GCC.
-Walle talvez -Wextraconforme detalhado em gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
-W -Wall -Wextra -pedantic. -WextraIIRC substituído -Wem uma versão posterior do GCC, mas deixo ambos por causa das compatibilidades.
De acordo com a documentação 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()
O GCC e o Clang compartilham esses sinalizadores, portanto, isso deve abranger todos os 3.
add_compile_optionsabrange todo o diretório, mas target_compile_optionsé apenas para um único destino.
if(MSVC)
string(REGEX REPLACE "/W[1-3]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endif()
Se você usar target_compile_options- cmake tentará usar double /W*flag, o que dará um aviso pelo compilador.
add_compile_optionsapenas para obter toneladas de avisos que /W3estão sendo anulados /W4. O fato de que o CMake não está abordando essa opção rudimentar (definir o nível de aviso) é inacreditável.
/Wallsinalizador (que é nomeadoEnableAllWarnings). Produz ainda mais avisos do que/W4. No entanto, pela minha experiência, produz muitos avisos.