變量
cmake中一些預定義變量
PROJECT_SOURCE_DIR | 工程的根目錄 |
PROJECT_BINARY_DIR | 運行cmake命令的目錄,通常是${PROJECT_SOURCE_DIR}/build |
CMAKE_INCLUDE_PATH | 環境變量,非cmake變量 |
CMAKE_LIBRARY_PATH | 環境變量 |
CMAKE_CURRENT_SOURCE_DIR | 當前處理的CMakeLists.txt所在的路徑 |
CMAKE_CURRENT_BINARY_DIR | target編譯目錄 使用ADD_SURDIRECTORY(src bin)可以更改此變量的值 SET(EXECUTABLE_OUTPUT_PATH <新路徑>)並不會對此變量有影響,只是改變了最終目標文件的存儲路徑 |
CMAKE_CURRENT_LIST_FILE | 輸出調用這個變量的CMakeLists.txt的完整路徑 |
CMAKE_CURRENT_LIST_LINE | 輸出這個變量所在的行 |
CMAKE_MODULE_PATH | 定義自己的cmake模塊所在的路徑 SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令來調用自己的模塊 |
EXECUTABLE_OUTPUT_PATH | 重新定義目標二進制可執行文件的存放位置 |
LIBRARY_OUTPUT_PATH | 重新定義目標鏈接庫文件的存放位置 |
PROJECT_NAME | 返回通過PROJECT指令定義的項目名稱 |
CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS | 用來控制IF ELSE語句的書寫方式 |
系統變量
CMAKE_MAJOR_VERSION | cmake主版本號,如3.8.5中的3 |
CMAKE_MINOR_VERSION | cmake次版本號,如3.8.5中的8 |
CMAKE_PATCH_VERSION | cmake補丁等級,如3.8.5中的5 |
CMAKE_SYSTEM | 系統名稱 |
CAMKE_SYSTEM_NAME | 不包含版本的系統名 |
CMAKE_SYSTEM_VERSION | 系統版本 |
CMAKE_SYSTEM_PROCESSOR | 處理器名稱 |
UNIX | 在所有的類UNIX平台為TRUE,包括OS X和cygwin |
WIN32 | 在所有的win32平台為TRUE,包括cygwin |
開關選項
BUILD_SHARED_LIBS | 控制默認的庫編譯方式。如果未進行設置,使用ADD_LIBRARY時又沒有指定庫類型,默認編譯生成的庫都是靜態庫 (可在t3中稍加修改進行驗證) |
CMAKE_C_FLAGS | 設置C編譯選項 |
CMAKE_CXX_FLAGS | 設置C++編譯選項 |
cmake常用命令
基本語法規則:
- cmake變量使用${}方式取值,但是在IF控制語句中是直接使用變量名
- 環境變量使用$ENV{}方式取值,使用SET(ENV{VAR} VALUE)賦值
- 指令(參數1 參數2…)
參數使用括弧括起,參數之間使用空格或分號分開
以ADD_EXECUTABLE指令為例:
ADD_EXECUTABLE(hello main.c func.c)
或者
ADD_EXECUTABLE(hello main.c;func.c)
- 指令是大小寫無關的,參數和變量是大小寫相關的。推薦你全部使用大寫指令
部分常用命令
PROJECT | PROJECT(projectname [CXX] [C] [Java]) | 指定工程名稱,並可指定工程支持的語言。支持語言列表可忽略,默認支持所有語言 |
SET | SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) | 定義變量(可以定義多個VALUE,如SET(SRC_LIST main.c util.c reactor.c)) |
MESSAGE | MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display” …) | 向終端輸出用戶定義的信息或變量的值 SEND_ERROR, 產生錯誤,生成過程被跳過 STATUS, 輸出前綴為—的信息 FATAL_ERROR, 立即終止所有cmake過程 |
ADD_EXECUTABLE | ADD_EXECUTABLE(bin_file_name ${SRC_LIST}) | 生成可執行文件 |
ADD_LIBRARY | ADD_LIBRARY(libname [SHARED | STATIC | MODULE] [EXCLUDE_FROM_ALL] SRC_LIST) | 生成動態庫或靜態庫 SHARED 動態庫 STATIC 靜態庫 MODULE 在使用dyld的系統有效,若不支持dyld,等同於SHARED EXCLUDE_FROM_ALL 表示該庫不會被默認構建 |
SET_TARGET_PROPERTIES | 設置輸出的名稱,設置動態庫的版本和API版本 | |
CMAKE_MINIMUM_REQUIRED | CMAKE_MINIMUM_REQUIRED(VERSION version_number [FATAL_ERROR]) | 聲明CMake的版本要求 |
ADD_SUBDIRECTORY | ADD_SUBDIRECTORY(src_dir [binary_dir] [EXCLUDE_FROM_ALL]) | 向當前工程添加存放源文件的子目錄,並可以指定中間二進制和目標二進制的存放位置 EXCLUDE_FROM_ALL含義:將這個目錄從編譯過程中排除 |
INCLUDE_DIRECTORIES | INCLUDE_DIRECTORIES([AFTER | BEFORE] [SYSTEM] dir1 dir2 … ) | 向工程添加多個特定的頭文件搜索路徑,路徑之間用空格分隔,如果路徑包含空格,可以使用雙引號將它括起來,默認的行為為追加到當前頭文件搜索路徑的后面。有如下兩種方式可以控制搜索路徑添加的位置:
|
LINK_DIRECTORIES | LINK_DIRECTORIES(dir1 dir2 …) | 添加非標准的共享庫搜索路徑 |
TARGET_LINK_LIBRARIES | TARGET_LINK_LIBRARIES(target lib1 lib2 …) | 為target添加需要鏈接的共享庫 |
ADD_DEFINITIONS | ADD_DEFINITIONS(-DENABLE_DEBUG -DABC) | 向C/C++編譯器添加-D定義,參數之間用空格分隔 |
ADD_DEPENDENCIES | ADD_DEPENDENCIES(target-name depend-target1 depend-target2 …) | 定義target依賴的其他target,確保target在構建之前,其依賴的target已經構建完畢 |
AUX_SOURCE_DIRECTORY | AUX_SOURCE_DIRECTORY(dir VAR) | 發現一個目錄下所有的源代碼文件並將列表存儲在一個變量中 把當前目錄下的所有源碼文件名賦給變量DIR_HELLO_SRCS |
EXEC_PROGRAM | EXEC_PROGRAM(Executable [dir where to run] [ARGS <args>][OUTPUT_VARIABLE <var>] [RETURN_VALUE <value>]) | 用於在指定目錄運行某個程序(默認為當前CMakeLists.txt所在目錄),通過ARGS添加參數,通過OUTPUT_VARIABLE和RETURN_VALUE獲取輸出和返回值 |
INCLUDE | INCLUDE(file [OPTIONAL]) 用來載入CMakeLists.txt文件 INCLUDE(module [OPTIONAL])用來載入預定義的cmake模塊 |
OPTIONAL參數的左右是文件不存在也不會產生錯誤 可以載入一個文件,也可以載入預定義模塊(模塊會在CMAKE_MODULE_PATH指定的路徑進行搜索) 載入的內容將在處理到INCLUDE語句時直接執行 |
FIND_ |
|
|
IF | 數字比較表達式 按照字母表順序進行比較 |
IF (expression), expression不為:空,0,N,NO,OFF,FALSE,NOTFOUND或<var>_NOTFOUND,為真 IF (not exp), 與上面相反 IF (var1 AND var2) IF (var1 OR var2) IF (COMMAND cmd) 如果cmd確實是命令並可調用,為真 IF (EXISTS dir) IF (EXISTS file) 如果目錄或文件存在,為真 IF (file1 IS_NEWER_THAN file2),當file1比file2新,或file1/file2中有一個不存在時為真,文件名需使用全路徑 IF (IS_DIRECTORY dir) 當dir是目錄時,為真 IF (DEFINED var) 如果變量被定義,為真 IF (var MATCHES regex) 此處var可以用var名,也可以用${var} IF (string MATCHES regex) |
WHILE |
WHILE(condition)
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
ENDWHILE(condition)
|
其真假判斷條件可以參考IF指令 |
FOREACH | FOREACH指令的使用方法有三種形式: 列表:FOREACH(loop_var arg1 arg2 ...)
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
ENDFOREACH(loop_var)
范圍:FOREACH(loop_var RANGE total)
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
ENDFOREACH(loop_var)
范圍和步進:FOREACH(loop_var RANGE start stop [step])
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
ENDFOREACH(loop_var)
從start開始到stop結束,以step為步進, |