CMake編程(二)__編程

來源:互聯網
上載者:User

CMD#29:find_file 尋找一個檔案的完整路徑。

   find_file(<VAR> name1 [path1 path2 ...])

  這是該命令的精簡格式,對於大多數場合它都足夠了。它與命令find_file(<VAR> name1 [PATHS path1 path2 ...])是等價的。

   find_file(             <VAR>             name | NAMES name1 [name2 ...]             [HINTS path1 [path2 ... ENV var]]             [PATHS path1 [path2 ... ENV var]]             [PATH_SUFFIXES suffix1 [suffix2 ...]]             [DOC "cache documentation string"]             [NO_DEFAULT_PATH]             [NO_CMAKE_ENVIRONMENT_PATH]             [NO_CMAKE_PATH]             [NO_SYSTEM_ENVIRONMENT_PATH]             [NO_CMAKE_SYSTEM_PATH]             [CMAKE_FIND_ROOT_PATH_BOTH |              ONLY_CMAKE_FIND_ROOT_PATH |              NO_CMAKE_FIND_ROOT_PATH]            )

  這條命令用來尋找指定檔案的完整路徑。一個名字是<VAR>的緩衝條目(參見CMakeCache.txt的介紹——譯註)變數會被建立,用來儲存該命令的結果。如果發現了檔案的一個完整路徑,該結果會被儲存到該變數裡並且搜尋過程不會再重複,除非該變數被清除。如果什麼都沒發現,搜尋的結果將會是<VAR>-NOTFOUND;並且在下一次以相同的變數調用find_file時,該搜尋會重新嘗試。被搜尋的檔案的檔案名稱由NAMES選項後的名字列表指定。附加的其他搜尋位置可以在PATHS選項之後指定。如果ENV var在HINTS或PATHS段中出現,環境變數var將會被讀取然後被轉換為一個系統級環境變數,並儲存在一個cmake風格的路徑list中。比如,使用ENV PATH將會將系統的path變數列出來。在DOC之後的變數將會用於cache中的文檔字串(documentation string)。PATH_SUFFIXES指定了在每個搜尋路徑下的需要搜尋的子路徑。

  如果指定了NO_DEFAULT_PATH選項,那麼在搜尋時不會附加其它路徑。如果沒有指定NO_DEFAULT_PATH選項,搜尋過程如下:

  1、在cmake特有的cache變數中指定的搜尋路徑搜尋。這些路徑用於在命令列裡用-DVAR=value被設定。如果使用了NO_CMAKE_PATH選項,該路徑會被跳過。(此句翻譯可能有誤——譯註。)搜尋路徑還包括:    

  對於每個在CMAKE_PREFIX_PATH中的路徑<prefix>,<prefix>/include  
  變數:CMAKE_INCLUDE_PATH
  變數:CMAKE_FRAMEWORK_PATH

  2、在cmake特定的環境變數中指定的搜尋路徑搜尋。該路徑會在使用者的shell配置中被設定。如果指定了NO_CMAKE_ENVIRONMENT_PATH選項,該路徑會被跳過。搜尋路徑還包括:

  對於每個在CMAKE_PREFIX_PATH中的路徑<prefix>,<prefix>/include  
  變數:CMAKE_INCLUDE_PATH
  變數:CMAKE_FRAMEWORK_PATH

  3、由HINTS選項指定的搜尋路徑。這些路徑是由系統內省(introspection)時計算出來的路徑,比如已經發現的其他項的位置所提供的痕迹。硬式編碼參考路徑應該使用PATHS選項指定。(HINTS與PATHS有何不同。比後者的優先順序高。有疑問。——譯註)

  4、搜尋標準的系統內容變數。如果指定NO_SYSTEM_ENVIRONMENT_PATH選項,搜尋路徑將跳過其後的參數。搜尋路徑包括環境變數PATH個INCLUDE。

  5、尋找在當前系統的平台檔案中定義的cmake變數。如果指定了NO_CMAKE_SYSTEM_PATH選項,該路徑會被跳過。其他的搜尋路徑還包括:

  對於每個在CMAKE_PREFIX_PATH中的路徑<prefix>,<prefix>/include  
  變數:CMAKE_SYSTEM_INCLUDE_PATH
  變數:CMAKE_SYSTEM_FRAMEWORK_PATH

  6、搜尋由PATHS選項指定的路徑或者在命令的簡寫版本中指定的路徑。這一般是一些硬式編碼參考路徑。在Darwin後者支援OS X架構的系統上,cmake變數CMAKE_FIND_FRAMWORK可以設定為空白或者下述值之一:

   "FIRST"  - 在標準庫或者標頭檔之前先尋找架構。對於Darwin系統,這是預設的。   "LAST"   - 在標準庫或標頭檔之後再尋找架構。   "ONLY"   - 只尋找架構。   "NEVER" - 從不尋找架構。

  在Darwin或者支援OS X Application Bundles的系統上,cmake變數CMAKE_FIND_APPBUNDLE可以被設定為空白,或者下列值之一:

   "FIRST"  - 在標準程式之前尋找application bundles,這也是Darwin系統的預設選項。   "LAST"   - 在標準程式之後尋找application bundlesTry。   "ONLY"   - 只尋找application bundles。   "NEVER" - 從不尋找application bundles。

  CMake的變數CMAKE_FIND_ROOT_PATH指定了一個或多個在所有其它搜尋路徑之前的搜尋路徑。該選項很有效地將給定位置下的整個搜尋路徑的最優先路徑進行了重新指定。預設情況下,它是空的。當交叉編譯一個指向目標環境下的根目錄中的目標時,CMake也會搜尋那些路徑;該變數這時顯得非常有用。預設情況下,首先會搜尋在CMAKE_FIND_ROOT_PATH變數中列出的路徑,然後才是非根路徑。設定CMAKE_FIND_ROOT_PATH_MODE_INCLUDE變數可以調整該預設行為。該行為可以在每次調用時被手動覆蓋。通過使用CMAKE_FIND_ROOT_PATH_BOTH變數,搜尋順序將會是上述的那樣。如果使用了NO_CMAKE_FIND_ROOT_PATH變數,那麼CMAKE_FIND_ROOT_PATH將不會被用到。如果使用了ONLY_CMAKE_FIND_ROOT_PATH變數,那麼只有CMAKE_FIND_ROOT_PATH中的路徑(即re-rooted目錄——譯註)會被搜尋。

  一般情況下,預設的搜尋順序是從最具體的路徑到最不具體的路徑。只要用NO_*選項多次調用該命令,工程就可以覆蓋該順序。
     find_file(<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)
     find_file(<VAR> NAMES name)

  只要這些調用中的一個成功了,返回變數就會被設定並儲存在cache中;然後該命令就不會再繼續尋找了。

