[cmake] CMake에서 경고 수준을 설정하는 방법은 무엇입니까?

CMake를 사용하여 프로젝트 (전체 솔루션이 아님)에 대한 경고 수준 을 설정하는 방법은 무엇입니까? Visual StudioGCC 에서 작동해야합니다 .

다양한 옵션을 찾았지만 대부분 작동하지 않거나 문서와 일치하지 않는 것 같습니다.



답변

업데이트 :이 답변은 Modern 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()


답변

최신 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가 제안한대로 모든 대상에 적용하려면 사용하십시오.

또한, 차이 이해해야합니다 PRIVATEPUBLIC(공공 옵션이 주어진 목표에 따라 목표에 의해 상속됩니다).


답변

내가 작성한 일부 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엑스 코드 속성 (일명 빌드 설정 -> 경고 -> 의심스러운 암시 적 변환 -> 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의 업데이트 : -WallGCC 용 이어야합니다 .


답변

당으로 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 개를 모두 포함해야합니다.


답변

if(MSVC)
    string(REGEX REPLACE "/W[1-3]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endif()

당신이 사용하는 경우 target_compile_options– cmake 두 번 사용하려고합니다 /W*컴파일러가 경고를 줄 것이다 플래그를.


답변