CMake編程實踐(三) 常用變量和常用環境變量

常用變量和常用環境變量

cmake 變量引用的方式:

前面我們已經提到了,使用IF使{}進行變量的引用。在IF等語句中,是直接使用變量名而不通過{}取值

自定義變量的方式:

隱式定義:在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()添加。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章