1. 程式人生 > >使用CMake來編寫平臺相關的檢查 -- use google translate

使用CMake來編寫平臺相關的檢查 -- use google translate

CMake的:如何編寫平臺檢查
如果你想編寫軟體編制,在不同作業系統上執行,你必須對不同平臺的特殊性質的照顧。在不同的作業系統有細微的差別,例如在FreeBSD你不應該使用malloc.h,而這是完全可以在Linux上使用它。處理這些差異通常是通過提供一個頭檔案,它包含了定義,根據平臺效能報表,通常命名為config.h中一堆:

1#定義HAVE_MALLOC_H
/ *#民主 基金HAVE_SYS_MNTTAB_H 1 * /
/ *#民主基金HAVE_SYS_MNTENT_H 1 * /
1#定義HAVE_SYS_MOUNT_H
然後,這個標頭檔案包含在原始檔和妥善處理:

foo.c的:

#include “config.h”

#ifdef HAVE_MALLOC_H
#include <malloc.h>
#else
#include <stdlib.h>
#endif

無效do_something()

   
*緩衝區=無效的malloc(1024);
...

對config.h中的內容取決於所在的來源是編譯平臺,因此需要有一種方法來生成這個標頭檔案在實際編制過程開始。如果您使用的自動工具為基礎的軟體,你可能知道。/ configure這一步,已經開始做之前必須執行。在。/ configure指令碼做一些系統的反思,並從收集資訊的config.h標頭檔案生成。 CMake是能夠做到的一樣,我會告訴你如何去做。

此外以內建的命令,通過提供的CMake CMake的指令碼檔案,稱為模組實現更多的命令。這些檔案位於CMake的模組目錄,在UNIX系統預設是這個/ USR的/地方/股/的CMake /單元。

若要使用這些模組的命令,他們必須在的CMakeLists.txt中。 CMake的來了,他們都遵循一個例子CHECK_INCLUDE_FILES同一風格,以檢查系統的幾個模組:

包括(CheckIncludeFiles)
#用法:CHECK_INCLUDE_FILES(<header> <RESULT_VARIABLE>)

CHECK_INCLUDE_FILES(malloc.h HAVE_MALLOC_H)
CHECK_INCLUDE_FILES(“系統/ param.h;系統/ mount.h”HAVE_SYS_MOUNT_H)
CONFIGURE_FILE($(CMAKE_CURRENT_SOURCE_DIR)/ $(CMAKE_CURRENT_BINARY_DIR config.h.in)/ config.h中)
CMake的模組CheckIncludeFiles提供了命令CHECK_INCLUDE_FILES()。的第一個引數此命令是頭部,你要檢查。第二個引數是變數將包含結果。如果給定的頭被發現,它被設定為1,否則是空的。如果另一頭是需要使用的頭,你所尋找的,你要列出標頭檔案用分號隔開,你可以在上面看到。要檢視CHECK_INCLUDE_FILES()到底,有一個在執行看看吧:/ usr /本地/共享/ CMake的/模組/ CheckIncludeFiles.cmake。在那裡你會看到它試圖編譯一個簡單的原始檔,其中包括指定的標頭檔案。該測試的結果儲存在檔案CMakeCache.txt,所以如果你想檢查後測試是否成功或不看在CMakeCache.txt檔案:

/ /有包括HAVE_MALLOC_H
HAVE_MALLOC_H:內部= 1
只要長期的結果快取,測試將不會被再次執行。如果你想讓它再一次被執行,或者刪除該檔案CMakeCache.txt,那麼所有的測試將再次執行,或者僅僅刪除的變數,你希望有再次測試的專案。這樣可以節省一些時間。如果測試失敗,你要找出原因,開啟CMakeFiles / CMakeError.log和標題名稱(或功能等)搜尋你測試。在那裡你會看到程式碼無法編譯或連結時,編譯命令和錯誤資訊。連同在CheckIncludeFiles.cmake測試實現你應該能夠找出什麼地方出了錯。

好了,現在我們已經測試是否如malloc.h存在,並在cmake的變數HAVE_MALLOC_H因此,我們仍然要建立一個頭的config.h。要做到這一點,我們使用cmake的命令CONFIGURE_FILE(),正如你上面看到的。這將複製原始檔到目標檔案並編輯它,而這樣做,詳見手冊頁。因此,我們寫了一個原始檔名為config.h.in,但你可以給它的任何您想要的名稱(它也通常命名為config.h.in autotools的):

