cmake常用變量和命令解析


變量

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 … ) 向工程添加多個特定的頭文件搜索路徑,路徑之間用空格分隔,如果路徑包含空格,可以使用雙引號將它括起來,默認的行為為追加到當前頭文件搜索路徑的后面。有如下兩種方式可以控制搜索路徑添加的位置:
  • CMAKE_INCLUDE_DIRECTORIES_BEFORE,通過SET這個cmake變量為on,可以將添加的頭文件搜索路徑放在已有路徑的前面
  • 通過AFTER或BEFORE參數,也可以控制是追加還是置前
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_

 

  • FIND_FILE(<VAR> name path1 path2 …) VAR變量代表找到的文件全路徑,包含文件名
  • FIND_LIBRARY(<VAR> name path1 path2 …) VAR變量代表找到的庫全路徑,包含庫文件
  • FIND_PATH(<VAR> name path1 path2 …) VAR變量代表包含這個文件的路徑
  • FIND_PROGRAM(<VAR> name 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)將其放入工程的某個目錄供工程使用
IF

數字比較表達式
IF (variable LESS number)
IF (string LESS number)
IF (variable GREATER number)
IF (string GREATER number)
IF (variable EQUAL number)
IF (string EQUAL number)

按照字母表順序進行比較
IF (variable STRLESS string)
IF (string STRLESS string)
IF (variable STRGREATER string)
IF (string STRGREATER string)
IF (variable STREQUAL string)
IF (string STREQUAL string)

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為步進,
注意:直到遇到ENDFOREACH指令,整個語句塊才會得到真正的執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM