cmake指令詳解

所需文件名:CmakeLists.txt,在須要操做的每一個目錄下都須要html

PROJECT(工程名字)

    這條指令會自動建立兩個變量:python

<projectname>_BINARY_DIR(二進制文件保存路徑)    <projectname>_SOURCE_DIR(源代碼路徑)linux

cmake系統也幫助咱們預約義了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR其值與上述對應相等正則表達式

 

SET(變量名 變量值)

    SET(VAR [VALUE] [CACHE TYPEDOCSTRING [FORCE]])express

    SET(SRC_LIST main.c t1.ct2.c)windows

    SET(SRC_LIST main.c)curl

 

MESSAGE

 

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] 「message to display」 …)
向終端輸出用戶定義的信息或變量的值
SEND_ERROR, 產生錯誤,生成過程被跳過
STATUS, 輸出前綴爲—的信息
FATAL_ERROR, 當即終止全部cmake過程工具

 

ADD_EXECUTABLE

 

ADD_EXECUTABLE(可執行文件名  生成該可執行文件的源文件)oop

說明源文件須要編譯出的可執行文件名測試

例:

 ADD_EXECUTABLE(hello ${SRC_LIST})

說明SRC_LIST變量中的源文件須要編譯出名爲hello的可執行文件

 

 ADD_SUBDIRECTORY

 

ADD_SUBDIRECTORY(src_dir [binary_dir] [EXCLUDE_FROM_ALL])
向當前工程添加存放源文件的子目錄,並能夠指定中間二進制和目標二進制的存放位置
EXCLUDE_FROM_ALL含義:將這個目錄從編譯過程當中排除

 

SET(EXECUTABLE_OUTPUT_PATH${PROJECT_BINARY_DIR}/bin)更改生成的可執行文件路徑

SET(LIBRARY_OUTPUT_PATH${PROJECT_BINARY_DIR}/lib)更改生成的庫文件路徑

 

 

 

ADD_LIBRARY

 

ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)

生成動態靜態庫

例:

ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

 

SET_TARGET_PROPERTIES

設置目標的一些屬性來改變它們構建的方式。
  set_target_properties(target1 target2 ...
                        PROPERTIES prop1 value1
                        prop2 value2 ...)

  爲一個目標設置屬性。該命令的語法是列出全部你想要變動的文件,而後提供你想要設置的值。你可以使用任何你想要的屬性/值對,而且在隨後的代碼中調用GET_TARGET_PROPERTY命令取出屬性的值。

  影響一個目標輸出文件的名字的屬性詳述以下。

PREFIX和SUFFIX屬性覆蓋了默認的目標名前綴(好比lib)和後綴(好比.so)。

IMPORT_PREFIX和IMPORT_SUFFIX是與之等價的屬性,不過針對的是DLL(共享庫目標)的導入庫。

