文章目錄
- 常用變量和常用環境變量
- cmake常用變量:
- 1. CMAKE_BINARY_DIR
- 2. CMAKE_SOURCE_DIR
- 3. CMAKE_CURRENT_SOURCE_DIR
- 4. CMAKE_CURRRENT_BINARY_DIR
- 5. CMAKE_CURRENT_LIST_FILE
- 6. CMAKE_CURRENT_LIST_LINE
- 7. CMAKE_MODULE_PATH
- 8. EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH
- 9. PROJECT_NAME
- 10. CMAKE_INCLUDE_CURRENT_DIR
- 11. CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE
- cmake調用環境變量
- 主要的開關選項
常用變量和常用環境變量
cmake 變量引用的方式:
前面我們已經提到了,使用{}取值
自定義變量的方式:
隱式定義:在CMake中的PROJECT指令,會隱式定義_BINARY_DIR 和_SOURCE_DIR 兩個變量。
顯式定義:使用SET指令,就可以構建一個自定義變量
比如:
SET(SOURCE main.c),其他地方就是可以使用${SOURCE}來引用這個自定義的變量
cmake常用變量:
1. CMAKE_BINARY_DIR
PROJECT_BINARY_DIR
_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-ofsource 編譯,它指的是 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 模塊路徑設
置一下。
e.g:
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
這時候你就可以通過 INCLUDE 指令來調用自己的模塊了。
8. EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH
分別用來重新定義最終結果的存放目錄
9. PROJECT_NAME
返回通過 PROJECT 指令定義的項目名稱
10. 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})
11. CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE
將工程提供的頭文件目錄始終至於系統頭文件目錄的前面,當你定義的頭文件確實跟系統發生衝突時可以提供一些幫助。
cmake調用環境變量
使用$ENV{NAME}指令就可以調用系統的環境變量了
設置環境變量的方式是:
SET(ENV{變量名} 值)
# 設置環境變量
SET(ENV{CUR_CMAKE_DIR} ${CMAKE_CURRENT_LIST_FILE})
MESSAGE(STATUS "CUR_CMAKE_DIR dir:$ENV{CUR_CMAKE_DIR}")
獲取系統信息
1,CMAKE_MAJOR_VERSION,CMAKE 主版本號,比如 3.5.1 中的 3
2,CMAKE_MINOR_VERSION,CMAKE 次版本號,比如 3.5.1 中的 5
3,CMAKE_PATCH_VERSION,CMAKE 補丁等級,比如 3.5.1 中的 1
4,CMAKE_SYSTEM,系統名稱,比如 Linux-4.10.0-28-generic
5,CMAKE_SYSTEM_NAME,不包含版本的系統名,比如 Linux
6,CMAKE_SYSTEM_VERSION,系統版本,比如 4.10.0-28-generic
7,CMAKE_SYSTEM_PROCESSOR,處理器名稱,比如 x86_64
8,UNIX,在所有的類 UNIX 平臺爲 TRUE,包括 OS X 和 cygwin
9,WIN32,在所有的 win32 平臺爲 TRUE,包括 cygwin
# 系統信息
MESSAGE(STATUS "CMAKE_MAJOR_VERSION:"${CMAKE_MAJOR_VERSION})
MESSAGE(STATUS "CMAKE_MINOR_VERSION:"${CMAKE_MINOR_VERSION})
MESSAGE(STATUS "CMAKE_PATCH_VERSION:"${CMAKE_PATCH_VERSION})
MESSAGE(STATUS "CMAKE_SYSTEM:"${CMAKE_SYSTEM})
MESSAGE(STATUS "CMAKE_SYSTEM_NAME:"${CMAKE_SYSTEM_NAME})
MESSAGE(STATUS "CMAKE_SYSTEM_VERSION:"${CMAKE_SYSTEM_VERSION})
MESSAGE(STATUS "CMAKE_SYSTEM_PROCESSOR:"${CMAKE_SYSTEM_PROCESSOR})
MESSAGE(STATUS "UNIX:"${UNIX})
MESSAGE(STATUS "WIN32:"${WIN32})
# -- CMAKE_MAJOR_VERSION:3
# -- CMAKE_MINOR_VERSION:5
# -- CMAKE_PATCH_VERSION:1
# -- CMAKE_SYSTEM:Linux-4.10.0-28-generic
# -- CMAKE_SYSTEM_NAME:Linux
# -- CMAKE_SYSTEM_VERSION:4.10.0-28-generic
# -- CMAKE_SYSTEM_PROCESSOR:x86_64
# -- UNIX:1
# -- WIN32:
主要的開關選項
CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS
用來控制 IF ELSE 語句的書寫方式,在下一節語法部分會講到。
BUILD_SHARED_LIBS
這個開關用來控制默認的庫編譯方式,如果不進行設置,使用 ADD_LIBRARY 並沒有指定庫類型的情況下,默認編譯生成的庫都是靜態庫。如果 SET(BUILD_SHARED_LIBS ON)後,默認生成的爲動態庫。
CMAKE_C_FLAGS
設置 C 編譯選項,也可以通過指令 ADD_DEFINITIONS()添加。
CMAKE_CXX_FLAGS
設置 C++編譯選項,也可以通過指令 ADD_DEFINITIONS()添加。