CMakeListx.txt 編輯語法學習


已hello.cpp爲源文件,構建一個CMakeLists.txthtml

cmake_minimum_required(VERSION 2.8)
project(hello)
add_executable(hello hello.cpp)

在目錄中的build 文件夾中進行cmake ..和make ,就能夠編譯源文件生成可運行文件.c++


cmake的經常使用命令:正則表達式

    

project 命令express

    語句 : project(<projectname> [languageName1 languageName2 … ] )windows

    做用 : 指定項目名
函數


cmake_minimum_required 命令
測試

    語句 : cmake_minimum_required(VERSION major[.minor[.patch[.tweak]]] [FATAL_ERROR])ui

    做用 : 指定cmake須要的最小版本url

    

aux_source_directory 命令
spa

    語句 : aux_source_directory(<dir> <variable>)

    做用 : 獲取指定目錄下的全部文件,保存到variable中,包括 .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp .hxx .in .txx文件

    示例 : aux_source_directory(. var)#獲取當前目錄中源文件


add_executable 命令

    語句 : add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)

    做用 : 將指定文件source編譯成可執行文件,命名位name

    示例 : add_executable(hello hello.cpp)


add_library 命令

    語句 : add_library([STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)

    做用 : 添加一個名爲<name>的庫文件,指定STATIC,SHARED,或者MODULE參數用來指定要建立的庫的類型。STATIC庫是目標文件的歸檔文件,在連接其它目標的時候使用。SHARED庫會被動態連接,在運行時被加載。MODULE庫是不會被連接到其它目標中的插件,可是可能會在運行時使用dlopen-系列的函數動態連接。若是沒有類型被顯式指定,這個選項將會根據變量BUILD_SHARED_LIBS的當前值是否爲真決定是STATIC仍是SHARED

    示例 : add_library(Lib ${DIR_SRCS})


add_dependencies 命令

    語句 : add_dependencies(target-name depend-target1 depend-target2 …)

    做用 : 用於指定某個目標(可執行文件或者庫文件)依賴於其餘的目標。這裏的目標必須是 add_executable、add_library、add_custom_target 命令建立的目標


add_subdirectory 命令

    語句 : add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

    做用 : 用於添加一個須要進行構建的子目錄

    示例 : add_subdirectory(directory)


target_link_libraries 命令

    語句 : target_link_libraries(<target> [item1 [item2 […]]] [[debug|optimized|general] ] …)

    做用 : 用於指定 target 須要連接 item1 item2 …。這裏 target 必須已經被建立,連接的 item 能夠是已經存在的 target(依賴關係會自動添加)

    示例 : target_link_libraries(Main Lib)


set 命令

    語句 : set(<variable> <value> [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])

    做用 : 用於設定變量 variable 的值爲 value。variable能夠本身定義

    示例 : set(var "${list}_exe")


unset 命令

    語句 : unset(<variable> [CACHE])

    做用 : 用於移除變量 variable。若是指定了 CACHE 變量將被從 Cache 中移除。

    示例 : unset(VAR CACHE)


message 命令

    語句 : message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] 「message to display」 …)

    做用 : 輸出信息

    示例 : message("hello world")


include_directories 命令

    語句 : include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)

    做用 : 用於設定目錄,這些設定的目錄將被編譯器用來查找 include 文件

    示例 : include_directories(${PROJECT_SOURCE_DIR}/lib)


find_path 命令

    語句 : find_path(<VAR> name1 [path1 path2 …])

    做用 : 用於查找包含文件 name1 的路徑,若是找到則將路徑保存在 VAR 中(此路徑爲一個絕對路徑),若是沒有找到則結果爲 <VAR>-NOTFOUND。默認的狀況下,VAR 會被保存在 Cache 中,這時候咱們須要清除 VAR 才能夠進行下一次查詢(使用 unset 命令)


add_definitions 命令

    語句 : find_library(<VAR> name1 [path1 path2 …])

    做用 : 用於添加編譯器命令行標誌(選項),一般的狀況下咱們使用其來添加預處理器定義

    示例 : add_definitions(-D_UNICODE -DUNICODE)

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])


    做用 : 用於執行一個或者多個外部命令。每個命令的標準輸出經過管道轉爲下一個命令的標準輸入。WORKING_DIRECTORY 用於指定外部命令的工做目錄,RESULT_VARIABLE 用於指定一個變量保存外部命令執行的結果,這個結果多是最後一個執行的外部命令的退出碼或者是一個描述錯誤條件的字符串,OUTPUT_VARIABLE 或者 ERROR_VARIABLE 用於指定一個變量保存標準輸出或者標準錯誤,OUTPUT_QUIET 或者 ERROR_QUIET 用於忽略標準輸出和標準錯誤。

    示例 : execute_process(COMMAND ls)