CMD#30:find_library 尋找一個庫檔案

   find_library(<VAR> name1 [path1 path2 ...])

  這是該命令的簡寫版本,在大多數場合下都已經夠用了。它與命令find_library(<VAR> name1 [PATHS path1 path2 ...])等價。

   find_library(             <VAR>             name | NAMES name1 [name2 ...]             [HINTS path1 [path2 ... ENV var]]             [PATHS path1 [path2 ... ENV var]]             [PATH_SUFFIXES suffix1 [suffix2 ...]]             [DOC "cache documentation string"]             [NO_DEFAULT_PATH]             [NO_CMAKE_ENVIRONMENT_PATH]             [NO_CMAKE_PATH]             [NO_SYSTEM_ENVIRONMENT_PATH]             [NO_CMAKE_SYSTEM_PATH]             [CMAKE_FIND_ROOT_PATH_BOTH |              ONLY_CMAKE_FIND_ROOT_PATH |              NO_CMAKE_FIND_ROOT_PATH]            )

  該命令用來尋找一個庫檔案。一個名為<VAR>的cache條目會被建立來儲存該命令的結果。如果找到了該庫檔案,那麼結果會儲存在該變數裡,並且搜尋過程將不再重複,除非該變數被清空。如果沒有找到,結果變數將會是<VAR>-NOTFOUND,並且在下次使用相同變數調用find_library命令時,搜尋過程會再次嘗試。在NAMES參數後列出的檔案名稱是要被搜尋的庫名。附加的搜尋位置在PATHS參數後指定。如果再HINTS或者PATHS欄位中設定了ENV變數var,環境變數var將會被讀取並從系統內容變數轉換為一個cmake風格的路徑list。例如,指定ENV PATH是擷取系統path變數並將其轉換為cmake的list的一種方式。在DOC之後的參數用來作為cache中的注釋字串。PATH_SUFFIXES選項指定了每個搜尋路徑下待搜尋的子路徑。

  如果指定了NO_DEFAULT_PATH選項,那麼搜尋的過程中不會有其他的附加路徑。如果沒有指定該選項,搜尋過程如下:

  1、搜尋cmake特有的cache變數指定的路徑。這些變數是在用cmake命令列時,通過-DVAR=value指定的變數。如果指定了NO_CMAKE_PATH選項,這些路徑會被跳過。搜尋的路徑還包括:

   對於每個在CMAKE_PREFIX_PATH中的<prefix>,路徑<prefix>/lib    CMAKE_LIBRARY_PATH   CMAKE_FRAMEWORK_PATH

  2、搜尋cmake特有的環境變數指定的路徑。這些變數是使用者的shell配置中設定的變數。如果指定了NO_CMAKE_ENVIRONMENT_PATH選項,這些路徑會被跳過。搜尋的路徑還包括:

   對於每個在CMAKE_PREFIX_PATH中的<prefix>,路徑<prefix>/lib    CMAKE_LIBRARY_PATH   CMAKE_FRAMEWORK_PATH

  3、搜尋由HINTS選項指定的路徑。這些路徑是系統內省(introspection)估算出的路徑,比如由另一個已經發現的庫檔案的地址提供的參考資訊。硬式編碼推薦路徑應該通過PATHS選項指定。

  4、尋找標準的系統內容變數。如果指定了NO_SYSTEM_ENVIRONMENT_PATH選項,這些路徑會被跳過。搜尋的路徑還包括:

   PATH   LIB

  5、尋找在為當前系統的平台檔案中定義的cmake變數。如果指定了NO_CMAKE_SYSTEM_PATH選項,該路徑會被跳過。搜尋的路徑還包括:

   對於每個在CMAKE_SYSTEM_PREFIX_PATH中的<prefix>,路徑<prefix>/lib    CMAKE_SYSTEM_LIBRARY_PATH   CMAKE_SYSTEM_FRAMEWORK_PATH

  6、搜尋PATHS選項或者精簡版命令指定的路徑。這些通常是硬式編碼推薦搜尋路徑。

  在Darwin或者支援OS X 架構的系統上,cmake變數CMAKE_FIND_FRAMEWORK可以用來設定為空白,或者下述值之一:

   "FIRST"  - 在標準庫或標頭檔之前尋找架構。在Darwin系統上這是預設選項。   "LAST"   - 在標準庫或標頭檔之後尋找架構。   "ONLY"   - 僅僅尋找架構。   "NEVER" - 從不尋找架構。

  在Darwin或者支援OS X Application Bundles的系統,cmake變數CMAKE_FIND_APPBUNDLE可以被設定為空白或者下面這些值中的一個:

   "FIRST"  - 在標準庫或標頭檔之前尋找application bundles。在Darwin系統上這是預設選項。   "LAST"   - 在標準庫或標頭檔之後尋找application bundles。   "ONLY"   - 僅僅尋找application bundles。   "NEVER" - 從不尋找application bundles。

  CMake變數CMAKE_FIND_ROOT_PATH指定了一個或者多個優先於其他搜尋路徑的搜尋路徑。該變數能夠有效地重新置放在給定位置下進行搜尋的根路徑。該變數預設為空白。當使用交叉編譯時間,該變數十分有用:用該變數指向目標環境的根目錄,然後CMake將會在那裡尋找。預設情況下,在CMAKE_FIND_ROOT_PATH中列出的路徑會首先被搜尋,然後是“非根”路徑。該預設規則可以通過設定CMAKE_FIND_ROOT_PATH_MODE_LIBRARY做出調整。在每次調用該命令之前,都可以通過設定這個變數來手動覆蓋預設行為。如果使用了NO_CMAKE_FIND_ROOT_PATH變數,那麼只有重定位的路徑會被搜尋。

  預設的搜尋順序的設計邏輯是按照使用時從最具體到最不具體。通過多次調用find_library命令以及NO_*選項,可以覆蓋工程的這個預設順序:

    find_library(<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)   find_library(<VAR> NAMES name)

  只要這些調用中的一個成功返回,結果變數就會被設定並且被儲存到cache中;這樣隨後的調用都不會再行搜尋。如果那找到的庫是一個架構,VAR將會被設定為指向架構“<完整路徑>/A.framework” 的完整路徑。當一個指向架構的完整路徑被用作一個庫檔案,CMake將使用-framework A,以及-F<完整路徑>這兩個選項將架構串連到目標上。