在構建目標時,OUTPUT_NAME屬性設置目標的真實名字,而且能夠用來輔助建立兩個具備相同名字的目標,即便CMake須要惟一的邏輯目標名。<CONFIG>_OUTPUT_NAME能夠爲不一樣的配置設置輸出的目標名字。當目標在指定的配置名<CONFIG>(所有大寫,例如DEBUG_POSTFIX)下被構建時,<CONFIG>_POSTFIX爲目標的真實名字設置一個後綴。該屬性的值在目標建立時被初始化爲CMAKE_<CONFIG>_POSTFIX的值(可執行目標除外,由於較早的CMake版本不會爲可執行文件使用這個屬性。)

  LINK_FLAGS屬性能夠用來爲一個目標的連接階段添加額外的標誌。LINK_FLAGS_<CONFIG>將爲配置<CONFIG>添加連接標誌,例如DEBUG,RELEASE,MINSIZEREL,RELWITHDEBINFO。DEFINE_SYMBOL屬性設置了編譯一個共享庫中的源文件時纔會被定義的預處理器符號名。若是這個值沒有被設置的話,那麼它會被設置爲默認值target_EXPORTS(若是目標不是一個合法的C標示符的話能夠用一些替代標誌)。這對於檢測頭文件是包含在它們的庫之內仍是之外頗有幫助,從而能夠合理設置dllexport/dllimport修飾符(注意,只有在編譯到的時候,這個符號纔會被定義;所以猜想在代碼中,判斷預處理符號是否被定義能夠知道依賴庫是導入的仍是導出的——譯註)。COMPILE_FLAGS屬性能夠設置附加的編譯器標誌,它們會在構建目標內的源文件時被用到。它也能夠用來傳遞附加的預處理器定義。

  LINKER_LANGUAGE屬性用來改變連接可執行文件或共享庫的工具。默認的值是設置與庫中的文件相匹配的語言。CXX和C是這個屬性的公共值。

  對於共享庫,VERSION和SOVERSION屬性分別能夠用來指定構建的版本號以及API版本號。當構建或者安裝時,若是平臺支持符號連接而且連接器支持so名字,那麼恰當的符號連接會被建立。若是隻指定二者中的一個,缺失的另外一個假定爲具備相同的版本號。對於可執行文件,VERSION能夠被用來指定構建版本號。當構建或者安裝時,若是該平臺支持符號連接,那麼合適的符號連接會被建立。對於在Windows系統而言,共享庫和可執行文件的VERSION屬性被解析成爲一個"major.minor"的版本號。這些版本號被用作該二進制文件的鏡像版本。

  還有一些屬性用來指定RPATH規則。INSTALL_RPATH是一個分號分隔的list,它指定了在安裝目標時使用的rpath(針對支持rpath的平臺而言)(-rpath在gcc中用於在編譯時指定加載動態庫的路徑;優先級較系統庫路徑要高。詳情參見http://www.cmake.org/Wiki/CMake_RPATH_handling#What_is_RPATH_.3F——譯註)。INSTALL_RPATH_USE_LINK_PATH是一個布爾值屬性,若是它被設置爲真,那麼在連接器的搜索路徑中以及工程以外的目錄會被附加到INSTALL_RPATH以後。SKIP_BUILD_RPATH是一個布爾值屬性,它指定了是否跳過一個rpath的自動生成過程,從而能夠從構建樹開始運行。BUILD_WITH_INSTALL_RPATH是一個布爾值屬性,它指定了是否將在構建樹上的目標與INSTALL_RPATH連接。該屬性要優先於SKIP_BUILD_RPATH,所以避免了安裝以前的從新連接。INSTALL_NAME_DIR是一個字符串屬性,它用於在Mac OSX系統上,指定了被安裝的目標中使用的共享庫的"install_name"域的目錄部分。若是目標已經被建立,變量CMAKE_INSTALL_RPATH, CMAKE_INSTALL_RPATH_USE_LINK_PATH, CMAKE_SKIP_BUILD_RPATH, CMAKE_BUILD_WITH_INSTALL_RPATH和CMAKE_INSTALL_NAME_DIR的值會被用來初始化這個屬性。

  PROJECT_LABEL屬性能夠用來在IDE環境,好比visual studio,中改變目標的名字。 VS_KEYWORD能夠用來改變visual studio的關鍵字,例如若是該選項被設置爲Qt4VSv1.0的話,QT集成將會運行得更好。

  VS_SCC_PROJECTNAME, VS_SCC_LOCALPATH, VS_SCC_PROVIDER能夠被設置,從而增長在一個VS工程文件中對源碼控制綁定的支持。

  PRE_INSTALL_SCRIPT和POST_INSTALL_SCRIPT屬性是在安裝一個目標以前及以後指定運行CMake腳本的舊格式。只有當使用舊式的INSTALL_TARGETS來安裝目標時,才能使用這兩個屬性。使用INSTALL命令代替這種用法。

  EXCLUDE_FROM_DEFAULT_BUILD屬性被visual studio生成器使用。若是屬性值設置爲1,那麼當你選擇"構建解決方案"時,目標將不會成爲默認構建的一部分。

SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")

 

同時生成動態靜態庫

    ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

    ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})

    SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")

        SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)

SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)

控制版本

        SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)

VERSION指代動態庫版本,SOVERSION指代API版本。

 

 INSTALL

INSTALL(TARGETS hellohello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)

INSTALL(FILES hello.h DESTINATIONinclude/hello)

注意,靜態庫要使用ARCHIVE關鍵字

cmake -DCMAKE_INSTALL_PREFIX=/usr ..[路徑]

 

 

INCLUDE_DIRECTORIES(追加標誌 頭文件路徑)

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)

 向工程添加多個特定的頭文件搜索路徑,路徑之間用空格分隔,若是路徑包含空格,可使用雙引號將它括起來。默認的行爲是追加到當前頭文件搜索路徑的後面。有以下兩種方式能夠控制搜索路徑添加的位置:

  • CMAKE_INCLUDE_DIRECTORIES_BEFORE,經過SET這個cmake變量爲on,能夠將添加的頭文件搜索路徑放在已有路徑的前面
  • 經過AFTER或BEFORE參數,也能夠控制是追加仍是置前

 

 