file 命令

    語句 : file(WRITE filename "message to write"... ) 

    做用 : WRITE選項將會寫一條消息到名爲filename的文件中。若是文件已經存在,該命令會覆蓋已有的文件;若是文件不存在,它將建立該文件。


    ===========================================================


    語句 : file(APPEND filename "message to write"... )

    做用 : APPEND選項和WRITE選項同樣,將會寫一條消息到名爲filename的文件中,只是該消息會附加到文件末尾。 


    ===========================================================


    語句 : file(READ filename variable [LIMIT numBytes] [OFFSET offset] [HEX]) 

    做用 : READ選項將會讀一個文件中的內容並將其存儲在變量裏。讀文件的位置從offset開始,最多讀numBytes個字節。若是指定了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]) 

    做用 : STRINGS將會從一個文件中將一個ASCII字符串的list解析出來,而後存儲在variable變量中。文件中的二進制數據會被忽略。回車換行符會被忽略。它也能夠用在Intel的Hex和Motorola的S-記錄文件;讀取它們時,它們會被自動轉換爲二進制格式。可使用NO_HEX_CONVERSION選項禁止這項功能。LIMIT_COUNT選項設定了返回的字符串的最大數量。LIMIT_INPUT設置了從輸入文件中讀取的最大字節數。LIMIT_OUTPUT設置了在輸出變量中存儲的最大字節數。LENGTH_MINIMUM設置了要返回的字符串的最小長度;小於該長度的字符串會被忽略。LENGTH_MAXIMUM設置了返回字符串的最大長度;更長的字符串會被分割成不長於最大長度的字符串。NEWLINE_CONSUME選項容許新行被包含到字符串中,而不是終止它們。REGEX選項指定了一個待返回的字符串必須知足的正則表達式。 


    ===========================================================


    語句 : file(GLOB variable [RELATIVE path] [globbing expressions]...) 

    做用 : GLOB選項將會爲全部匹配查詢表達式的文件生成一個文件list,並將該list存儲進變量variable裏。文件名查詢表達式與正則表達式相似,只不過更加簡單。若是爲一個表達式指定了RELATIVE標誌,返回的結果將會是相對於給定路徑的相對路徑。 


    ===========================================================


     語句 : file(GLOB_RECURSE variable [RELATIVE path] [FOLLOW_SYMLINKS] [globbing expressions]...) 

    做用 : GLOB_RECURSE選項將會生成一個相似於一般的GLOB選項的list,只是它會尋訪全部那些匹配目錄的子路徑並同時匹配查詢表達式的文件。做爲符號連接的子路徑只有在給定FOLLOW_SYMLINKS選項或者cmake策略CMP0009被設置爲NEW時,纔會被尋訪到。參見cmake --help-policy CMP0009 查詢跟多有用的信息。 


    ===========================================================


    語句 : file(RENAME <oldname> <newname>) 

    做用 : RENAME選項對同一個文件系統下的一個文件或目錄重命名。

 

    ===========================================================


    語句 : file(REMOVE [file1 ...]) 

    做用 : REMOVE選項將會刪除指定的文件,包括在子路徑下的文件。

    ===========================================================


    語句 : file(REMOVE_RECURSE [file1 ...]) 

    做用 : REMOVE_RECURSE選項會刪除給定的文件以及目錄,包括非空目錄。 


    ===========================================================


    語句 : file(MAKE_DIRECTORY [directory1 directory2 ...]) 

    做用 : MAKE_DIRECTORY選項將會建立指定的目錄,若是它們的父目錄不存在時,一樣也會建立。(相似於mkdir命令——譯註) 


    ===========================================================


    語句 : file(RELATIVE_PATH variable directory file) 

    做用 : RELATIVE_PATH選項會肯定從direcroty參數到指定文件的相對路徑。 


    ===========================================================


    語句 : file(TO_CMAKE_PATH path result) 

    做用 : TO_CMAKE_PATH選項會把path轉換爲一個以unix的 / 開頭的cmake風格的路徑。輸入能夠是一個單一的路徑,也能夠是一個系統路徑,好比"$ENV{PATH}"。注意,在調用TO_CMAKE_PATH的ENV周圍的雙引號只能有一個參數(Note the double quotes around the ENV call TO_CMAKE_PATH only takes one argument. 原文如此。 


    ===========================================================


    語句 : file(TO_NATIVE_PATH path result) 

    做用 : TO_NATIVE_PATH選項與TO_CMAKE_PATH選項很類似,可是它會把cmake風格的路徑轉換爲本地路徑風格:windows下用\,而unix下用/。 


    ===========================================================


    語句 : file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log] [EXPECTED_MD5 sum] [SHOW_PROGRESS]) 

    做用 : DOWNLOAD 將給定的URL下載到指定的文件中。若是指定了LOG var選項,下載日誌將會被輸出到var中。若是指定了STATUS var選項,下載操做的狀態會被輸出到var中。該狀態返回值是一個長度爲2的list。list的第一個元素是操做的數字返回值,第二個返回值是錯誤的字符串值。錯誤信息若是是數字0,操做中沒有發生錯誤。若是指定了TIMEOUT time選項,在time秒以後,操做會超時退出;time應該是整數。若是指定了EXPECTED_MD5 sum選項,下載操做會認證下載的文件的實際MD5和是否與指望值匹配。若是不匹配,操做將返回一個錯誤。若是指定了SHOW_PROGRESS選項,進度信息會以狀態信息的形式被打印出來,直到操做完成。


