CMake命令

CMake手冊詳解,做者翻譯的很詳細,如下是本身進行的摘錄:html

CMake80個命令(詳細解釋能夠看here

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實例的屬性。

CMD#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)的規則。

    install(TARGETS targets... [EXPORT <export-name>]
    [[ARCHIVE|LIBRARY|RUNTIME|FRAMEWORK|BUNDLE|
    PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE] //有5中能夠被安裝的目標文件:ARCHIVE存檔,LIBRARY庫,RUNTIME運行時間,FRAMEWORK框架,和BUNDLE批量。 [DESTINATION <dir>] [PERMISSIONS permissions...] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT <component>] [OPTIONAL] [NAMELINK_ONLY|NAMELINK_SKIP] ] [...])
    //除了被標記爲MACOSX_BUNDLE屬性的可執行文件被當作OS X上的BUNDLE目標外,其餘的可執行文件都被當作RUNTIME目標。
    靜態連接的庫文件老是被當作ARCHIVE目標。模塊庫老是被當作LIBRARY目標。
    對於動態庫不是DLL格式的平臺來講,動態庫會被當作LIBRARY目標來對待,被標記爲FRAMEWORK的動態庫是例外,它們被當作OS X上的FRAMEWORK目標。對於DLL平臺而言,動態庫的DLL部分被當作一個RUNTIME目標而對應的導出庫被當作是一個ARCHIVE目標。
    全部基於Windows的系統,包括Cygwin,都是DLL平臺。ARCHIVE,LIBRARY,RUNTIME和FRAMEWORK參數改變了後續屬性會加諸之上的目標的類型。若是隻給出了一種類型,那麼只有那種類型的目標會被安裝(這樣一般只會安裝一個DLL或者一個導出庫。)

    //能夠指定NAMELINK_ONLY或者NAMELINK_SKIP選項做爲LIBRARY選項。在一些平臺上,版本化的共享庫有一個符號連接,好比lib<name>.so -> lib<name>.so.1,其中「lib<name>.so.1」是so庫文件名(soname)而「lib<name>.so」是一個符號連接,
    當指定「-l<name>」選項時,連接器將會查找這個符號連接。若是一個庫目標已經被安裝,NAMELINK_ONLY選項表示僅僅安裝符號連接;而NAME_SKIP選項則表示僅僅安裝庫文件而不是符號連接。當兩種選項都沒有給出時,動態庫的兩個部分都會被安裝。
    在那些版本化的共享庫沒有符號連接或者庫沒有被版本化的平臺,選項NAMELINK_SKIP安裝這個庫,而NAMELINK_ONLY選項什麼都不會安裝。
 在該命令的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版本中指定的默認權限。
  • SCRIPTCODE版本的install命令

    install([[SCRIPT <file>] [CODE <code>]] [...])
  • EXPORT版本的install命令

 

install(EXPORT <export-name> DESTINATION <dir>
[NAMESPACE <namespace>] [FILE <name>.cmake]
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>])

 

 

 

 

CMD#50 :link_directories 指定鏈接器查找庫的路徑。

相關文章
相關標籤/搜索