Pertanyaan Bagaimana mengatur tingkat peringatan di CMake?


Cara mengatur tingkat peringatan untuk sebuah proyek (bukan solusi keseluruhan) menggunakan CMake? Harus dikerjakan Studio visual dan GCC.

Saya menemukan berbagai pilihan tetapi tampaknya sebagian besar tidak berfungsi atau tidak konsisten dengan dokumentasi.


75
2018-03-03 04:37


asal


Jawaban:


Anda dapat melakukan sesuatu yang mirip dengan ini:

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

74
2017-09-29 00:57



Beberapa CMake modul yang saya tulis termasuk eksperimental penekan peringatan lintas-platfrom:

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

Hasil untuk Xcode:

  • Set CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION Atribut Xcode (aka membangun pengaturan -> peringatan -> konversi tersirat yang mencurigakan -> IYA NIH)
  • Tambahkan bendera compiler: -Werror

Makefile gcc dan clang:

  • Tambahkan bendera kompilator: -Wconversion, -Werror

Studio visual:

  • Tambahkan bendera kompilator: /WX, /w14244

Tautan


20
2018-06-24 06:23



Berikut ini solusi terbaik yang saya temukan sejauh ini (termasuk pemeriksaan kompilator):

if(CMAKE_BUILD_TOOL MATCHES "(msdev|devenv|nmake)")
    add_definitions(/W2)
endif()

Ini akan mengatur tingkat peringatan 2 di Visual Studio. Saya kira dengan -W2 itu akan bekerja di GCC juga (belum diuji).

Pembaruan dari @Williams: Seharusnya demikian -Wall untuk GCC.


10
2018-03-03 06:23



Dalam CMake modern, berikut ini berfungsi dengan baik:

if(MSVC)
  target_compile_options(${TARGET_NAME} PRIVATE /W4 /WX)
else(MSVC)
  target_compile_options(${TARGET_NAME} PRIVATE -Wall -Wextra -pedantic -Werror)
endif(MSVC)

Menggantikan ${TARGET_NAME} dengan nama target yang sebenarnya. -Werror bersifat opsional, mengubah semua peringatan menjadi kesalahan.


1
2018-06-15 20:23