2017-04-04 111 views
1

假設我想使用特定的Linux/POSIX功能,該功能是根據feature test macros有條件地提供的。例如,類型cpu_set_t,宏CPU_SET_ZERO和功能sched_setaffinityCMake是否支持glibc功能測試宏

理想情況下,我只是想告訴CMake我需要這些,它應該找出哪些額外的功能測試宏設置或失敗,如果不能在當前系統上提供一個漂亮的錯誤消息。那可能嗎?

我知道我可以在themanpages查找和手動使用add_definitions(-D_GNU_SOURCE),但是一旦進行了介紹,並棄用不同版本的POSIX標準的多個功能組合,可以成爲乏味。根據我的經驗,在不同版本的glibc實現中保持可移植性會變得很困難。

CMake platform checks,但他們似乎只是幫助檢查。所以我在cmake而不是make中得到錯誤,但我仍然需要手動計算出正確的功能測試宏。

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是一個不透明的類型,這樣反而可以使用CheckCXXSourceCompiles模塊,這對於try_compile命令前端。這是確定是否編譯了特定代碼的通用方法。 'base'CMake廣泛使用try_compile來確定特徵(在Modules目錄中嘗試搜索!)。本質上,你將它傳遞給一個最小的源文件,如果你的特性不存在,它將會失敗編譯,並且它會向你的CMake腳本報告結果。