cmake 常用變量和常用環境變量
一.cmake 變量引用的方式
前面我們已經提到了,使用${ }進行變量的引用。在 IF 等語句中,是直接使用變量名而不通過${ }取值.
二.cmake 自定義變量的方式
主要有隱式定義和顯式定義兩種,前面舉了一個隱式定義的例子,就是 PROJECT 指令,他會隱式的定義“<projectname>_BINARY_DIR ”和“<projectname>_SOURCE_DIR ”兩個變量。
使用 SET 指令,就可以構建一個自定義變量了。比如:
SET(HELLO_SRC main.SOURCE_PATH) #main.SOURCE_PATH代表main.cpp的路徑
這樣就可以通過${HELLO_SRC}來引用這個自定義變量了.
三.cmake 常用變量
1.CMAKE_BINARY_DIR
PROJECT_BINARY_DIR
<projectname>_BINARY_DIR
這三個變量指代的內容是一致的,如果是內部編譯,指得就是工程頂層目錄;如果是外部編譯,指的是工程編譯發生的目錄。
PROJECT_BINARY_DIR 跟其他指令稍有區別,現在,你可以理解為他們是一致的。
2.CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR
<projectname>_SOURCE_DIR
這三個變量指代的內容是一致的,不論采用何種編譯方式,都是工程頂層目錄。也就是在內部編譯時,他跟 CMAKE_BINARY_DIR 等變量一致。
PROJECT_SOURCE_DIR 跟其他指令稍有區別,現在,你可以理解為他們是一致的。
3.CMAKE_CURRENT_SOURCE_DIR
指的是當前處理的 CMakeLists.txt 所在的路徑,比如上面我們提到的 src 子目錄。
4.CMAKE_CURRRENT_BINARY_DIR
如果是內部編譯,它跟 CMAKE_CURRENT_SOURCE_DIR 一致,如果是外部編譯,他指的是 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)
# ${PROJECT_SOURCE_DIR}為絕對路徑
# /cmake 為相對路徑
這時候你就可以通過 INCLUDE 指令來調用自己的模塊了。
8.EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH
分別用來重新定義最終結果的存放目錄。
9.PROJECT_NAME
返回通過 PROJECT 指令定義的項目名稱。
四.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
如果頭文件和庫文件沒有存放在常規路徑(/usr/include, /usr/local/include 等),則可以通過這些變量進行設置。
五.系統信息
1.CMAKE_MAJOR_VERSION CMAKE 主版本號,比如 2.4.6 中的 2
2.CMAKE_MINOR_VERSION CMAKE 次版本號,比如 2.4.6 中的 4
3.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()添加。