通過一個或多個CMakeLists.txt文件來控制CMake項目,CMakeLists.txt中包含一系列命令來描述需要執行的構建。
1. CMake語法
CMakeLists.txt中的指令格式是:
command(args1 args2 …)
command代表不同的命令,args是不同的參數,多參數之間用空格隔開。
2. CMake 常用變量
- CMAKE_BINARY_DIR、PROJECT_BINARY_DIR、<projectname>_BINARY_DIR:指的是工程編譯發生的目錄
- CMAKE_SOURCE_DIR、PROJECT_SOURCE_DIR、<projectname>_SOURCE_DIR: 指的是工程頂層目錄
- CMAKE_CURRENT_SOURCE_DIR: 指的是當前處理的CMakeLists.txt所在路徑
- CMAKE_CURRENT_BINARY_DIR: 指的是工程編譯結果存放的目標目錄,可以通過set命令或ADD_SUBDIRECTORY(src bin)改變這個變量的值,但是set(EXECUTABLE_OUTPUT_PATH <new_paht>)並不改變這個變量的值,只會影響最終的保存路徑
- CMAKE_CURRENT_LSIT_FILE: 指的是當前CMakeLists.txt文件所在完整路徑
- CMAKE_CURRENT_LSIT_LINE: 指的是調用這個變量當前所在行(在MakeLists.txt中的行數)
- CMAKE_MODULE_PATH: 指的是自己加入的cmake模塊路徑,通過set來設置
- EXECUTABLE_OUTPUT_PATH和LIBRARY_OUTPUT_PATH:定義最終編譯結果的二進制執行文件和庫文件的存放目錄
- PROJECT_NAME: 指的是通過set設置的PROJECT的名稱
- ENV{NAME}: 指的是環境變量,通過set(ENV{NAME} new_path)設置,通過$ENV{NAME}調用
- CMAKE_INCLUDE_PATH和CMAKE_LIBRARY_PATH:這兩個是系統變量而不是cmake變量,需要在bash中用export或在csh中用set命令設置
- CMAKE_MAJOR_VERSION: CMAKE主版本號,比如 2.4.6 中的2
- CMAKE_MINOR_VERSION: CMAKE次版本號,比如 2.4.6 中的4
- CMAKE_PATCH_VERSION: CMAKE補丁等級,比如 2.4.6 中的6
- CMAKE_SYSTEM:系統名稱,比如 Linux-2.6.22
- CMAKE_SYSTEM_NAME: 不包含版本的系統名,比如 Linux
- CMAKE_SYSTEM_VERSION: 系統版本,比如 2.6.22
- CMAKE_SYSTEM_PROCESSOR: 處理器名稱,比如 i686.
- UNIX: 在所有的類UNIX平臺爲 TRUE,包括 OS X 和 cygwin
- WIN32:在所有的win32平臺爲 TRUE,包括 cygwin
3. CMake常用指令
- cmake_minimum_required:用於說明和設置所需要的CMake的最低版本,一般要在CMakeLists.txt文件開頭調用。例如:
cmake_minimum_required(VERSION 3.15.0)
- project:爲整個工程設置一個工程名,並可以指定工程支持的語言,默認支持所有語言。例如:
project(OCR CXX C Java])
project(OCR)
cmake系統預定義了兩個cmake變量PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR,對於內部構建(in-source build,在源文件所在目錄執行cmake,生成的臨時文件和源文件處於同一目錄),這兩個變量都指向工程所在路徑;對於外部構建(out-of-source build,在源文件之外的其他目錄執行cmake),PROJECT_BINARY_DIR指向cmake的編譯路徑,PROJECT_SOURCE_DIR指向原工程路徑。
- set:將一個CMAKE變量設置爲給定值。例如:
set(VOC_DIR D:\\xxx\\xxx)
也可以把一個變量設置成“一系列”值:
set(SRC_LIST main.cc util.cc train.cc)
- $: 使用${}的方式對cmake變量取值或引用(if語句中直接使用變量名而不需要通過${}取值)。例如:
set(VOC_DIR D:\\xxx\\xxx)
${VOC_DIR}
- message:在終端向用戶輸出消息。包含三種類型,SEND_ERROR(產生錯誤),STATUS(狀態信息,帶前綴-)和FATAL_ERROR(終止cmake過程),例如:
message(STATUS "This is BINARY dir " ${PROJECT_BINARY_DIR})
- add_executable: 使用指定的源文件(第二個參數,可以一個或多個),生成一個文件名爲第一個參數名(這個名稱可以任意指定,跟工程名沒有關係)的可執行文件。例如:
add_executable(OCR Implement_CTC.cc)
add_executable(OCR Implement_CTC.cc util.cc)
add_executable(OCR ${SRC_LIST})
- CMAKE_INCLUDE_CURRENT_DIR: 添加CMAKE_CURRENT_BINARY_DIR和CMAKE_DURRENT_SOURCE_DIR到當前CMakeLists.txt,相當於INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})的簡寫
- option: 提供給用戶一個可以在命令行進行選擇的開關選項,並提供一個默認值(ON 或 OFFF)。例如:
option(BUILD_WITH_CUDA “build project weith CUDA” OFF)
冒號裏的是描述信息,option和if一起配合使用,可以針對編譯環境做不同的定製化處理,包括項目中宏的替換和使用等
- configure_file: 將文件複製到指定目錄並同時可以選擇修改文件屬性或特定變量的值。例如:
configure_file("${PROJECT_SOURCE_DIR}/download.sh" "${CMAKE_BINARY_DIR}/download.sh" @ONLY)
configure_file("${PROJECT_SOURCE_DIR}/download.sh" "${CMAKE_BINARY_DIR}/download.sh" COPYONLY)
- add_subdirectory:向當前工程添加存放源文件的子目錄(第一個參數)、指定中間二進制和目標二進制文件的存放目錄(第二個參數)、指定構建時需要排除的目錄(第三個參數),比如example目錄是平臺相關的,就需要在指定平臺上構建時排除掉。例如:
add_subdirectory(src, bin)
將src子目錄加入工程,並指定編譯輸出的結果存放路徑爲bin
- 與編譯結果相關的兩個內部變量是EXECUTABLE_OUTPUT_PATH和LIBRARY_OUTPUT_PATH,分別指代可執行文件的輸出路徑和庫的輸出路徑。可以通過set指令設定這兩個路徑:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
- include_directories: 將給定的目錄添加到編譯器用於搜索包含文件的目錄。相對路徑則相對於當前源目錄。例如:
include_directories(${OPENCV_BUILD_DIR})
- target_include_directories:將給定的目錄添加到指定的目標的包含文件的目錄。例如:
target_include_directories(OCR PUBLIC ${OpenCV_INCLUDE_DIRS})
- include:包含其他目錄的CMakeLists.txt文件。例如:
include(${OPENCV_BUILD_DIR}/CMakeLists.txt)
- find_package:查找並加載外部項目的設置。例如:
find_package(OpenCV REQUIRED)
設置的REQUIRED參數表示當找不到 package 時,終止編譯過程
- add_definitions:爲源文件的編譯添加由-D引入的宏定義,用於代碼中的 “#ifdef xxx #endif”部分。可以同時定義多個,用空格隔開,。例如:
add_definitions(-DWIN32)
- add_dependencies: 定義依賴,需確保在編譯前所定義的依賴已經完成構建。
- add_library:使用指定的源文件給項目添加一個庫。例如:
add_library(OCR ${detecte_src_head})
- target_link_libraries: 將給定的庫鏈接到一個目標上。例如:
target_link_libraries(OCR PUBLIC ${OpenCV_LIBS})
- cmake_policy: 設置策略。 策略是 CMake 中用來改善向後兼容性和追蹤兼容性的一種機制,CMake 中的所有策略都被賦予一個 CMPNNNN 格式的識別符,其中 NNNN 是一個整數值。在cmake_policy命令中使用SET可以用來明確地指定一個特定策略是使用新的行爲還是舊的行爲。例如:
cmake_policy(SET CMP0054 NEW)
cmake_policy(SET CMP0079 OLD)
- aux_source_directory: 查找一個目錄中的所有源文件,並將名稱列表存儲在提供的變量中。例如:
aux_source_directory(. DIR_SRCS)
add_executable(${APP_NAME} ${DIR_SRCS})
- find_file: 查找一個文件的完整路徑。例如:
find_file(HELLO_H hello.h)
- set_target_properties: 設置目標的一些屬性來改變它們構建的方式。例如:
set_target_properties(ocr PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
參考《CMake實踐》