轉 CMake手冊詳解 (十一)

2021-08-20 16:19:45 字數 2877 閱讀 2249

cmd#29:find_file查詢乙個檔案的完整路徑。

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

find_file(

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]

)

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

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

對於每個在cmake_prefix_path中的路徑,/include  

變數:cmake_include_path

變數:cmake_framework_path

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

對於每個在cmake_prefix_path中的路徑,/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中的路徑,/include  

變數:cmake_system_include_path

變數:cmake_system_framework_path

6、搜尋由paths選項指定的路徑或者在命令的簡寫版本中指定的路徑。這一般是一些硬編碼的參考路徑。在darwin後者支援os x框架的系統上,cmake變數cmake_find_framwork可以設定為空或者下述值之一:

"first"  - 在標準庫或者標頭檔案之前先查詢框架。對於darwin系統,這是預設的。

"last" - 在標準庫或標頭檔案之後再查詢框架。

"only" - 只查詢框架。

"never" - 從不查詢框架。

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(names name paths paths… no_default_path)

find_file(names name)

只要這些呼叫中的乙個成功了,返回變數就會被設定並儲存在cache中;然後該命令就不會再繼續查詢了。

CMake 手冊詳解(五)

cmd 2 add custom target新增乙個目標,它沒有輸出 這樣它就總是會被構建。add custom target name all command1 args1.command command2 args2.depends depend depend depend working d...

CMake手冊詳解 (九)

cmd 17 else 開始乙個if語句塊的else部分。else expression 參見if命令。cmd 18 elseif 開始if 塊的 elseif 部分。elseif expression 參見if命令。cmd 19 enable language 支援某種語言 cxx c fortr...

CMake手冊詳解 (十二)

find library name1 path1 path2 這是該命令的簡寫版本,在大多數場合下都已經夠用了。它與命令find library name1 paths path1 path2 等價。find library name names name1 name2 hints path1 pa...