上周正在准備轉正答辯,手冊翻譯的事情暫時擱淺了一段時間;現在繼續《CMake手冊詳解》之第八篇:
=======================================================
CMD#14:configure_file
: 將一份文件拷貝到另一個位置並修改它的內容。
configure_file(<input> <output>
[COPYONLY] [ESCAPE_QUOTES] [@ONLY])
將文件<input>拷貝到<output>然后替換文件內容中引用到的變量值。如果<input>是相對路徑,它被評估的基礎路徑是當前源碼路徑。<input>必須是一個文件,而不是個路徑。如果<output>是一個相對路徑,它被評估的基礎路徑是當前二進制文件路徑。如果<output>是一個已有的路徑,那么輸入文件將會以它原來的名字放到那個路徑下。
該命令替換掉在輸入文件中,以${VAR}格式或@VAR@格式引用的任意變量,如同它們的值是由CMake確定的一樣。 如果一個變量還未定義,它會被替換為空。如果指定了COPYONLY選項,那么變量就不會展開。如果指定了ESCAPE_QUOTES選項,那么所有被替換的變量將會按照C語言的規則被轉義。該文件將會以CMake變量的當前值被配置。如果指定了@ONLY選項,只有@VAR@格式的變量會被替換而${VAR}格式的變量則會被忽略。這對於配置使用${VAR}格式的腳本文件比較有用。任何類似於#cmakedefine VAR的定義語句將會被替換為#define VAR或者/* #undef VAR */,視CMake中對VAR變量的設置而定。任何類似於#cmakedefine01 VAR的定義語句將會被替換為#define VAR 1或#define VAR 0,視VAR被評估為TRUE或FALSE而定。
(configure_file的作用是讓普通文件也能使用CMake中的變量。——譯注)
CMD#15:create_test_sourcelist
: 為構建測試程序創建一個測試驅動器和源碼列表。
create_test_sourcelist(sourceListName driverName
test1 test2 test3
EXTRA_INCLUDE include.h
FUNCTION function)
測試驅動器是一個將很多小的測試代碼連接為一個單一的可執行文件的程序。這在為了縮減總的需用空間而用很多大的庫文件去構建靜態可執行文件的時候,特別有用。構建測試驅動所需要的源文件列表會在變量sourceListName中。DriverName變量是測試驅動器的名字。其它的參數還包括一個測試源代碼文件的清單,中間可以用分號隔開。每個測試源碼文件中應該有一個與去掉擴展名的文件名同名的函數(比如foo.cxx 文件里應該有int foo(int, char*[]);)(和main的函數簽名一樣——譯注)。DriverName可以在命令行中按名字調用這些測試中的每一個。如果指定了EXTRA_INCLUDE,那么它后面的參數(即include.h——譯注)會被包含到生成的文件里。如果指定了FUNCTION選項,那么它后面的參數(即function——譯注)會被認為是一個函數名,傳遞給它的參數是一個指向argc的指針和argv。這個選項可以用來為每個測試函數添加額外的命令行參數處理過程。CMake變量CMAKE_TESTDRIVER_BEFORE_TESTMAIN用來設置在調用測試的main函數之前調用的代碼。
CMD#16:define_property
: 定義並描述(Document)自定義屬性。
define_property(<GLOBAL | DIRECTORY | TARGET | SOURCE |
TEST | VARIABLE | CACHED_VARIABLE>
PROPERTY <name> [INHERITED]
BRIEF_DOCS <brief-doc> [docs...]
FULL_DOCS <full-doc> [docs...])
在一個域(scope)中定義一個可以用set_property和get_property命令訪問的屬性。這個命令對於把文檔和可以通過get_property命令得到的屬性名稱關聯起來非常有用。第一個參數確定了這個屬性可以使用的范圍。它必須是下列值中的一個:
GLOBAL = 與全局命名空間相關聯
DIRECTORY = 與某一個目錄相關聯
TARGET = 與一個目標相關聯
SOURCE = 與一個源文件相關聯
TEST = 與一個以add_test命名的測試相關聯
VARIABLE = 描述(document)一個CMake語言變量
CACHED_VARIABLE = 描述(document)一個CMake語言緩存變量
注意,與set_property和get_property不相同,不需要給出實際的作用域;只有作用域的類型才是重要的。PROPERTY選項必須有,它后面緊跟要定義的屬性名。如果指定了INHERITED選項,那么如果get_property命令所請求的屬性在該作用域中未設置,它會沿着鏈條向更高的作用域去搜索。DIRECTORY域向上是GLOBAL。TARGET,SOURCE和TEST向上是DIRECTORY。
BRIEF_DOCS和FULL_DOCS選項后面的參數是和屬性相關聯的字符串,分別作為變量的簡單描述和完整描述。在使用get_property命令時,對應的選項可以獲取這些描述信息。