2017-04-04 8 views
1

feature test macros을 기반으로 조건부로 제공되는 특정 Linux/POSIX 기능을 사용하고 싶습니다. 예를 들어 cpu_set_t 유형, CPU_SET_ZERO 매크로 및 sched_setaffinity 매크로가 있습니다.CMake가 glibc 기능 테스트 매크로를 지원합니까?

이상적으로 나는 CMake에게 내가 필요하다고 말하고 싶습니다. 현재 시스템에서 제공 할 수없는 경우 어떤 여분의 기능 테스트 매크로를 설정하거나 실패 하는지를 알아 내야합니다. 그게 가능하니?

은 내가 themanpages에서 조회 및 수동 add_definitions(-D_GNU_SOURCE)를 사용할 수 있음을 알고 있지만, POSIX 표준의 서로 다른 버전에 도입하고 사용되지 않는 여러 기능이 결합되면 그 지루한 될 수 있습니다. 내 경험에 비추어 볼 때 glibc 구현 버전에 따라 이식성을 유지하기가 어려울 수 있습니다.

CMake platform checks이 있지만 확인에 도움이되는 것 같습니다. 따라서 make이 아닌 cmake 동안 오류가 발생하지만 올바른 기능 테스트 매크로를 수동으로 파악해야합니다.

cmake-compile-features은 라이브러리가 아닌 컴파일러와 직접 관련된 기능 만 제공합니다.

답변

0

함수 또는 변수의 존재 여부 만 확인하려는 경우 CheckSymbolExists 모듈을 사용할 수 있습니다. 마찬가지로 구조체에는 CheckStructHasMember이 있습니다 (확인할 수있는 표준 멤버가 있다고 가정). 그래서 :

include (CheckSymbolExists) 
include (CheckStructHasMember) 

CHECK_SYMBOL_EXISTS(CPU_SET_ZERO sched.h CPU_SET_ZERO_exists) 
CHECK_SYMBOL_EXISTS(sched_setaffinity sched.h sched_setaffinity_exists) 
CHECK_STRUCT_HAS_MEMBER(cpu_set_t <member?> sched.h cpu_set_t_exists) 

cpu_set_t가 불투명 한 유형 않은 것 같습니다, 그래서 대신 당신은 try_compile 명령에 대한 프론트 엔드입니다 CheckCXXSourceCompiles 모듈을 사용할 수 있습니다. 특정 코드가 컴파일되는지 여부를 결정하는 일반적인 방법입니다. try_compile은 'base'CMake가 기능을 결정하기 위해 광범위하게 사용합니다 (Modules 디렉토리에서 검색을 시도하십시오!). 기본적으로 최소한의 소스 파일에이 파일을 전달합니다.이 파일은 기능이 없으면 컴파일이 실패하고 CMake 스크립트에 결과를보고합니다.