cmake 經常使用語句

    

條件控制

======================  

      if(expression)

        # ...

        elseif(expression2)

            # ...

        else()

            # ...

        endif()

======================

    對於 if(string) 來講:

  1. 若是 string 爲(不區分大小寫)一、ON、YES、TRUE、Y、非 0 的數則表示真

  2. 若是 string 爲(不區分大小寫)0、OFF、NO、FALSE、N、IGNORE、空字符串、以 -NOTFOUND 結尾的字符串則表示假

  3. 若是 string 不符合上面兩種狀況,則 string 被認爲是一個變量的名字。變量的值爲第二條所述的各值則表示假,不然表示真


===========================================================

    if中的語句:

  1. if(NOT expression)
    爲真的前提是 expression 爲假

  2. if(expr1 AND expr2)
    爲真的前提是 expr1 和 expr2 都爲真

  3. if(expr1 OR expr2)
    爲真的前提是 expr1 或者 expr2 爲真

  4. if(COMMAND command-name)
    爲真的前提是存在 command-name 命令、宏或函數且可以被調用

  5. if(EXISTS name)
    爲真的前提是存在 name 的文件或者目錄(應該使用絕對路徑)

  6. if(file1 IS_NEWER_THAN file2)
    爲真的前提是 file1 比 file2 新或者 file一、file2 中有一個文件不存在(應該使用絕對路徑)

  7. if(IS_DIRECTORY directory-name)
    爲真的前提是 directory-name 表示的是一個目錄(應該使用絕對路徑)

  8. if(variable|string MATCHES regex)
    爲真的前提是變量值或者字符串匹配 regex 正則表達式

  9. if(variable|string LESS variable|string)
    if(variable|string GREATER variable|string)
    if(variable|string EQUAL variable|string)
    爲真的前提是變量值或者字符串爲有效的數字且知足小於(大於、等於)的條件

  10. if(variable|string STRLESS variable|string)
    if(variable|string STRGREATER variable|string)
    if(variable|string STREQUAL variable|string)
    爲真的前提是變量值或者字符串以字典序知足小於(大於、等於)的條件

  11. if(DEFINED variable)
    爲真的前提是 variable 表示的變量被定義了


循環結構

    foreach循環

======================

        set(VAR a b c)

        foreach(f ${VAR})

            message(${f})

        endforeach()

====================== 

    


    while循環

======================

        set(VAR 5)

        while(${VAR} GREATER 0)

            message(${VAR})

            math(EXPR VAR "${VAR} - 1")

        endwhile()

======================



宏定義

    macro循環

