CMake中有很多內(nèi)置的變量腔丧,以CMAKE_開(kāi)頭放椰,本文要介紹的是另外一種“變量”,叫做屬性愉粤,它與一個(gè)范圍綁定砾医。當(dāng)CMake添加一個(gè)目錄、創(chuàng)建一個(gè)目標(biāo)衣厘、創(chuàng)建緩存條目藻烤、創(chuàng)建測(cè)試、創(chuàng)建安裝目錄時(shí)头滔,也同時(shí)會(huì)生成與這些范圍相關(guān)聯(lián)的屬性(范圍可以關(guān)聯(lián)多個(gè)不同屬性)。屬性無(wú)法通變量的獲取方式${}
直接得到涎显,需要使用本文介紹的get_propery()命令進(jìn)行獲取坤检。
命令簡(jiǎn)介
命令格式為:
get_property(<variable>
<GLOBAL |
DIRECTORY [<dir>] |
TARGET <target> |
SOURCE <source>
[DIRECTORY <dir> | TARGET_DIRECTORY <target>] |
INSTALL <file> |
TEST <test> |
CACHE <entry> |
VARIABLE >
PROPERTY <name>
[SET | DEFINED | BRIEF_DOCS | FULL_DOCS])
命令的第一個(gè)參數(shù)<variable>是存儲(chǔ)屬性獲取的結(jié)果,第二個(gè)參數(shù)表示待獲取的屬性歸屬的范圍期吓,第三個(gè)參數(shù)是PROPERTY選項(xiàng)后面跟著屬性的名稱(可以是CMake默認(rèn)定義的屬性早歇,也可以自定義屬性)。
簡(jiǎn)單的示例
例如讨勤,當(dāng)CMake讀取CMakeLists.txt文件啟動(dòng)構(gòu)建時(shí)箭跳,會(huì)對(duì)CMakeLists.txt文件所在的目錄,添加一個(gè)名為INCLUDE_DIRECTORIES屬性潭千,表示在CMake位于當(dāng)前目錄下的頭文件搜索目錄列表(通過(guò)include_directories()命令CMake會(huì)為該屬性賦值)谱姓,下面來(lái)簡(jiǎn)單演示下如何獲取這個(gè)屬性。
CMakeLists.txt文件內(nèi)容:
cmake_minimum_required(VERSION 3.22.1)
project(get_property_test)
get_property(dirs DIRECTORY ${CMAKE_CURRENT_SRC_DIR} PROPERTY INCLUDE_DIRECTORIES)
message("# Get current directory property INCLUDE_DIRECTORIES: ${dirs}")
include_directories(test)
get_property(dirs DIRECTORY ${CMAKE_CURRENT_SRC_DIR} PROPERTY INCLUDE_DIRECTORIES)
message("# Get current directory property INCLUDE_DIRECTORIES after include 'test': ${dirs}")
運(yùn)行cmake .
輸出結(jié)果:
# Get current directory property INCLUDE_DIRECTORIES:
# Get current directory property INCLUDE_DIRECTORIES after include 'test': /XXX/test
說(shuō)明在使用include_directories(test)后刨晴,當(dāng)前目錄的屬性INCLUDE_DIRECTORIES被修改了屉来,把test目錄增加了進(jìn)去。
參數(shù)詳解
范圍參數(shù)
指定的范圍必須是如下的選項(xiàng)之一:
-
GLOBAL
全局范圍狈癞,后面不需要指定范圍名稱茄靠。使用該選項(xiàng)時(shí),等同于命令get_cmake_property蝶桶,可以參考get_cmake_property命令介紹慨绳。
獲取CMAKE_ROLE全局屬性:
cmake_minimum_required(VERSION 3.22.1) project(get_property_test) get_property(role GLOBAL PROPERTY CMAKE_ROLE) message("# Get GLOBAL property CMAKE_ROLE: ${role}")
輸出結(jié)果
$ cmake . # Get GLOBAL property CMAKE_ROLE: PROJECT
-
DIRECTORY
目錄范圍,如果選項(xiàng)后不指定目錄名稱,默認(rèn)是當(dāng)前目錄脐雪。指定的目錄可以使絕對(duì)路徑也可以是相對(duì)路徑厌小,如果是相對(duì)路徑,那么是相對(duì)于當(dāng)前的目錄路徑喂江。該選項(xiàng)等同于命令get_directory_property召锈。
-
TARGET
獲取指定構(gòu)建目標(biāo)的屬性,等同于命令get_target_property()获询。
獲取NAME屬性
cmake_minimum_required(VERSION 3.22.1) project(get_property_test) add_executable(hello .) get_property(target_name TARGET hello PROPERTY NAME) message("# Get target property NAME: ${target_name}")
輸出結(jié)果
# Get GLOBAL property CMAKE_ROLE: PROJECT
-
SOURCE
獲取指定源文件屬性涨岁,該參數(shù)后面必須跟一個(gè)源文件名,默認(rèn)情況下吉嚣,源文件的屬性會(huì)賦值當(dāng)前源文件所在目錄的屬性梢薪。目錄也可以通過(guò)選項(xiàng)進(jìn)行指定。
- DIRECTORY <dir>:從指定的<dir>目錄獲取屬性尝哆,前提是該目錄是已經(jīng)通過(guò)add_subdirectory()添加或者是CMake構(gòu)建的頂層目錄秉撇。如果是相對(duì)路徑,則是針對(duì)當(dāng)前目錄的相對(duì)路徑秋泄。
- TARGET_DIRECTORY <target>:從構(gòu)建目標(biāo)<target>被創(chuàng)建的目錄中獲取屬性琐馆,前提是<target>必須已經(jīng)存在(通過(guò)add_executable或add_libraray創(chuàng)建)
-
INSTALL
獲取指定安裝目錄的屬性。
-
TEST
獲取指定測(cè)試的屬性恒序。
-
CACHE
獲取緩存條目的屬性瘦麸。
-
VARIABLE
獲取變量的屬性。
其他參數(shù)選項(xiàng)
-
SET
如果指定SET選項(xiàng)歧胁,則獲取的變量滋饲,表示的是屬性是否被設(shè)置過(guò),是一個(gè)布爾值喊巍。
-
DEFINED
如果指定DEFINED選項(xiàng)屠缭,則獲取的變量,表示的是屬性是否被定義崭参,是一個(gè)布爾值呵曹。
-
BRIEF_DOCS或FULL_DOCS
如果指定了這兩個(gè)選型,則獲取的變量是一個(gè)屬性文檔的字符串何暮。