Como definir o nível de aviso para um projeto (não toda a solução) usando CMake ? Deve funcionar em Visual Studio e GCC .
Encontrei várias opções, mas a maioria parece não funcionar ou não é consistente com a documentação.
cmake
warning-level
Wernight
fonte
fonte
/Wall
sinalizador (que é nomeadoEnableAllWarnings
). Produz ainda mais avisos do que/W4
. No entanto, pela minha experiência, produz muitos avisos./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:
Meu colega sugeriu uma versão alternativa:
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
ePUBLIC
(as opções públicas serão herdadas por destinos que dependem do destino fornecido).fonte
add_compile_options(...)
se você deseja aplicá-lo a todos os alvos.else()
ouendif()
.add_compile_options()
é que os avisos se propagam para os alvos adicionados viaadd_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 :
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
Links
fonte
Aqui está a melhor solução que encontrei até agora (incluindo uma verificação do compilador):
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.fonte
-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 :
O GCC e o Clang compartilham esses sinalizadores, portanto, isso deve abranger todos os 3.
fonte
add_compile_options
abrange todo o diretório, mastarget_compile_options
é apenas para um único destino.Se você usar
target_compile_options
- cmake tentará usar double/W*
flag, o que dará um aviso pelo compilador.fonte
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.