LINK_DIRECTORIES(庫文件路徑)

LINK_DIRECTORIES(directory1 directory2 ...)

 

TARGET_LINK_LIBRARIES 

設置目標要鏈接庫文件的名稱

    TARGET_LINK_LIBRARIES(target library1 <debug | optimized> library2 ..)

    TARGET_LINK_LIBRARIES(main hello)  # 鏈接libhello.so庫

    TARGET_LINK_LIBRARIES(main libhello.a)

    TARGET_LINK_LIBRARIES(main libhello.so)

 環境變量

使用$ENV{NAME}指令就能夠調用系統的環境變量

 

 

系統信息

1,CMAKE_MAJOR_VERSION,CMAKE主版本號,好比2.4.6中的2

2,CMAKE_MINOR_VERSION,CMAKE次版本號,好比2.4.6中的4

3,CMAKE_PATCH_VERSION,CMAKE補丁等級,好比2.4.6 中的6

4,CMAKE_SYSTEM,系統名稱,好比Linux-2.6.22

5,CMAKE_SYSTEM_NAME,不包含版本的系統名,好比linux

6,CMAKE_SYSTEM_VERSION,系統版本,好比2.6.22

7,CMAKE_SYSTEM_PROCESSOR,處理器名稱,好比i686.

8,UNIX,在全部的類UNIX平臺爲TRUE,包括OS X和cygwin

9,WIN32,在全部的win32平臺爲TRUE,包括cygwin

 

主要的開關選項:

1,CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS,用來控制IF ELSE語句的書寫方式,在

下一節語法部分會講到。

2,BUILD_SHARED_LIBS

這個開關用來控制默認的庫編譯方式,若是不進行設置,使用ADD_LIBRARY並無指定庫

類型的狀況下,默認編譯生成的庫都是靜態庫。

若是SET(BUILD_SHARED_LIBS ON)後,默認生成的爲動態庫。

3,CMAKE_C_FLAGS

設置C編譯選項,也能夠經過指令ADD_DEFINITIONS()添加。

4,CMAKE_CXX_FLAGS

設置C++編譯選項,也能夠經過指令ADD_DEFINITIONS()添加。

 

 ADD_DEFINITIONS

ADD_DEFINITIONS(-DENABLE_DEBUG-DABC),定義宏

 

 

ADD_DEPENDENCIES

定義target依賴的其餘target,確保在編譯本target以前,其餘的target已經被構建。

ADD_DEPENDENCIES(target-name depend-target1depend-target2 ...)

 讓一個頂層目標依賴於其餘的頂層目標。一個頂層目標是由命令ADD_EXECUTABLE,ADD_LIBRARY,或者ADD_CUSTOM_TARGET產生的目標。爲這些命令的輸出引入依賴性能夠保證某個目標在其餘的目標以前被構建。查看ADD_CUSTOM_TARGET和ADD_CUSTOM_COMMAND命令的DEPENDS選項,能夠了解如何根據自定義規則引入文件級的依賴性。查看SET_SOURCE_FILES_PROPERTIES命令的OBJECT_DEPENDS選項,能夠了解如何爲目標文件引入文件級的依賴性。

 

ADD_TEST與ENABLE_TESTING指令

ADD_TEST(testname Exenamearg1 arg2 ...)

若是沒有在同一個CMakeLists.txt中打開ENABLE_TESTING()指令,任何ADD_TEST都是無效的。

ADD_TEST(mytest${PROJECT_BINARY_DIR}/bin/main)

ENABLE_TESTING()

生成Makefile後,就能夠運行make test來執行測試了。

 

AUX_SOURCE_DIRECTORY

    AUX_SOURCE_DIRECTORY(dirVARIABLE)

    做用是發現一個目錄下全部的源代碼文件並將列表存儲在一個變量中

    AUX_SOURCE_DIRECTORY(. SRC_LIST)

ADD_EXECUTABLE(main ${SRC_LIST})

 

CMAKE_MINIMUM_REQUIRED

CMAKE_MINIMUM_REQUIRED(VERSION2.5 FATAL_ERROR)最低版本CMAKE要求

 

 EXEC_PROGRAM

EXEC_PROGRAM(Executable[directory in which to run]

[ARGS <arguments to executable>]

[OUTPUT_VARIABLE <var>]

[RETURN_VALUE <var>])

