2010-06-28 3 views
24

저는 현재 cmake를 사용하여 Visual C++, MinGW GCC, Linux GCC 등의 주요 플랫폼을 구축하고 있습니다. GCC로 빌드 할 때 -Wno-invalid-offsetof 컴파일러 옵션을 지정해야합니다. 다음과 같이cmake에서 다른 컴파일러에 대해 서로 다른 컴파일러 옵션을 적용하는 방법은 무엇입니까?

나의 현재 수정

if ( "${CMAKE_GENERATOR}" MATCHES "^Visual Studio" 
    OR "${CMAKE_GENERATOR}" MATCHES "^NMake" 
    ) 
    set (CPPLIB_COMPILER_OPTS "") 
else() 
    set (CPPLIB_COMPILER_OPTS "-Wno-invalid-offsetof") 
endif() 

... 

set_target_properties(sh_core PROPERTIES COMPILE_FLAGS "${CPPLIB_COMPILER_OPTS}") 
# repeated for all targets 

이 작동하지만, 비주얼 스튜디오 이외의 모든 발전기 GCC 빌드 것이라고 가정하는 것은 분명 안전하지 않은 ...입니다. 우선 Borland 컴파일러 용 IIRC 생성기가 있습니다. 더 중요한 것은, make를 사용한다고해서 항상 gcc를 사용한다는 것은 아닙니다.

다른 컴파일러는 llvm-gcc와 clang입니다. 다행히 clac조차도 gcc 호환 옵션을 지원한다고 생각합니다. 그러나이 논리는 관련 코드가 공개되지 않는 한 유용합니다.

Cmake는 사용 가능한 컴파일러를 확인하고 해당 컴파일러 전용 makefile을 생성합니다 (질문을 제기합니다. make와 같은 중간 사람이 없어도 프로젝트를 직접 빌드 할 수있는 옵션이 없기 때문입니다).

그런데 나는 내 CMakeLists.txt 파일에서 직접 gcc를 테스트 할 수 있기를 바랬습니다. 지금까지는 테스트 할 적절한 변수 나 다른 명백한 해결책을 찾을 수 없습니다.

이것이 가능합니까?

답변

35

휴대용 빌드 시스템을 만들려면 플랫폼을 테스트하지 않고 기능을 테스트하는 것이 가장 좋습니다.

"Windows에서이 작업을 수행 할 경우"대신 "-Wno-invalid-offsetof 플래그가 작동하는 경우"를 테스트하십시오. C에 대한

include(CheckCCompilerFlag) 
check_c_compiler_flag(-Wno-invalid-offsetof HAS_NO_INVALID_OFFSETOF) 
if (HAS_NO_INVALID_OFFSETOF) 
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-invalid-offsetof") 
endif() 

++ check_cxx_compiler_flag(flag var) 명령과 유사한 CheckCXXCompilerFlag있다 : 당신은 예를 들어 CheckCCompilerFlag 모듈에 있다고 할 수 있습니다.

+1

완벽합니다. 하나의 무관 한 일이지만 ... C에 대한 옵션을 많이 검사하지는 않습니다. C에서 잘못된 offsetof와 같은 것이 없기 때문에 C++에서만 발생합니다. – Steve314

+0

나는 그것을 몰랐다. 실제로 나는 옵션이 무엇인지를 알지 못했지만, C는 POD 타입 만 가지고 있기 때문에 완벽한 의미를 갖습니다. http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Warning-Options.html. 그리고 CMake는 테스트 중에 컴파일러 경고를 무시합니다. "컴파일하면 작동합니다". – richq

+0

옵션 조합을 확인하는 방법이 있습니까? 또한 컴파일 타임 경고가 없도록 경고를 조사하는 방법을 찾고 싶었습니다. – thoni56

관련 문제