Respostas:
ATUALIZAÇÃO: Esta resposta é anterior à era Modern CMake. Todo usuário sensato do CMake deve evitar mexer com o CMAKE_CXX_FLAGS
diretamente e chamar o target_compile_options
comando. 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()
/Wall
pode 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 PRIVATE
e 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_CONVERSION
atributo Xcode (também conhecido como configurações de construção -> avisos -> conversões implícitas suspeitas -> SIM )-Werror
Makefile gcc e clang:
-Wconversion
,-Werror
Estúdio visual:
/WX
,/w14244
Aqui 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 -W2
funcionaria no GCC também (não testado).
Atualização de @Williams: Deve ser -Wall
para o GCC.
-Wall
e talvez -Wextra
conforme detalhado em gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
-W -Wall -Wextra -pedantic
. -Wextra
IIRC substituído -W
em 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_options
abrange 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_options
apenas para obter toneladas de avisos que /W3
estã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.
/Wall
sinalizador (que é nomeadoEnableAllWarnings
). Produz ainda mais avisos do que/W4
. No entanto, pela minha experiência, produz muitos avisos.