======================

        # 定義一個宏 hello

        macro(hello MESSAGE)

            message(${MESSAGE})

        endmacro()

        # 調用宏 hello

        hello("hello world")

        # 定義一個函數 hello

        function(hello MESSAGE)

            message(${MESSAGE})

        endfunction()

======================


函數定義

    

======================

        function(get_func RESULT)

            # RESULT 的值爲實參的值,所以須要使用 ${RESULT}

            # 這裏使用 PARENT_SCOPE 是由於函數會構建一個局部做用域

            set(${RESULT} "Hello Function" PARENT_SCOPE)

        endfunction()

         

        macro(get_macro RESULT)

            set(${RESULT} "Hello Macro")

        endmacro()

         

        get_func(V1)

        # 輸出 Hello Function

        message(${V1})

         

        get_macro(V2)

        # 輸出 Hello Macro

        message(${V2})


======================


字符串控制

    string(REGEX MATCH (regular_expression) (output variable) (input) [(input)...])
    string(REGEX MATCHALL (regular_expression) (output variable) (input) [(input)...])
    string(REGEX REPLACE (regular_expression) (replace_expression) (output variable) (input) [(input)...])
    string(REPLACE (match_string) (replace_string) (output variable) (input) [(input)...])
    string(COMPARE EQUAL (string1) (string2) (output variable))
    string(COMPARE NOTEQUAL (string1) (string2) (output variable))
    string(COMPARE LESS (string1) (string2) (output variable))
    string(COMPARE GREATER (string1) (string2) (output variable))
    string(ASCII (number) [(number) ...] (output variable))
    string(CONFIGURE (string1) (output variable) [@ONLY] [ESCAPE_QUOTES])
    string(TOUPPER (string1) (output variable))
    string(TOLOWER (string1) (output variable))
    string(LENGTH (string) (output variable))
    string(SUBSTRING (string) (begin) (length) (output variable))
    string(STRIP (string) (output variable))
    string(RANDOM [LENGTH (length)] [ALPHABET (alphabet)] (output variable))




cmake 經常使用變量


  1. UNIX 若是爲真,表示爲 UNIX-like 的系統,包括 Apple OS X 和 CygWin

  2. WIN32 若是爲真,表示爲 Windows 系統,包括 CygWin

  3. APPLE 若是爲真,表示爲 Apple 系統

  4. CMAKE_SIZEOF_VOID_P 表示 void* 的大小(例如爲 4 或者 8),可使用其來判斷當前構建爲 32 位仍是 64 位

  5. CMAKE_CURRENT_LIST_DIR 表示正在處理的 CMakeLists.txt 文件的所在的目錄的絕對路徑(2.8.3 以及之後版本才支持)

  6. CMAKE_ARCHIVE_OUTPUT_DIRECTORY 用於設置 ARCHIVE 目標的輸出路徑

  7. CMAKE_LIBRARY_OUTPUT_DIRECTORY 用於設置 LIBRARY 目標的輸出路徑

  8. CMAKE_RUNTIME_OUTPUT_DIRECTORY 用於設置 RUNTIME 目標的輸出路徑



可能會用到的一些命令


        get_property 獲取一個屬性值

get_property(<variable>
              <GLOBAL             |
               DIRECTORY [dir]    |
               TARGET    <target> |
               SOURCE    <source> |
               TEST      <test>   |
               CACHE     <entry>  |
               VARIABLE>
              PROPERTY <name>
              [SET | DEFINED | BRIEF_DOCS | FULL_DOCS])


        get_source_file_property  爲一個源文件獲取一種屬性值

get_source_file_property(VAR file property)


        get_target_property 從一個目標中獲取一個屬性值

get_target_property(VAR target property)


        get_test_property 獲取一個測試的屬性

get_test_property(test VAR property)


        get_cmake_property  獲取一個CMake實例的屬性

get_cmake_property(VAR property)


        get_filename_component 獲得一個完整文件名中的特定部分

get_filename_component(<VAR> FileName
                        PATH|ABSOLUTE|NAME|EXT|NAME_WE|REALPATH
                        [CACHE])

      

      get_cmake_property  獲取一個CMake實例的屬性。

get_directory_property(<variable> [DIRECTORY <dir>] <prop-name>)




    


參考 : http://www.cnblogs.com/coderfenghc/archive/2012/07/08/2581734.html 

                http://name5566.com/1795.html

相關文章
相關標籤/搜索