cmake指令詳解

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

PROJECT(工程名字)

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

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

cmake系統也幫助我們預定義了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR其值與上述對應相等

 

SET(變量名 變量值)

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

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

    SET(SRC_LIST main.c)

 

MESSAGE

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display” …)
向終端輸出用戶定義的信息或變量的值
SEND_ERROR, 產生錯誤,生成過程被跳過
STATUS, 輸出前綴爲—的信息
FATAL_ERROR, 立即終止所有cmake過程

 

ADD_EXECUTABLE

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

說明源文件需要編譯出的可執行文件名

例:

 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)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章