【寫在前面】
CMake 的全域性屬性是指在 CMake 配置過程中,對整個專案範圍生效的設定。
這些屬性不同於目標 ( Target ) 屬性或目錄 ( Directory ) 屬性,後者僅對特定的目標或目錄生效。
【正文開始】
CMake 全域性範圍的屬性有( CMake 3.30 ):
- ALLOW_DUPLICATE_CUSTOM_TARGETS
- AUTOGEN_SOURCE_GROUP
- AUTOGEN_TARGETS_FOLDER
- AUTOMOC_SOURCE_GROUP
- AUTOMOC_TARGETS_FOLDER
- AUTORCC_SOURCE_GROUP
- AUTOUIC_SOURCE_GROUP
- CMAKE_C_KNOWN_FEATURES
- CMAKE_CUDA_KNOWN_FEATURES
- CMAKE_CXX_KNOWN_FEATURES
- CMAKE_HIP_KNOWN_FEATURES
- CMAKE_ROLE
- DEBUG_CONFIGURATIONS
- DISABLED_FEATURES
- ECLIPSE_EXTRA_CPROJECT_CONTENTS
- ECLIPSE_EXTRA_NATURES
- ENABLED_FEATURES
- ENABLED_LANGUAGES
- FIND_LIBRARY_USE_LIB32_PATHS
- FIND_LIBRARY_USE_LIB64_PATHS
- FIND_LIBRARY_USE_LIBX32_PATHS
- FIND_LIBRARY_USE_OPENBSD_VERSIONING
- GENERATOR_IS_MULTI_CONFIG
- GLOBAL_DEPENDS_DEBUG_MODE
- GLOBAL_DEPENDS_NO_CYCLES
- INSTALL_PARALLEL
- IN_TRY_COMPILE
- JOB_POOLS
- PACKAGES_FOUND
- PACKAGES_NOT_FOUND
- PREDEFINED_TARGETS_FOLDER
- PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE
- REPORT_UNDEFINED_PROPERTIES
- RULE_LAUNCH_COMPILE
- RULE_LAUNCH_CUSTOM
- RULE_LAUNCH_LINK
- RULE_MESSAGES
- TARGET_ARCHIVES_MAY_BE_SHARED_LIBS
- TARGET_MESSAGES
- TARGET_SUPPORTS_SHARED_LIBS
- USE_FOLDERS
- XCODE_EMIT_EFFECTIVE_PLATFORM_NAME
定義全域性屬性:
define_property(<GLOBAL | DIRECTORY | TARGET | SOURCE |
TEST | VARIABLE | CACHED_VARIABLE>
PROPERTY <name> [INHERITED]
[BRIEF_DOCS <brief-doc> [docs...]]
[FULL_DOCS <full-doc> [docs...]]
[INITIALIZE_FROM_VARIABLE <variable>])
在範圍內定義一個屬性,用於 set_property() 和 get_property() 命令。它主要用於定義屬性的初始化或繼承方式。從歷史上看,該命令還將文件與屬性相關聯,但這不再被視為主要用例。
示例:
# 定義一個名為 GLOBAL_PROPERTY_TEST 的全域性屬性
define_property(GLOBAL
# 全域性屬性的名稱
PROPERTY GLOBAL_PROPERTY_TEST
# 簡短的文件說明
BRIEF_DOCS "A global property test"
# 完整的文件說明
FULL_DOCS "A global property test"
)
設定全域性屬性:
set_property(<GLOBAL |
DIRECTORY [<dir>] |
TARGET [<target1> ...] |
SOURCE [<src1> ...]
[DIRECTORY <dirs> ...]
[TARGET_DIRECTORY <targets> ...] |
INSTALL [<file1> ...] |
TEST [<test1> ...] |
CACHE [<entry1> ...] >
[APPEND] [APPEND_STRING]
PROPERTY <name> [<value1> ...])
在範圍的零個或多個物件上設定一個屬性。
GLOBAL
範圍是唯一的,不接受名稱。如果給出
APPEND
選項,列表將附加到任何現有的屬性值(除了忽略和不附加空值)。如果給出APPEND_STRING
選項,字串將作為字串附加到任何現有屬性值,即它會產生更長的字串而不是字串列表。當使用APPEND
或APPEND_STRING
以及定義為支援INHERITED
行為的屬性時(請參閱 :command:define_property
),在找到要附加到的初始值時不會發生繼承。如果該屬性尚未在指定範圍內直接設定,則該命令的行為就好像沒有給出APPEND
或APPEND_STRING
一樣。
示例:
# 設定全域性屬性 GLOBAL_PROPERTY_TEST 為 ON
set_property(GLOBAL PROPERTY GLOBAL_PROPERTY_TEST ON)
獲取全域性屬性:
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])
從範圍內的一個物件獲取一個屬性。
GLOBAL
範圍是唯一的,不接受名稱。如果給出了
SET
選項,變數將被設定為一個布林值,指示該屬性是否已被設定。如果給出了DEFINED
選項,變數將被設定為一個布林值,指示該屬性是否已被定義,例如使用define_property
命令。 如果給出了BRIEF_DOCS
或FULL_DOCS
,那麼該變數將被設定為一個字串,其中包含所請求屬性的文件。如果為尚未定義的屬性請求文件,則返回“NOTFOUND
”。
示例:
# 獲取全域性屬性 GLOBAL_PROPERTY_TEST 的值,並將結果儲存在變數 IS_GLOBAL 中
get_property(IS_GLOBAL GLOBAL PROPERTY GLOBAL_PROPERTY_TEST)
其中,有一個專用於獲取 CMake 全域性屬性
命令:
get_cmake_property(<var> <property>)
從 CMake 例項獲取全域性屬性。
<property>
的值儲存在變數<var>
中。如果未找到該屬性,<var>
將被設定為NOTFOUND
。有關可用屬性,請參閱 cmake-properties(7) 手冊。除了全域性屬性,此命令(出於歷史原因)還支援 VARIABLES 和 MACROS 目錄屬性。它還支援一個特殊的
COMPONENTS
全域性屬性,該屬性列出了提供給 install() 命令的元件。
示例:
# 獲取當前 CMake 角色,並將結果儲存在變數 ROLE 中
get_cmake_property(ROLE CMAKE_ROLE)
最後完整測試一遍:
# 要求 CMake 最低版本為 3.16
cmake_minimum_required(VERSION 3.16)
# 定義一個名為 GLOBAL_PROPERTY_TEST 的全域性屬性
define_property(GLOBAL
# 全域性屬性的名稱
PROPERTY GLOBAL_PROPERTY_TEST
# 簡短的文件說明
BRIEF_DOCS "A global property test"
# 完整的文件說明
FULL_DOCS "A global property test"
)
# 設定全域性屬性 GLOBAL_PROPERTY_TEST 為 ON
set_property(GLOBAL PROPERTY GLOBAL_PROPERTY_TEST ON)
# 獲取全域性屬性 GLOBAL_PROPERTY_TEST 的值,並將結果儲存在變數 IS_GLOBAL 中
get_property(IS_GLOBAL GLOBAL PROPERTY GLOBAL_PROPERTY_TEST)
# 列印變數 IS_GLOBAL 的值,用於確認全域性屬性是否已設定
message("IS_GLOBAL: ${IS_GLOBAL}")
# 獲取當前 CMake 角色,並將結果儲存在變數 ROLE 中
get_cmake_property(ROLE CMAKE_ROLE)
# 列印變數 ROLE 的值,用於顯示當前 CMake 角色
message("ROLE: ${ROLE}")
CMake 輸出如下:
【結語】
專案連結(多多star呀..⭐_⭐):
Github 地址:https://github.com/mengps/LearnCMake