CMD#31:find_package 為外部工程載入設定。

  find_package(<package> [version] [EXACT] [QUIET]               [[REQUIRED|COMPONENTS] [components...]]               [NO_POLICY_SCOPE])

  尋找並載入外來工程的設定。該命令會設定<package>_FOUND變數,用來指示要找的包是否被找到了。如果這個包被找到了,與它相關的資訊可以通過包自身記載的變數中得到。QUIET選項將會禁掉包沒有被發現時的警告資訊。REQUIRED選項表示如果報沒有找到的話,cmake的過程會終止,並輸出警告資訊。在REQUIRED選項之後,或者如果沒有指定REQUIRED選項但是指定了COMPONENTS選項,在它們的後面可以列出一些與包相關的組件清單(components list)。[version]參數需要一個版本號碼,它是正在尋找的包應該相容的版本號碼(格式是major[.minor[.patch[.tweak]]])。EXACT選項要求該版本號碼必須精確匹配。如果在find-module內部對該命令的遞迴調用沒有給定[version]參數,那麼[version]和EXACT選項會自動地從外部調用前向繼承。對版本的支援目前只存在於包和包之間(詳見下文)。

  使用者代碼總體上應該使用上述的簡單調用格式查詢需要的包。本命令文檔的剩餘部分則詳述了find_package的完整命令格式以及具體的查詢過程。期望通過該命令尋找並提供包的項目維護人員,我們鼓勵你能繼續讀下去。

  該命令在搜尋包時有兩種模式:“模組”模式和“配置”模式。當該命令是通過上述的精簡格式調用的時候,合用的就是模組模式。在該模式下,CMake搜尋所有名為Find<package>.cmake的檔案,這些檔案的路徑由變數由安裝CMake時指定的CMAKE_MODULE_PATH變數指定。如果尋找到了該檔案,它會被CMake讀取並被處理。該模式對尋找包,檢查版本以及產生任何別的必須資訊負責。許多尋找模組(find-module)僅僅提供了有限的,甚至根本就沒有對版本化的支援;具體資訊查看該模組的文檔。如果沒有找到任何模組,該命令會進入配置模式繼續執行。

   完整的配置模式下的命令格式是:

  find_package(<package> [version] [EXACT] [QUIET]               [[REQUIRED|COMPONENTS] [components...]] [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_CMAKE_ENVIRONMENT_PATH]               [NO_CMAKE_PATH]               [NO_SYSTEM_ENVIRONMENT_PATH]               [NO_CMAKE_PACKAGE_REGISTRY]               [NO_CMAKE_BUILDS_PATH]               [NO_CMAKE_SYSTEM_PATH]               [CMAKE_FIND_ROOT_PATH_BOTH |                ONLY_CMAKE_FIND_ROOT_PATH |                NO_CMAKE_FIND_ROOT_PATH])

  NO_MODULE可以用來明確地跳過模組模式。它也隱含指定了不使用在精簡格式中使用的那些選項。

  配置模式試圖尋找一個由待尋找的包提供的設定檔的位置。包含該檔案的路徑會被儲存在一個名為<package>_DIR的cache條目裡。預設情況下,該命令搜尋名為<package>的包。如果指定了NAMES選項,那麼其後的names參數會取代<package>的角色。該命令會為每個在names中的name搜尋名為<name>Config.cmake或者<name全小寫>-config.cmake的檔案。通過使用CONFIGS選項可以改變可能的設定檔的名字。以下描述搜尋的過程。如果找到了設定檔,它將會被CMake讀取並處理。由於該檔案是由包自身提供的,它已經知道包中內容的位置。設定檔的完整地址儲存在cmake的變數<package>_CONFIG中。

  所有CMake要處理的設定檔將會搜尋該包的安裝資訊,並且將該安裝匹配的適當版本號碼(appropriate version)儲存在cmake變數<package>_CONSIDERED_CONFIGS中,與之相關的版本號碼(associated version)將被儲存在<package>_CONSIDERED_VERSIONS中。

  如果沒有找到包設定檔,CMake將會產生一個錯誤描述檔案,用來描述該問題——除非指定了QUIET選項。如果指定了REQUIRED選項,並且沒有找到該包,將會報致命錯誤,然後配置步驟終止執行。如果設定了<package>_DIR變數被設定了,但是它沒有包含設定檔資訊,那麼CMake將會直接無視它,然後重新開始尋找。

  如果給定了[version]參數,那麼配置模式僅僅會尋找那些在命令中請求的版本(格式是major[.minor[.patch[.tweak]]])與包請求的版本互相相容的那些版本的包。如果指定了EXACT選項,一個包只有在它請求的版本與[version]提供的版本精確匹配時才能被找到。CMake不會對版本數的含義做任何的轉換。包版本號碼由包內建的版本檔案來檢查。對於一個備選的包設定檔<config-file>.cmake,對應的版本檔案的位置緊挨著它,並且名字或者是<config-file>-version.cmake或者是<config-file>Version.cmake。如果沒有這個版本檔案,那麼設定檔就會認為不相容任何請求的版本。當找到一個版本檔案之後,它會被載入然後用來檢查(find_package)請求的版本號碼。版本檔案在一個下述變數被定義的嵌套域中被載入:

   PACKAGE_FIND_NAME          = <package>名字。   PACKAGE_FIND_VERSION       = 請求的完整版本字串   PACKAGE_FIND_VERSION_MAJOR = 如果被請求了,那麼它是major版本號碼,否則是0。   PACKAGE_FIND_VERSION_MINOR = 如果被請求了,那麼它是minor版本號碼,否則是0。   PACKAGE_FIND_VERSION_PATCH = 如果被請求了,那麼它是patch版本號碼,否則是0。   PACKAGE_FIND_VERSION_TWEAK = 如果被請求了,那麼它是tweak版本號碼,否則是0。   PACKAGE_FIND_VERSION_COUNT = 版本號碼包含幾部分,0到4。

  版本檔案會檢查自身是否滿足請求的版本號碼,然後設定了下面這些變數:

  PACKAGE_VERSION            = 提供的完整的版本字串。  PACKAGE_VERSION_EXACT      = 如果版本號碼精確匹配,返回true。  PACKAGE_VERSION_COMPATIBLE = 如果版本號碼相相容,返回true。  PACKAGE_VERSION_UNSUITABLE = 如果不適合任何版本,返回true。

  下面這些變數將會被find_package命令檢查,用以確定設定檔是否提供了可接受的版本。在find_package命令返回後,這些變數就不可用了。如果版本可接受,下述的變數會被設定:

  <package>_VERSION       = 提供的完整的版本字串。  <package>_VERSION_MAJOR = 如果被請求了,那麼它是major版本號碼,否則是0。  <package>_VERSION_MINOR = 如果被請求了,那麼它是minor版本號碼,否則是0。  <package>_VERSION_PATCH = 如果被請求了,那麼它是patch版本號碼,否則是0。  <package>_VERSION_TWEAK = 如果被請求了,那麼它是tweak版本號碼,否則是0。  <package>_VERSION_COUNT = 版本號碼包含幾部分,0到4。

