04 cmake關於find_packet使用

本章要討論的問題:如何使用切換多個版本的依賴包?

學習find_packet,並掌握以下內容:

  • 明確find_packet() 的查找順序
  • 使用find_packet()找到非cmake構建安裝的包

find_packet()的用法

find_packet()有兩種模式,Module模式和Config模式,其中Module模式是基礎用法,Config模式較爲複雜。

Module模式下,如果按照用戶指定的配置找不到包,主會自動進入Config模式

Module模式

find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[NO_POLICY_SCOPE])

version 如果指定就必須檢查找到的包的版本是否與version兼容
EXACT 與version配合使用,如果指定version的同時又指定EXACT,必須檢查找到的包的版本是否與version匹配
QUIET 如果查找失敗,不會在屏幕上輸出(如果指定了REQUIRED,則QUIET失效)
MODULE 只在Module模式下查找
REQUIRED 表示一定要找到包,如果失敗則停止cmake
COMPONENTS components 表示一定要找到組件,如果失敗則停止cmake
OPTIONAL_COMPONENTS components 表示找不到組件,也繼續執行cmake

查找順序:
Module模式下查找名爲 Find<PackageName>.cmake 的文件

先在 CMAKE_MODULE_PATH 變量對應的路徑下查找,如果路徑爲空或者查找失敗,則在cmake安裝時的module目錄下查找

Config模式

find_package(<PackageName> [version] [EXACT] [QUIET]
[REQUIRED] [[COMPONENTS] [components...]]
[CONFIG|NO_MODULE]
[NO_POLICY_SCOPE]
[NAMES name1 [name2 ...]]
[CONFIGS config1 [config2 ...]]
[HINTS path1 [path2 ... ]]
[PATHS path1 [path2 ... ]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_PACKAGE_REGISTRY]
[NO_CMAKE_BUILDS_PATH] # Deprecated; does nothing.
[NO_CMAKE_SYSTEM_PATH]
[NO_CMAKE_SYSTEM_PACKAGE_REGISTRY]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH])

查找順序:
Config模式下查找名爲 <PackageName>.Config.cmake<lower-case-package-name>-config.cmake 的文件。查找順序如下:

  1. <PackageName>_ROOT 的cmake變量或者環境變量

    注意:如果指定了 <PackageName>_DIR cmake變量,那麼 <PackageName>_ROOT 將不起作用

  2. cmake特定的緩存變量
    CMAKE_PREFIX_PATH
    CMAKE_FRAMEWORK_PATH
    CMAKE_APPBUNDLE_PATH

    可以通過設定NO_CMAKE_PATH來關閉這一查找順序

  3. cmake待定的環境變量
    <PackageName>_DIR
    CMAKE_PREFIX_PATH
    CMAKE_FRAMEWORK_PATH
    CMAKE_APPBUNDLE_PATH

    可以通過NO_CMAKE_ENVIRONMENT_PATH來跳過

  4. HINT字段指定的路徑

  5. 系統環境變量PATH

    其中如果是以/bin或者/sbin結尾的,會自動轉化爲其父目錄
    通過指定NO_SYSTEM_ENVIRONMENT_PATH來跳過

  6. 存儲在cmake的"User Package Registry"(用戶包註冊表)中的路徑。

    通過設定NO_CMAKE_PACKAGE_REGISTRY,或者:設定CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY爲true來避開

  7. 設定爲當前系統定義的cmake變量:
    CMAKE_SYSTEM_PREFIX_PATH
    CMAKE_SYSTEM_FRAMEWORK_PATH
    CMAKE_SYSTEM_APPBUNDLE_PATH

    通過設定NO_CMAKE_SYSTEM_PATH來跳過

  8. 在cmake的"System Package Registry"(系統包註冊表)中查找。

    通過設定NO_CMAKE_SYSTEM_PACKAGE_REGISTRY跳過。或者通過設定CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY爲true

  9. 從PATHS字段指定的路徑中查找

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