用於在指定的目錄運行某個程序,經過ARGS添加參數,若是要獲取輸出和返回值,可經過

OUTPUT_VARIABLE和RETURN_VALUE分別定義兩個變量.

    舉個簡單的例子,咱們要在src目錄執行ls命令,並把結果和返回值存下來。

能夠直接在src/CMakeLists.txt中添加:

EXEC_PROGRAM(ls ARGS "*.c" OUTPUT_VARIABLE LS_OUTPUTRETURN_VALUE LS_RVALUE)

IF(not LS_RVALUE)

MESSAGE(STATUS "ls result: "${LS_OUTPUT})

ENDIF(not LS_RVALUE)

 

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

 

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

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

  READ選項將會讀一個文件中的內容並將其存儲在變量裏。讀文件的位置從offset開始,最多讀numBytes個字節。若是指定了HEX參數,二進制代碼將會轉換爲十六進制表達方式,並存儲在變量裏。

  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(STRINGS myfile.txt myfile)

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

   *.cxx      - 匹配全部擴展名爲cxx的文件。
   *.vt?      - 匹配全部擴展名是vta,...,vtz的文件。
   f[3-5].txt - 匹配文件f3.txt, f4.txt, f5.txt。

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

使用遞歸查詢的例子有:

 /dir/*.py  - 匹配全部在/dir及其子目錄下的python文件。

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

  RENAME選項對同一個文件系統下的一個文件或目錄重命名。(相似於mv命令——譯註)

  REMOVE選項將會刪除指定的文件,包括在子路徑下的文件。(相似於rm命令——譯註)

  REMOVE_RECURSE選項會刪除給定的文件以及目錄,包括非空目錄。(相似於rm -r 命令——譯註)

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

  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. 原文如此。quotes和後面的takes讓人後糾結,這句話翻譯可能有誤。歡迎指正——譯註)。

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

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

  file命令還提供了COPY和INSTALL兩種格式:

  file(<COPY|INSTALL> files... DESTINATION <dir>
       [FILE_PERMISSIONS permissions...]
       [DIRECTORY_PERMISSIONS permissions...]
       [NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS]
       [FILES_MATCHING]
       [[PATTERN <pattern> | REGEX <regex>]
        [EXCLUDE] [PERMISSIONS permissions...]] [...])

  COPY版本把文件、目錄以及符號鏈接拷貝到一個目標文件夾。相對輸入路徑的評估是基於當前的源代碼目錄進行的,相對目標路徑的評估是基於當前的構建目錄進行的。複製過程將保留輸入文件的時間戳;而且若是目標路徑處存在同名同時間戳的文件,複製命令會把它優化掉。賦值過程將保留輸入文件的訪問權限,除非顯式指定權限或指定NO_SOURCE_PERMISSIONS選項(默認是USE_SOURCE_PERMISSIONS)。參見install(DIRECTORY)命令中關於權限(permissions),PATTERN,REGEX和EXCLUDE選項的文檔。

  INSTALL版本與COPY版本只有十分微小的差異:它會打印狀態信息,而且默認使用NO_SOURCE_PERMISSIONS選項。install命令生成的安裝腳本使用這個版本(它會使用一些沒有在文檔中涉及的內部使用的選項。)

 

 

INCLUDE指令

用來載入CMakeLists.txt文件,也用於載入預約義的cmake模塊.

INCLUDE(file1 [OPTIONAL])

INCLUDE(module [OPTIONAL])

OPTIONAL參數的做用是文件不存在也不會產生錯誤。

你能夠指定載入一個文件,若是定義的是一個模塊,那麼將在CMAKE_MODULE_PATH中搜

索這個模塊並載入。

載入的內容將在處理到 INCLUDE 語句時直接執行。

https://cmake.org/cmake/help/v3.0/command/include.html

 

FIND_系列指令主要包含一下指令:

FIND_FILE(<VAR> name1 path1 path2 ...)

VAR變量表明找到的文件全路徑,包含文件名

FIND_LIBRARY(<VAR> name1 path1 path2 ...)

VAR變量表示找到的庫全路徑,包含庫文件名

FIND_PATH(<VAR> name1 path1 path2 ...)

VAR變量表明包含這個文件的路徑。

FIND_PROGRAM(<VAR> name1 path1 path2 ...)

VAR變量表明包含這個程序的全路徑。

FIND_PACKAGE(<name> [major.minor] [QUIET][NO_MODULE] [[REQUIRED|COMPONENTS] [componets...]])

用來調用預約義在CMAKE_MODULE_PATH下的Find<name>.cmake模塊,你也能夠本身

定義Find<name>模塊,經過SET(CMAKE_MODULE_PATH dir)將其放入工程的某個目錄

中供工程使用

FIND_LIBRARY示例:

FIND_LIBRARY(libX X11 /usr/lib)

 

IF(NOT libX)

MESSAGE(FATAL_ERROR 「libX not found」)

ENDIF(NOT libX)

 

 

本來的條件語句

IF(WIN32)

MESSAGE(STATUS 「This is windows.」)

#做一些Windows相關的操做

ELSE(WIN32)

MESSAGE(STATUS 「This is not windows」)

#做一些非Windows相關的操做

ENDIF(WIN32)

經過設置SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)

上述代碼可寫爲

IF(WIN32)

ELSE()

ENDIF()

還能夠

IF(WIN32)

#do something related to WIN32

ELSEIF(UNIX)

#do something related to UNIX

ELSEIF(APPLE)

#do something related to APPLE

ENDIF(WIN32)

 

WHILE指令的語法是:

WHILE(condition)

COMMAND1(ARGS ...)

COMMAND2(ARGS ...)

...

ENDWHILE(condition)

 

FOREACH指令的使用方法有三種形式:

列表

FOREACH(loop_var arg1 arg2...)

COMMAND1(ARGS ...)

COMMAND2(ARGS ...)

...

ENDFOREACH(loop_var)

像咱們前面使用的AUX_SOURCE_DIRECTORY的例子

AUX_SOURCE_DIRECTORY(. SRC_LIST)

FOREACH(F ${SRC_LIST})

MESSAGE(${F})

ENDFOREACH(F)

 

範圍

FOREACH(loop_var RANGE total)

ENDFOREACH(loop_var)

從0到total以1爲步進舉例以下:

FOREACH(VAR RANGE 10)

MESSAGE(${VAR})

ENDFOREACH(VAR)

最終獲得的輸出是:0-10

範圍和步進

FOREACH(loop_var RANGE start stop [step])

ENDFOREACH(loop_var)

從start開始到stop結束,以step爲步進,舉例以下

FOREACH(A RANGE 5 15 3)

MESSAGE(${A})

ENDFOREACH(A)

最終獲得的結果是:

5

8

11

14

這個指令須要注意的是,直到遇到ENDFOREACH指令,整個語句塊纔會獲得真正的執行。

 

 

 

FIND_PACKAGE(CURL)

IF(CURL_FOUND)

INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR})

TARGET_LINK_LIBRARIES(curltest${CURL_LIBRARY})

ELSE(CURL_FOUND)

MESSAGE(FATAL_ERROR 」CURL library not found」)

ENDIF(CURL_FOUND)

 

能夠本身定義一些FIND_PACKAGE包,好比

定義cmake/FindHELLO.cmake模塊

 

 

FIND_PATH(HELLO_INCLUDE_DIR hello.h /usr/include/hello /usr/local/include/hello)

FIND_LIBRARY(HELLO_LIBRARY NAMES hello PATH /usr/lib /usr/local/lib)

IF (HELLO_INCLUDE_DIR AND HELLO_LIBRARY)

SET(HELLO_FOUND TRUE)

ENDIF (HELLO_INCLUDE_DIR AND HELLO_LIBRARY)

IF (HELLO_FOUND)

IF (NOT HELLO_FIND_QUIETLY)

MESSAGE(STATUS "FoundHello: ${HELLO_LIBRARY}")

ENDIF (NOT HELLO_FIND_QUIETLY)

ELSE (HELLO_FOUND)

IF (HELLO_FIND_REQUIRED)

MESSAGE(FATAL_ERROR"Could not find hello library")

ENDIF (HELLO_FIND_REQUIRED)

ENDIF (HELLO_FOUND)

 

那麼可使用

FIND_PACKAGE(HELLO)

IF(HELLO_FOUND)

ADD_EXECUTABLE(hello main.c)

INCLUDE_DIRECTORIES(${HELLO_INCLUDE_DIR})

TARGET_LINK_LIBRARIES(hello${HELLO_LIBRARY})

ENDIF(HELLO_FOUND)

來操做,不過操做以前須要設置cmake搜索路徑

SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

 

http://blog.csdn.net/lsg32/article/details/7082154

相關文章
相關標籤/搜索