然後,對應的包設定檔才會被載入。當多個包設定檔都可用時,並且這些包的版本檔案都與請求的版本相容,選擇哪個包將會是不確定的。不應該假設cmake會選擇最高版本或者是最低版本。(以上的若干段是對find_package中版本匹配步驟的描述,並不需要使用者幹預——譯註。)

  配置模式提供了一種進階介面和搜尋步驟的介面。這些被提供的介面的大部分是為了完整性的要求,以及在模組模式下,包被find-module載入時供內部使用。大多數使用者僅僅應該調用:

  find_package(<package> [major[.minor]] [EXACT] [REQUIRED|QUIET])

來尋找包。鼓勵那些需要提供CMake包設定檔的包維護人員應該命名這些檔案並安裝它們,這樣下述的整個過程將會找到它們而不需要使用附加的選項。

  CMake為包構造了一組可能的安裝首碼。在每個首碼下,若干個目錄會被搜尋,用來尋找設定檔。下述的表格展示了待搜尋的路徑。每個條目都是專門為Windows(W),UNIX(U)或者Apple(A)約定的安裝樹指定的。

    <prefix>/                                               (W)   <prefix>/(cmake|CMake)/                                 (W)   <prefix>/<name>*/                                       (W)   <prefix>/<name>*/(cmake|CMake)/                         (W)   <prefix>/(share|lib)/cmake/<name>*/                     (U)   <prefix>/(share|lib)/<name>*/                           (U)   <prefix>/(share|lib)/<name>*/(cmake|CMake)/             (U)

  在支援OS X平台和Application Bundles的系統上,包含設定檔的架構或者bundles會在下述的路徑中被搜尋:

    <prefix>/<name>.framework/Resources/                    (A)   <prefix>/<name>.framework/Resources/CMake/              (A)   <prefix>/<name>.framework/Versions/*/Resources/         (A)   <prefix>/<name>.framework/Versions/*/Resources/CMake/   (A)   <prefix>/<name>.app/Contents/Resources/                 (A)   <prefix>/<name>.app/Contents/Resources/CMake/           (A)

  在所有上述情況下,<name>是區分大小寫,並且對應於在<package>或者由NAMES給定的任何一個名字。

  這些路徑集用來與那些在各自的安裝樹上提供了設定檔的工程協作。上述路徑中被標記為(W)的是專門為Windows上的安裝設定的,其中的<prefix>部分可能是一個應用程式的頂層安裝路徑。那些被標記為(U)的是專門為UNIX平台上的安裝設定的,其中的<prefix>被多個包共用。這僅僅是個約定,因此,所有(W)和(U)路徑在所有平台上都仍然會被搜尋。那些被標記為(A)的路徑是專門為Apple平台上的安裝設定的。CMake變數CMAKE_FIND_FRAMEWORK和CMAKE_FIND_APPBUNDLE確定了偏好的順序,如下所示:

  安裝首碼是通過以下步驟被構建出來的。如果指定了NO_DEFAULT_PATH選項,所有NO_*選項都會被啟用。

  1、搜尋在cmake特有的cache變數中指定的搜尋路徑。這些變數是為了在命令列中用-DVAR=value選項指定而設計的。通過指定NO_CMAKE_PATH選項可以跳過該搜尋路徑。搜尋路徑還包括:

    CMAKE_PREFIX_PATH   CMAKE_FRAMEWORK_PATH   CMAKE_APPBUNDLE_PATH

  2、搜尋cmake特有的環境變數。這些變數是為了在使用者的shell配置中進行配置而設計的。通過指定NO_CMAKE_ENVIRONMENT_PATH選項可以跳過該路徑。搜尋的路徑包括:

   <package>_DIR   CMAKE_PREFIX_PATH   CMAKE_FRAMEWORK_PATH   CMAKE_APPBUNDLE_PATH

  3、搜尋HINTS選項指定的路徑。這些路徑應該是由作業系統內省時計算產生的,比如由其它已經找到的項的位置而提供的線索。硬式編碼參考路徑應該在PATHS選項中指定。

  4、搜尋標準的系統內容變數。如果指定了NO_SYSTEM_ENVIRONMENT_PATH選項,這些路徑會被跳過。以"/bin"或"/sbin"結尾的路徑條目會被自動轉換為它們的父路徑。搜尋的路徑包括:

   PATH

  5、搜尋在CMake GUI中最新配置過的工程的構建樹。可以通過設定NO_CMAKE_BUILDS_PATH選項來跳過這些路徑。這是為了在使用者正在依次構建多個相互依賴的工程時而準備的。

  6、搜尋儲存在CMake使用者包註冊表中的路徑。通過設定NO_CMAKE_PACKAGE_REGISTRY選項可以跳過這些路徑。當CMake嗲用export(PACKAGE<name>)配置一個工程時,這些路徑會被儲存在註冊表中。參見export(PACKAGE)命令的文檔閱讀更多細節。

  7、搜尋在當前系統的平台檔案中定義的cmake變數。可以用NO_CMAKE_SYSTEM_PATH選項跳過這些路徑。

   CMAKE_SYSTEM_PREFIX_PATH   CMAKE_SYSTEM_FRAMEWORK_PATH   CMAKE_SYSTEM_APPBUNDLE_PATH

  8、搜尋由PATHS選項指定的路徑。這些路徑一般是硬式編碼參考路徑。

  在Darwin或者支援OS X 架構的系統上,cmake變數CMAKE_FIND_FRAMEWORK可以用來設定為空白,或者下述值之一:
     "FIRST"  - 在標準庫或標頭檔之前尋找架構。在Darwin系統上這是預設選項。     "LAST"   - 在標準庫或標頭檔之後尋找架構。     "ONLY"   - 僅僅尋找架構。     "NEVER" - 從不尋找架構。

  在Darwin或者支援OS X Application Bundles的系統,cmake變數CMAKE_FIND_APPBUNDLE可以被設定為空白或者下面這些值中的一個:

      "FIRST"  - 在標準庫或標頭檔之前尋找application bundles。在Darwin系統上這是預設選項。     "LAST"   - 在標準庫或標頭檔之後尋找application bundles。     "ONLY"   - 僅僅尋找application bundles。     "NEVER" - 從不尋找application bundles。

  CMake變數CMAKE_FIND_ROOT_PATH指定了一個或者多個優先於其他搜尋路徑的搜尋路徑。該變數能夠有效地重新置放在給定位置下進行搜尋的根路徑。該變數預設為空白。當使用交叉編譯時間,該變數十分有用:用該變數指向目標環境的根目錄,然後CMake將會在那裡尋找。預設情況下,在CMAKE_FIND_ROOT_PATH中列出的路徑會首先被搜尋,然後是“非根”路徑。該預設規則可以通過設定CMAKE_FIND_ROOT_PATH_MODE_LIBRARY做出調整。在每次調用該命令之前,都可以通過設定這個變數來手動覆蓋預設行為。如果使用了NO_CMAKE_FIND_ROOT_PATH變數,那麼只有重定位的路徑會被搜尋。

  預設的搜尋順序的設計邏輯是按照使用時從最具體到最不具體。通過多次調用find_library命令以及NO_*選項,可以覆蓋工程的這個預設順序:

     find_library(<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)    find_library(<VAR> NAMES name)

  只要這些調用中的一個成功返回,結果變數就會被設定並且被儲存到cache中;這樣隨後的調用都不會再行搜尋。如果那找到的庫是一個架構,VAR將會被設定為指向架構“<完整路徑>/A.framework” 的完整路徑。當一個指向架構的完整路徑被用作一個庫檔案,CMake將使用-framework A,以及-F<完整路徑>這兩個選項將架構串連到目標上。

  參見cmake_policy()命令的文檔中關於NO_POLICY_SCOPE選項討論。

CMD#32 : find_path 搜尋包含某個檔案的路徑

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.