CMake手冊詳解,做者翻譯的很詳細,如下是本身進行的摘錄:html
CMD#1: add_custom_command爲生成的構建系統添加一條自定義的構建規則。正則表達式
add_custom_command命令有兩種主要的功能;第一種是爲了生成輸出文件,添加一條自定義命令;第二種是爲一個目標——好比一個庫文件或者可執行文件——添加一條自定義命令。
add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[MAIN_DEPENDENCY depend]
[DEPENDS [depends...]]
[IMPLICIT_DEPENDS <lang1> depend1 ...] [WORKING_DIRECTORY dir] [COMMENT comment] [VERBATIM] [APPEND])
add_custom_command(TARGET target
PRE_BUILD | PRE_LINK | POST_BUILD COMMAND command1 [ARGS] [args1...] [COMMAND command2 [ARGS] [args2...] ...] [WORKING_DIRECTORY dir] [COMMENT comment] [VERBATIM])
CMD#2: add_custom_target添加一個目標,它沒有輸出;這樣它就老是會被構建。shell
add_custom_target(Name [ALL] [command1 [args1...]]
[COMMAND command2 [args2...] ...]
[DEPENDS depend depend depend ... ]
[WORKING_DIRECTORY dir]
[COMMENT comment] [VERBATIM]
[SOURCES src1 [src2...]])
CMD#3:add_definitions 爲源文件的編譯添加由-D引入的define flag。express
add_definitions(-DFOO -DBAR ...)
CMD#4:add_dependencies 爲頂層目標引入一個依賴關係。框架
add_dependencies(target-name depend-target1 depend-target2 ...)
CMD#5:add_executable: 使用給定的源文件,爲工程生成一個可執行文件。函數
add_executable(<name> [WIN32] [MACOSX_BUNDLE] //<name>對應於邏輯目標名字,而且在工程範圍內必須是全局惟一的(好比<name>.exe或者僅僅是<name>)。若是指定了MACOSX_BUNDLE選項,對應的屬性會附加在建立的目標上。
[EXCLUDE_FROM_ALL] //若是指定了EXCLUDE_FROM_ALL選項,對應的屬性將會設置在被建立的目標上。
source1 source2 ... sourceN)
CMD#6:add_library 使用指定的源文件向工程中添加一個庫。post
add_library(<name> [STATIC | SHARED | MODULE] //<name>對應於邏輯目標名稱,並且在一個工程的全局域內必須是惟一的(好比lib<name>.a或者<name>.lib)。指定STATIC,SHARED,或者MODULE參數用來指定要建立的庫的類型。
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
CMD#7:add_subdirectory 爲構建添加一個子路徑。測試
add_subdirectory(source_dir [binary_dir] //source_dir選項指定了CMakeLists.txt源文件和代碼文件的位置。binary_dir選項指定了輸出文件的路徑。
[EXCLUDE_FROM_ALL]) //若是指定了EXCLUDE_FROM_ALL選項,在子路徑下的目標默認不會被包含到父路徑的ALL目標裏,而且也會被排除在IDE工程文件以外。
CMD#8:add_test 以指定的參數爲工程添加一個測試。ui
add_test(testname Exename arg1 arg2 ... ) //若是已經運行過了ENABLE_TESTING [20]命令,這個命令將爲當前路徑添加一個測試目標。若是ENABLE_TESTING尚未運行過,該命令啥事都不作。
//測試是由測試子系統運行的,它會以指定的參數執行Exename文件。Exename或者是由該工程構建的可執行文件,也能夠是系統上自帶的任意可執行文件(好比tclsh)。該測試會在CMakeList.txt文件的當前工做路徑下運行,這個路徑與二進制樹上的路相對應。
add_test(NAME <name> [CONFIGURATIONS [Debug|Release|...]]
COMMAND <command> [arg1 [arg2 ...]])
CMD#9:aux_source_directory 查找在某個路徑下的全部源文件。url
aux_source_directory(<dir> <variable>)
CMD#10:break 從一個包圍該命令的foreach或while循環中跳出。
CMD#11:build_command 獲取構建該工程的命令行。
build_command(<variable>
[CONFIGURATION <config>] [PROJECT_NAME <projname>] [TARGET <target>])
CMD#12:cmake_minimum_required 設置一個工程所須要的最低CMake版本。
cmake_minimum_required(VERSION major[.minor[.patch[.tweak]]] [FATAL_ERROR]) //若是CMake的當前版本低於指定的版本,它會中止處理工程文件,並報告錯誤。
//當指定的版本高於2.4時,它會隱含調用:
cmake_policy(VERSION major[.minor[.patch[.tweak]]])
//從而將cmale的策略版本級別設置爲指定的版本。當指定的版本是2.4或更低時,這條命令隱含調用:
cmake_policy(VERSION 2.4)
CMD#13:cmake_policy 管理CMake的策略設置。
cmake_policy(VERSION major.minor[.patch[.tweak]]) //cmake_policy是用來設置「新行爲」或「舊行爲」的命令。若是支持單獨設置策略,咱們鼓勵各項目根據CMake的版原本設置策略。
CMD#14:configure_file: 將一份文件拷貝到另外一個位置並修改它的內容。
configure_file(<input> <output>
[COPYONLY] [ESCAPE_QUOTES] [@ONLY])
CMD#15:create_test_sourcelist: 爲構建測試程序建立一個測試驅動器和源碼列表。
create_test_sourcelist(sourceListName driverName
test1 test2 test3
EXTRA_INCLUDE include.h
FUNCTION function)
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...])
CMD#17:else 開始一個if語句塊的else部分。(參見if命令。)
CMD#18: elseif 開始 if 塊的 elseif 部分。
CMD#19: enable_language 支持某種語言(CXX/C/Fortran/等)
enable_language(languageName [OPTIONAL] )
CMD#20: enable_testing 打開當前及如下目錄中的測試功能。
enable_testing()
CMD#21: endforeach 結束foreach語句塊中的一系列命令。
CMD#22: endfunction 結束一個function語句塊中的一系列命令。
CMD#23: endif 結束一個if語句塊中的一系列命令。
CMD#24: endmacro 結束一個macro語句塊中的一系列命令。
CMD#25:endwhile結束一個while語句塊中的一系列命令。
CMD#26: execute_process 執行一個或更多個子進程。
execute_process(COMMAND <cmd1> [args1...]]
[COMMAND <cmd2> [args2...] [...]] [WORKING_DIRECTORY <directory>] [TIMEOUT <seconds>] [RESULT_VARIABLE <variable>] [OUTPUT_VARIABLE <variable>] [ERROR_VARIABLE <variable>] [INPUT_FILE <file>] [OUTPUT_FILE <file>] [ERROR_FILE <file>] [OUTPUT_QUIET] [ERROR_QUIET] [OUTPUT_STRIP_TRAILING_WHITESPACE] [ERROR_STRIP_TRAILING_WHITESPACE])
CMD#27:export 從構建樹中導出目標供外部使用。
export(TARGETS [target1 [target2 [...]]] [NAMESPACE <namespace>] [APPEND] FILE <filename>)
CMD#28: file 文件操做命令
file(WRITE filename "message to write"... ) file(APPEND filename "message to write"... ) file(READ filename variable [LIMIT numBytes] [OFFSET offset] [HEX]) file(STRINGS filename variable [LIMIT_COUNT num] [LIMIT_INPUT numBytes] [LIMIT_OUTPUT numBytes] [LENGTH_MINIMUM numBytes] [LENGTH_MAXIMUM numBytes] [NEWLINE_CONSUME] [REGEX regex] [NO_HEX_CONVERSION]) file(GLOB variable [RELATIVE path] [globbing expressions]...) file(GLOB_RECURSE variable [RELATIVE path] [FOLLOW_SYMLINKS] [globbing expressions]...) file(RENAME <oldname> <newname>) file(REMOVE [file1 ...]) file(REMOVE_RECURSE [file1 ...]) file(MAKE_DIRECTORY [directory1 directory2 ...]) file(RELATIVE_PATH variable directory file) file(TO_CMAKE_PATH path result) file(TO_NATIVE_PATH path result) file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log] [EXPECTED_MD5 sum] [SHOW_PROGRESS])
CMD#29:find_file 查找一個文件的完整路徑。
find_file(<VAR> name1 [path1 path2 ...])
CMD#30:find_library 查找一個庫文件
find_library(<VAR> name1 [path1 path2 ...]) //它與命令find_library(<VAR> name1 [PATHS path1 path2 ...])等價。
CMD#31:find_package
查找並加載外來工程的設置。
find_package(<package> [version] [EXACT] [QUIET][[REQUIRED|COMPONENTS] [components...]] [NO_POLICY_SCOPE]) //[version]參數須要一個版本號。 EXACT選項要求該版本號必須精確匹配。
//該命令會設置<package>_FOUND變量,用來指示要找的包是否被找到了。若是這個包被找到了,與它相關的信息能夠經過包自身記載的變量中獲得。
//REQUIRED選項表示若是包沒有找到的話,cmake的過程會終止,並輸出警告信息。
//在REQUIRED選項以後,或者若是沒有指定REQUIRED選項可是指定了COMPONENTS選項,在它們的後面能夠列出一些與包相關的部件清單(components list)。
CMD#32 :
find_path 搜索包含某個文件的路徑
find_path(<VAR> name1 [path1 path2 ...]) //它與命令find_path(<VAR> name1 [PATHS path1 path2 ...])等價。
CMD#33:find_program 查找可執行程序
find_program(<VAR> name1 [path1 path2 ...]) //它與命令find_program(<VAR> name1 [PATHS path1 path2 ...])等價。
CMD#34:fltk_wrap_ui 建立FLTK用戶界面包裝器。
fltk_wrap_ui(resultingLibraryName source1 source2 ... sourceN ) //爲全部列出的.fl和.fld文件生成.h和.cxx文件。這些生成的.h和.cxx文件將會加到變量resultingLibraryName_FLTK_UI_SRCS中,它也會加到你的庫中。
CMD#35:foreach
對一個list中的每個變量執行一組命令。
CMD#36 :
function
開始記錄一個函數,爲之後以命令的方式調用它作準備。
CMD#37 : get_cmake_property 獲取一個CMake實例的屬性。
C
MD#38 : get_directory_property
獲取DIRECTORY域中的某種屬性。
CMD#39 : get_filename_component 獲得一個完整文件名中的特定部分。
CMD#40 : get_property 獲取一個屬性值
CMD#41 : get_source_file_property 爲一個源文件獲取一種屬性值。
CMD#42 : get_target_property 從一個目標中獲取一個屬性值。
CMD#43 : get_test_property 獲取一個測試的屬性。
CMD#44 : if 條件執行一組命令。
CMD#45 : include 從給定的文件中讀取CMake的列表文件。
include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR> [NO_POLICY_SCOPE])
CMD#46 : include_directories 爲構建樹添加包含路徑。
include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...) //將給定的路徑添加到編譯器搜索包含文件(.h文件)的路徑列表中。
CMD#47 : include_external_msproject 在一個workspace中包含一個外部的Microsoft工程。
include_external_msproject(projectname location dep1 dep2 ...)
CMD#48 : include_regular_expression 設置用於依賴性檢查的正則表達式。
include_regular_expression(regex_match [regex_complain])
CMD#49 : install 指定在安裝時要運行的規則。
TARGETS版本的install命令規定了安裝工程中的目標(targets)的規則。
在該命令的TARGETS版本的一次調用中,能夠一次性指定一個或多個屬性組。一個目標也能夠被屢次安裝到不一樣的位置。
假設有三個目標myExe,mySharedLib和myStaticLib,下面的代碼:
install(TARGETS myExe mySharedLib myStaticLib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib/static) install(TARGETS mySharedLib DESTINATION /some/full/path)
//將會把myExe安裝到<prefix>/bin目錄下,把myStaticLib安裝到<prefix>/lib/static目錄下。
//在非-DLL平臺上,mySharedLib將會被安裝到<prefix>/lib和/some/full/path下。
//在DLL平臺上,mySharedLib DLL將會被安裝到<prefix>/bin和/some/full/path路徑下,它的導出庫會被安裝到<prefix>/lib/static和/some/full/path路徑下。[對應上面有相應解釋]
FILES版本的install命令指定了爲一個工程安裝文件的規則。
install(FILES files... DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]] [COMPONENT <component>] [RENAME <name>] [OPTIONAL])
//在命令中,以相對路徑方式給出的文件名是相對於當前源代碼路徑而言的。以這個版本安裝的文件,若是沒有指定PERMISSIONS選項,默認會具備OWNER_WRITE,OWNER_READ,GROUP_READ,和WORLD_READ的權限。
PROGRAMS版本的install命令(裝不是目標的程序,好比shell腳本。使用TARGETS格式安裝該工程內部構建的目標。)
install(PROGRAMS files... DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]] [COMPONENT <component>] [RENAME <name>] [OPTIONAL])
//PROGRAMS版本與FILES版本同樣,只在默認權限上有所不一樣:它還包括了OWNER_EXECUTE,GROUP_EXECUTE和WORLD_EXECUTE選項。
DIRECTORY版本的install命令將一個或者多個路徑下的內容安裝到指定的目標地址下。
install(DIRECTORY目錄 dirs... DESTINATION目的地 <dir>
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONS permissions...]
[USE_SOURCE_PERMISSIONS] [OPTIONAL]
[CONFIGURATIONS [Debug|Release|...]] [COMPONENT <component>] [FILES_MATCHING] [[PATTERN <pattern> | REGEX <regex>] [EXCLUDE] [PERMISSIONS permissions...]] [...])
//目錄結構會原封不動地(verbatim)拷貝到目標地址。每一個路徑名的最後一部分會追加到目標路徑下,可是結尾反斜槓(trailing slash)能夠用來避免這一點,由於這樣最後一部分就是空的。
給定的相對路徑名被解釋成相對於當前源路徑的路徑。若是沒有指定輸入目錄名字,目標目錄會被建立,可是不會安裝任何東西。
FILE_PERMISSIONS和DIRECTORY_PERMISSIONS選項指定了賦予目標路徑和目標文件的權限。
若是指定了USE_SOURCE_PERMISSIONS選項,但沒有指定FILE_PERMISSIONS選項,文件權限將沿襲源目錄結構的權限,並且這個路徑會被賦予PAROGRAMS版本中指定的默認權限。
SCRIPT和CODE版本的install命令
install([[SCRIPT <file>] [CODE <code>]] [...])
install(EXPORT <export-name> DESTINATION <dir> [NAMESPACE <namespace>] [FILE <name>.cmake] [PERMISSIONS permissions...] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT <component>])
CMD#50 :link_directories 指定鏈接器查找庫的路徑。