CMake 屬性之全域性屬性

梦起丶發表於2024-10-09

【寫在前面】

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 選項,字串將作為字串附加到任何現有屬性值,即它會產生更長的字串而不是字串列表。當使用 APPENDAPPEND_STRING 以及定義為支援 INHERITED 行為的屬性時(請參閱 :command:define_property),在找到要附加到的初始值時不會發生繼承。如果該屬性尚未在指定範圍內直接設定,則該命令的行為就好像沒有給出 APPENDAPPEND_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_DOCSFULL_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) 手冊。

除了全域性屬性,此命令(出於歷史原因)還支援 VARIABLESMACROS 目錄屬性。它還支援一個特殊的 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 輸出如下:

image


【結語】

專案連結(多多star呀..⭐_⭐):

Github 地址:https://github.com/mengps/LearnCMake

相關文章