1#cmakedefine HAVE_MALLOC_H
#cmakedefine HAVE_SYS_MOUNT_H
現在,當CMake的執行,它將取代#cmakedefine。如果HAVE_MALLOC_H和HAVE_SYS_MOUNT_H是真的,它會產生的config.h:

1#定義HAVE_MALLOC_H
#定義HAVE_SYS_MOUNT_H
如果兩個都是假的,這將產生:

/ *#民主基金HAVE_MALLOC_H 1 * /
/ *#定義HAVE_SYS_MOUNT_H * /
通過包括這頭到您的原始檔,您可以檢查這些屬性使用#ifdef。這種檢查可以插入在任何專案中的CMakeLists.txt不僅在頂層的CMakeLists.txt。如果您有多個配置的頭,你不應該把它們命名為所有的config.h,這可能導致與包含路徑的問題。最好給他們喜歡的config.h名稱,配置為在配置子目錄富頭foo.h /和配置,在酒吧/子目錄,等等bar.h

用cmake的未來進行系統檢查其他命令按照這種風格,所以我們可以處理它們更短了。

模組
包括(CheckIncludeFiles)
用法
CHECK_INCLUDE_FILES(標頭變數)
範例
CHECK_INCLUDE_FILES(strings.h HAVE_STRINGS_H)
正如剛才冗長的討論,這可以用來檢查一個頭的存在。

模組
包括(CheckFunctionExists)
用法
CHECK_FUNCTION_EXISTS(函式變數)
範例
CHECK_FUNCTION_EXISTS(madvise HAVE_MADVISE)
檢查是否存在給定的函式。這是通過將一個小程式,它可能不會導致未定義的引用。

模組
包括(CheckSymbolExists)
用法
CHECK_SYMBOL_EXISTS(符號標題變數)
範例
CHECK_SYMBOL_EXISTS((LC_MESSAGES“locale.h中”HAVE_LC_MESSAGES)
檢查是否存在給定的符號,如果指定的標頭也包括在內。

模組
包括(CheckLibraryExists)
用法
CHECK_LIBRARY_EXISTS(庫函式的位置變數)
範例
CHECK_LIBRARY_EXISTS(volmgt volmgt_running“”HAVE_VOLMGT)
檢查是否存在給定的庫和包含給定的函式。這是通過將一個小程式,它使用功能和圖書館的連結。在一個額外的連結位置引數目錄(- Ldir)如果需要的話可以考慮。

模組
包括(CheckTypeSize)
用法
套裝(CMAKE_EXTRA_INCLUDE_FILES頭)
CHECK_TYPE_SIZE(型別變數)
套裝(CMAKE_EXTRA_INCLUDE_FILES)
範例
設定(CMAKE_EXTRA_INCLUDE_FILES sys / socket.h中)
CHECK_TYPE_SIZE(“結構ucred”STRUCT_UCRED)
套裝(CMAKE_EXTRA_INCLUDE_FILES)
檢查是否存在指定的型別和返回型別的大小。在變數的型別的大小將被退回,另外一個變數HAVE_STRUCT_UCRED將被設定為true,如果存在的型別。請不要認為你必須設定CMAKE_EXTRA_INCLUDE_FILES為這種型別所需的標頭檔案,你應該呼叫CHECK_TYPE_SIZE後重置它。如果你是不是真的有興趣在該型別的大小,但只有它是否存在與否,你也可以使用STRUCT_UCRED直接,如果型別不存在,這將是空的,所以也計算為假(如將HAVE_STRUCT_UCRED )。

模組
包括(CheckPrototypeExists)
用法
CHECK_PROTOTYPE_EXISTS(函式頭變數)
範例
CHECK_PROTOTYPE_EXISTS(mkstemps“stdlib.h中; unistd.h”HAVE_MKSTEMPS_PROTO)
頭檢查是否為給定函式的宣告,即不檢查是否使用功能將導致未定義的引用。

模組
包括(CheckCXXSourceCompiles)
包括(CheckCSourceCompiles)
用法
CHECK_CXX_SOURCE_COMPILES(源變數)
CHECK_C_SOURCE_COMPILES(源變數)
檢查是否在給定的原始碼將編譯和連結。您可以設定CMAKE_REQUIRED_LIBRARIES,CMAKE_REQUIRED_FLAGS和CMAKE_REQUIRED_INCLUDES因此,如果額外的庫或編譯器標誌是必需的。

-----------------