cmake 常用變數、常用環境變數、常用語法總結
一,cmake 變數引用的方式:
前面我們已經提到了,使用${}進行變數的引用。在 IF 等語句中,是直接使用變數名而不通過${}取值
二,cmake 自定義變數的方式:
主要有隱式定義和顯式定義兩種。
隱式定義的例子: PROJECT 指令,會隱式的定義<projectname>_BINARY_DIR 和<projectname>_SOURCE_DIR 兩個變數。
顯式定義的例子:使用 SET 指令,就可以構建一個自定義變量了。比如:
SET(HELLO_SRC main.SOURCE_PATHc),就 PROJECT_BINARY_DIR 可以通過${HELLO_SRC}來引用這個自定義變量了.
三,cmake 常用變數:
1,CMAKE_BINARY_DIR
PROJECT_BINARY_DIR<projectname>_BINARY_DIR
這三個變數指代的內容是一致的,如果是 in source 編譯,指的就是工程頂層目錄,如果是 out-of-source 編譯,指的是工程編譯發生的目錄。PROJECT_BINARY_DIR 跟其他指令稍有區別,現在,你可以理解為他們是一致的。
2,CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR<projectname>_SOURCE_DIR
這三個變數指代的內容是一致的,不論採用何種編譯方式,都是工程頂層目錄。
也就是在 in source 編譯時,他跟 CMAKE_BINARY_DIR 等變數一致。
PROJECT_SOURCE_DIR 跟其他指令稍有區別,現在,你可以理解為他們是一致的。
3,CMAKE_CURRENT_SOURCE_DIR
指的是當前處理的 CMakeLists.txt 所在的路徑,比如上面我們提到的 src 子目錄。4,CMAKE_CURRRENT_BINARY_DIR
如果是 in-source 編譯,它跟 CMAKE_CURRENT_SOURCE_DIR 一致,如果是 out-of-source 編譯,他指的是 target 編譯目錄。使用我們上面提到的 ADD_SUBDIRECTORY(src bin)可以更改這個變數的值。
使用 SET(EXECUTABLE_OUTPUT_PATH <新路徑>)並不會對這個變數造成影響,它僅僅修改了最終目標檔案存放的路徑。
5,CMAKE_CURRENT_LIST_FILE
輸出呼叫這個變數的 CMakeLists.txt 的完整路徑
6,CMAKE_CURRENT_LIST_LINE
輸出這個變數所在的行
7,CMAKE_MODULE_PATH
這個變數用來定義自己的 cmake 模組所在的路徑。如果你的工程比較複雜,有可能會自己編寫一些 cmake 模組,這些 cmake 模組是隨你的工程釋出的,為了讓 cmake 在處理CMakeLists.txt 時找到這些模組,你需要通過 SET 指令,將自己的 cmake 模組路徑設定一下。比如
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
這時候你就可以通過 INCLUDE 指令來呼叫自己的模組了。
8,EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH
分別用來重新定義最終結果的存放目錄,前面我們已經提到了這兩個變數。9,PROJECT_NAME
返回通過 PROJECT 指令定義的專案名稱。
CMAKE_BUILD_TYPE
生成 debug 版和 release 版的程式。
可以的取值是 Debug Release RelWithDebInfo 和 MinSizeRel。當這個變數值為 Debug 的時候,CMake 會使用變數CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字串作為編譯選項生成 Makefile,當這個變數值為 Release 的時候,工程會使用變數CMAKE_CXX_FLAGS_RELEASE 和 CMAKE_C_FLAGS_RELEASE 選項生成 Makefile。
現假設專案中只有一個檔案 main.cpp ,下面是一個可以選擇生成 debug 版和 release 版的程式的 CMakeList.txt :
1 PROJECT(main)
2 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
3 SET(CMAKE_SOURCE_DIR .)
4
5 SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
6 SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
7
8 AUX_SOURCE_DIRECTORY(. DIR_SRCS)
9 ADD_EXECUTABLE(main ${DIR_SRCS})
第 5 和 6 行設定了兩個變數 CMAKE_CXX_FLAGS_DEBUG 和
CMAKE_CXX_FLAGS_RELEASE, 這兩個變數是分別用於 debug 和 release 的編譯選項。
編輯 CMakeList.txt 後需要執行 ccmake 命令生成 Makefile 。在進入專案的根目錄,輸入
"ccmake ." 進入一個圖形化介面,如下圖所示:
圖 5. ccmake 的介面
按照介面中的提示進行操作,按 "c" 進行 configure ,這時介面中顯示出了配置變數
CMAKE_BUILD_TYPE 的條目。如下圖所示:
圖 6. 執行了 configure 以後 ccmake 的介面
下面我們首先生成 Debug 版的 Makefile :將變數 CMAKE_BUILD_TYPE 設定為
Debug ,按 "c" 進行 configure ,按 "g" 生成 Makefile 並退出。這時執行命令
find * | xargs grep "O0" 後結果如下:
清單 8 find * | xargs grep "O0"的執行結果
CMakeFiles/main.dir/flags.make:CXX_FLAGS = -O0 -Wall -g -ggdb CMakeFiles/main.dir/link.txt:/usr/bin/c++ -O0 -Wall -g -ggdb CMakeFiles/main.dir/main.cpp.o -o main -rdynamic CMakeLists.txt:SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
這個結果說明生成的 Makefile 中使用了變數 CMAKE_CXX_FLAGS_DEBUG 作為編譯時的
引數。
下面我們將生成 Release 版的 Makefile :再次執行命令 "ccmake ." 將變數
CMAKE_BUILD_TYPE 設定為 Release ,生成 Makefile 並退出。執行命令
find * | xargs grep "O0" 後結果如下:
清單 9 find * | xargs grep "O0"的執行結果
CMakeLists.txt:SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
而執行命令 find * | xargs grep "O3" 後結果如下:
清單 10. find * | xargs grep "O3"的執行結果
CMakeCache.txt:CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG CMakeCache.txt:CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG CMakeFiles/main.dir/flags.make:CXX_FLAGS = -O3 -Wall CMakeFiles/main.dir/link.txt:/usr/bin/c++ -O3 -Wall CMakeFiles/main.dir/main.cpp.o -o main -rdynamic CMakeLists.txt:SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
這兩個結果說明生成的 Makefile 中使用了變數 CMAKE_CXX_FLAGS_RELEASE 作為編譯
時的引數。
CMAKE_C_COMPILER
指定C編譯器,通常,CMake執行時能夠自動檢測C語言編譯器。進行嵌入式系統開發時,通常需要設定此變數,指定交叉編譯器。CMAKE_CXX_COMPILER
指定C++編譯器CMAKE_C_FLAGS
指定編譯C檔案時編譯選項,比如-g指定產生除錯資訊。也可以通過add_definitions命令新增編譯選項。EXECUTABLE_OUTPUT_PATH
指定可執行檔案存放的路徑。LIBRARY_OUTPUT_PATH
指定庫檔案放置的路徑四,cmake 呼叫環境變數的方式
使用$ENV{NAME}指令就可以呼叫系統的環境變量了。比如:
MESSAGE(STATUS “HOME dir: $ENV{HOME}”)
設定環境變數的方式是:
SET(ENV{變數名} 值)
1,CMAKE_INCLUDE_CURRENT_DIR
自動新增 CMAKE_CURRENT_BINARY_DIR 和 CMAKE_CURRENT_SOURCE_DIR 到當前處理
的 CMakeLists.txt。相當於在每個 CMakeLists.txt 加入:
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR})
2,CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE
將工程提供的標頭檔案目錄始終至於系統標頭檔案目錄的前面,當你定義的標頭檔案確實跟系統發生衝突時可以提供一些幫助。
3,CMAKE_INCLUDE_PATH 和 CMAKE_LIBRARY_PATH 我們在上一節已經提及。
五,系統資訊
1,CMAKE_MAJOR_VERSION,CMAKE 主版本號,比如 2.4.6 中的 2
2,CMAKE_MINOR_VERSION,CMAKE 次版本號,比如 2.4.6 中的 43,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()新增。
小結:
本章介紹了一些較常用的 cmake 變數,這些變數僅僅是所有 cmake 變數的很少一部分,目
前 cmake 的英文文件也是比較缺乏的,如果需要了解更多的 cmake 變數,更好的方式是閱
讀一些成功專案的 cmake 工程檔案,比如 KDE4 的程式碼。
八,cmake 常用指令
前面我們講到了 cmake 常用的變數,相信“cmake 即程式設計”的感覺會越來越明顯,無論如何,我們仍然可以看到 cmake 比 autotools 要簡單很多。接下來我們就要集中的看一看cmake 所提供的常用指令。在前面的章節我們已經討論了很多指令的用法,如:PROJECT, ADD_EXECUTABLE, INSTALL, ADD_SUBDIRECTORY, SUBDIRS, INCLUDE_DIRECTORIES, LINK_DIRECTORIES, TARGET_LINK_LIBRARIES, SET 等。
本節會引入更多的 cmake 指令,為了編寫的方便,我們將按照 cmake man page 的順序來介紹各種指令,不再推薦使用的指令將不再介紹,INSTALL 系列指令在安裝部分已經做了非常詳細的說明,本節也不在提及。(你可以將本章理解成選擇性翻譯,但是會加入更多的個人理解)
一,基本指令
1,ADD_DEFINITIONS向 C/C++編譯器新增-D 定義,比如:
ADD_DEFINITIONS(-DENABLE_DEBUG -DABC),引數之間用空格分割。
如果你的程式碼中定義了#ifdef ENABLE_DEBUG #endif,這個程式碼塊就會生效。
如果要新增其他的編譯器開關,可以通過 CMAKE_C_FLAGS 變數和 CMAKE_CXX_FLAGS 變數設定。
2,ADD_DEPENDENCIES
定義 target 依賴的其他 target,確保在編譯本 target 之前,其他的 target 已經被構建。
ADD_DEPENDENCIES(target-name depend-target1
depend-target2 ...)
讓一個頂層目標依賴於其他的頂層目標。一個頂層目標是由命令ADD_EXECUTABLE,ADD_LIBRARY,或者ADD_CUSTOM_TARGET產生的目標。為這些命令的輸出引入依賴性可以保證某個目標在其他的目標之前被構建。檢視ADD_CUSTOM_TARGET和ADD_CUSTOM_COMMAND命令的DEPENDS選項,可以瞭解如何根據自定義規則引入檔案級的依賴性。檢視SET_SOURCE_FILES_PROPERTIES命令的OBJECT_DEPENDS選項,可以瞭解如何為目標檔案引入檔案級的依賴性。
3,ADD_EXECUTABLE、ADD_LIBRARY、ADD_SUBDIRECTORY
ADD_EXECUTABLE(可執行檔名 生成該可執行檔案的原始檔)
說明原始檔需要編譯出的可執行檔名
例:
ADD_EXECUTABLE(hello ${SRC_LIST})
說明SRC_LIST變數中的原始檔需要編譯出名為hello的可執行檔案
ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
生成動態靜態庫
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_SUBDIRECTORY(src_dir
[binary_dir] [EXCLUDE_FROM_ALL])
向當前工程新增存放原始檔的子目錄,並可以指定中間二進位制和目標二進位制的存放位置
EXCLUDE_FROM_ALL含義:將這個目錄從編譯過程中排除
4,ADD_TEST 與 ENABLE_TESTING 指令。
ENABLE_TESTING 指令用來控制 Makefile 是否構建 test 目標,涉及工程所有目錄。語法很簡單,沒有任何引數,ENABLE_TESTING(),一般情況這個指令放在工程的主CMakeLists.txt 中.
ADD_TEST 指令的語法是:
ADD_TEST(testname Exename arg1 arg2 ...)
testname 是自定義的 test 名稱,Exename 可以是構建的目標檔案也可以是外部指令碼等等。後面連線傳遞給可執行檔案的引數。如果沒有在同一個 CMakeLists.txt 中開啟ENABLE_TESTING()指令,任何 ADD_TEST 都是無效的。
比如我們前面的 Helloworld 例子,可以在工程主 CMakeLists.txt 中新增
ADD_TEST(mytest ${PROJECT_BINARY_DIR}/bin/main)
ENABLE_TESTING()
生成 Makefile 後,就可以執行 make test 來執行測試了。
5,AUX_SOURCE_DIRECTORY
基本語法是:
AUX_SOURCE_DIRECTORY(dir VARIABLE)
作用是發現一個目錄下所有的原始碼檔案並將列表儲存在一個變數中,這個指令臨時被用來自動構建原始檔列表。因為目前 cmake 還不能自動發現新新增的原始檔。
比如
AUX_SOURCE_DIRECTORY(. SRC_LIST)
ADD_EXECUTABLE(main ${SRC_LIST})
你也可以通過後面提到的 FOREACH 指令來處理這個 LIST
6,CMAKE_MINIMUM_REQUIRED
其語法為 CMAKE_MINIMUM_REQUIRED(VERSION versionNumber [FATAL_ERROR])
比如 CMAKE_MINIMUM_REQUIRED(VERSION 2.5 FATAL_ERROR)
如果 cmake 版本小與 2.5,則出現嚴重錯誤,整個過程中止。
7,EXEC_PROGRAM
在 CMakeLists.txt 處理過程中執行命令,並不會在生成的 Makefile 中執行。
具體語法為:
EXEC_PROGRAM(Executable [directory in which to run]
[ARGS <arguments to executable>]
[OUTPUT_VARIABLE <var>]
[RETURN_VALUE <var>])
用於在指定的目錄執行某個程式,通過 ARGS 新增引數,如果要獲取輸出和返回值,可通過OUTPUT_VARIABLE 和 RETURN_VALUE 分別定義兩個變數.
這個指令可以幫助你在 CMakeLists.txt 處理過程中支援任何命令,比如根據系統情況去修改程式碼檔案等等。
舉個簡單的例子,我們要在 src 目錄執行 ls 命令,並把結果和返回值存下來。
可以直接在 src/CMakeLists.txt 中新增:
EXEC_PROGRAM(ls ARGS "*.c" OUTPUT_VARIABLE LS_OUTPUT RETURN_VALUE
LS_RVALUE)
IF(not LS_RVALUE)
MESSAGE(STATUS "ls result: " ${LS_OUTPUT})
ENDIF(not LS_RVALUE)
在 cmake 生成 Makefile 的過程中,就會執行 ls 命令,如果返回 0,則說明成功執行,那麼就輸出 ls *.c 的結果。關於 IF 語句,後面的控制指令會提到。
8,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命令生成的安裝指令碼使用這個版本(它會使用一些沒有在文件中涉及的內部使用的選項。)
9,INCLUDE 指令,用來載入 CMakeLists.txt 檔案,也用於載入預定義的 cmake 模組.
INCLUDE(file1 [OPTIONAL])
INCLUDE(module [OPTIONAL])
OPTIONAL 引數的作用是檔案不存在也不會產生錯誤。
你可以指定載入一個檔案,如果定義的是一個模組,那麼將在 CMAKE_MODULE_PATH 中搜索這個模組並載入。
載入的內容將在處理到 INCLUDE 語句時直接執行。
二,INSTALL 指令
INSTALL 系列指令已經在前面的章節有非常詳細的說明,這裡不在贅述,可參考前面的安裝部分。三,FIND_系列指令
FIND_系列指令主要包含一下指令:FIND_FILE(<VAR> name1 path1 path2 ...)
VAR 變數代表找到的檔案全路徑,包含檔名
FIND_PATH(<VAR> name1 path1 path2 ...)
-
指明標頭檔案查詢的路徑,
原型如下
:
-
該命令在引數
path*
指示的
目錄中查詢檔案
name1
並將查詢到的路徑儲存在變數
VAR
中。
用法同FIND_PATH,表明庫查詢路徑。
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)將其放入工程的某個目錄中供工程使用。
CMake
會到變數 CMAKE_MODULE_PATH 指示的目錄中查詢檔案 Findname.cmake 並執行。這條命令執行後,
QUIET 引數:
對應於Find<name>.cmake模組中的
NAME_FIND_QUIETLY,如果不指定這個引數,就會執行:
MESSAGE(STATUS "Found NAME: ${NAME_LIBRARY}")
指定了QUIET就不輸出指令。
REQUIRED 引數
其含義是指是否是工程必須的,如果使用了這個引數,說明是必須的,如果找不到,則工程不能編譯。對應於Find<name>.cmake模組中的
NAME_FIND_REQUIRED 變數。
示例:
FIND_PACKAGE( libdb_cxx REQUIRED)
CMake
會到變數 CMAKE_MODULE_PATH 指示的目錄中查詢檔案 Findlibdb_cxx.cmake 並執行。這條命令執行後,
FIND_PACKAGE 的使用方法和 Find 模組的編寫參見下面:編寫屬於自己的 FindHello 模組。
FIND_LIBRARY 示例:
FIND_LIBRARY(libX X11 /usr/lib)
IF(NOT libX)
MESSAGE(FATAL_ERROR “libX not found”)
ENDIF(NOT libX)
四,控制指令:
1,IF 指令,基本語法為:
IF(expression_r_r)# THEN section.
相關推薦
CMake常用變數和常量環境變數查表手冊——整理
一,cmake 變數引用的方式: 前面我們已經提到了,使用${}進行變數的引用。在 IF 等語句中,是直接使用變數名而不通過${}取值 二,cmake 自定義變數的方式: 主要有隱式定義和顯式定義兩種,前面舉了一個隱式定義的例子,就是 PROJECT 指令,他會隱式的定義<proj
(轉)Linux 中/etc/profile、~/.bash_profile 環境變數配置及執行過程
環境變數是和Shell緊密相關的,使用者登入系統後就啟動了一個Shell。對於Linux來說一般是bash,但也可以重新設定或切換到其它的 Shell。對於UNIX,可能是CShelll。環境變數是通過Shell命令來設定的,設定好的環境變數又可以被所有當前使用者所執行的程式所使用。對於bash這個Shell
重新撿起JAVA 開發 1、配置環境變數
一、首先了解下什麼是JDK? 這裡我就不挨個敲出來了,因為看到我這個的都應該瞭解過,忘記的百度裡直接輸入JDK, 百度百科詳細介紹JDK[百度百科] 二、配置環境變數 首先下載jdk http:
Linux 中/etc/profile、~/.bash_profile 環境變數配置及執行過程
環境變數是和Shell緊密相關的,使用者登入系統後就啟動了一個Shell。對於Linux來說一般是bash,但也可以重新設定或切換到其它的 Shell。對於UNIX,可能是CShelll。環境變數是通過Shell命令來設定的,設定好的環境變數又可以被所有當前使用者所執行的程式所使用。對於bash這個Shell
linux shell “永久環境變數”、“臨時環境變數”和"普通變數"之完全解讀
這個年代, 大家寫點書, 也無非就是為了搞點錢, 基本都是羅列一些知識點, 基本都是寫給已經會了的人看的。 真正用心寫書的人, 不多。 如果真正用心寫書, 且站在讀者的角度去寫, 那就少之又少了。 關於linux shell環境變數, 我看
Visual Studio 2008 、 Windows 環境變數介紹和c++檔案流中檔案路徑
Visual Studio 2008 和 Windows 環境變數對設定 相對路徑很重要,這樣便於程式碼的移植,即使換一臺計算機,程式碼不用更改配置,直接就能用。 可以在專案的“工具”“屬性頁”對話方塊中任何接受字串的位置使用這些巨集。這些巨集不區分大小寫。
JAVA環境變數配置、ANDROID環境變數配置
每次新配環境都難免忘記,所以這裡簡單整理下,以後就方便些。 1.JAVA環境變數配置: 新增:JAVA_HOME C:\Program Files\Java\jdk1.8.0_60 新增:ClassPath
Maven學習記錄2——Mac maven、jdk環境變數配置
最近一直在學習使用Macbook,在這裡記錄一下所有遇到的問題 問題起源: 1.Macbook 安裝了Eclipse,Eclipse裝入外掛maven & git , 但是在git中clone project 的時候,經常會報錯: Could not ca
MarkDown的使用、JAVA環境變數的配置、JAVA基礎
目錄索引 MarkDown的使用 標題 引用 程式碼 圖片 索引 標題 使用#表示一級標題,##表示二級標題,###表示三級標題等等 使用===表示高階標題,—表示次階標題 引用 使用>表示一級引用,&
locale的設定及其LANG、LC_ALL、LANGUAGE環境變數的區別
locale命令 locale這個單詞中文翻譯成地區或者地域,其實這個單詞包含的意義要寬泛很多。Locale是根據計算機使用者所使用的語言,所在國家或者地區,以及當地的文化傳統所定義的一個軟體執行時的語言環境。 [[email protected] ~]$ locale LA
win7安裝兩個jdk,1.7和1.8,下載、安裝、配置環境變數,方便切換
之前用過1.6,後來換電腦後用的1.7,由於時代在發展,許多外掛、框架等新的功能需要jdk1.8才能使用,所以就想安裝1.8,不過1.7還不準備解除安裝,就考慮安裝多個jdk.先下載jdk1.8,建議去官網下載,需要oracle賬號,這個可以免費註冊我們選擇jdk1.8版本,
linux下export命令新增、刪除環境變數(轉載)
export命令 功能說明:設定或顯示環境變數。 語 法:export [-fnp][變數名稱]=[變數設定值] 補充說明:在shell中執行程式時,shell會提供一組環境變數。 export可新增,修改或刪除環境變數,供後續執行的程式使用。 export的效力僅及於該此登陸操作。 參 數:
jdk、tomcat 環境變數設定
1、JDK 環境變數配置 JAVA_HOME = C:\Program Files\Java\jdk1.7.0 path =%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
【TomCat配置】CATALINA_HOME、JAVA_HOME、JRE_HOME環境變數問題
啟動Tomcat檔案中的Start.bat時,出現錯誤:和原因:start.bat中會設定CATALINA_HOME的環境變數start.bat中會呼叫setclasspath.bat,setclass
Windows如何在cmd命令列中檢視、修改、刪除與新增、設定環境變數
首先明確一點: 所有的在cmd命令列下對環境變數的修改只對當前視窗有效,不是永久性的修改。也就是說當關閉此cmd命令列視窗後,將不再起作用。永久性修改環境變數的方法有兩種:一種是直接修改登錄檔(此種方法目前沒試驗過),另一種是通過我的電腦-〉屬性-〉高階,來設定系統的環
linux安裝jdk、設定環境變數
一、解除安裝Linux自帶的jdk # 檢視是否自帶了Java rpm -qa | grep java # 解除安裝Linux自帶的OpenJava yum remove -y java # 或者 rpm -e java 二、上傳或聯網下載jdk # 上傳或聯網下載JD
path、classpath環境變數配置
1、什麼是環境變數? 百度百科:一般是指在作業系統中用來指定作業系統執行環境的一些引數,如:臨時資料夾位置和系統資料夾位置等。 個人理解:環境變數有許多種,我們需要了解的path、classp
getenv、setenv函式(獲取和設定系統環境變數) 與 環境變數
1、getenv() 函式名: getenv 功 能: 從環境中取字串,獲取環境變數的值 用 法:char *getenv(char *envvar); 函式說明:getenv()用來取得引數envvar環境變數的內容。引數envvar為環境變數的名稱,如果該變
圖解 Linux 安裝 JDK1.8 、配置環境變數
1. 到官網下載 JDK 1.8 2. 用 rz 命令把 jdk-8u191-linux-x64.tar.gz 上傳到要安裝的位置,如: /root/chengxu/JDK 。 3.解壓: tar -zxvf jdk-8u191-linux-x64.
命令行基礎、目錄和文件管理、教學環境介紹、總結和答疑
文件夾 輸入 pass 必須 定義 往回 用法 基本用法 設備文件 查看內核版本[root@nsd1802 ~]# uname -r 3.10.0-693.el7.x86_64 [root@nsd1802 ~]# hostname #顯示主機名 [root@nsd18