1. 程式人生 > 其它 >CMake 從入門到崩潰3 - 基礎語法之作用域

CMake 從入門到崩潰3 - 基礎語法之作用域

CMake 從入門到崩潰3 - 基礎語法之作用域

上一篇我們介紹了 CMake 變數的使用,在這篇裡我們會講解 CMake 是怎樣做名字查詢的,也就是 CMake 中的變數作用域,由於 CMake 的作用域和其他程式語言區別很大,因此理解 CMake 作用域機制對正確的寫出 CMake 指令碼幫助很大

CMake 本質上是一個基於目錄的作用域,設定一個變數,將為該檔案和它的全部子目錄設定該變數

CMake 中的名字查詢沿作用域樹向上做查詢,因此你在子目錄中修改了變數的值,只會影響到子目錄及更深的目錄,並不會對父目錄產生任何影響

  • CMake 如果在當前作用域找不到該變數,就會到 Cache 中去找

條件語句和迴圈語句都不會引入新的作用域,這點和大多數程式語言都不同

set 命令提供了兩個作用域相關的選項:

  • PARENT_SCOPE 將在父作用域而不是當前作用域設定該變數
  • CACHE 會將該變數寫到 CMakeCache 中,set 的結果在所有作用域中都有效

子 CMake 指令碼的作用域:

  • add_subdirectory 會引入新的作用域
  • include 在原有作用域中執行
    • 執行 set()unset() 影響的是呼叫者的作用域

除了基於目錄的作用域外,CMake 函式還有自己的作用域,這意味著在函式中設定變數不會滲透到父作用域中,但對巨集來說不是這樣,因此我們更傾向於使用函式而不是巨集

add_subdirectory

add_subdirectory(source_dir [binary_dir])

add_subdirectory 新增一個用於構建的子目錄

source_dir

source_dir 通常是相對於當前目錄的相對路徑,但也可以指定它為絕對路徑

CMake 將首先去執行 source_dir 目錄下的 CMakeLists.txt,結束後再轉回當前命令的下一行繼續執行

呼叫 add_subdirectory 將導致在原始碼樹中建立一個新結點,可以通過 CMAKE_CURRENT_SOURCE_DIR 獲取到當前處理結點的完整路徑

binary_dir

選項 binary_dir

用於指定子目錄的輸出應該放置在哪裡,通常是相對於當前輸出目錄的相對路徑,但也可以指定它為絕對路徑

  • 典型的用法是,不去指定 binary_dir,未展開為絕對路徑的 source_dir 的值將被用作 binary_dir
  • 呼叫 add_subdirectory 後,構建樹中往往也會增加一個新結點,如果我們從來不指定 binary_dir 選項,原始碼樹和構建樹的結構應該是相同的
  • 這裡說的輸出包含 CMake 生成的構建系統檔案和各種臨時檔案,如果僅僅想要改變目標生成的位置,比如二進位制或庫檔案,應該通過 set_target_properties 命令改變對應目標的 *_OUTPUT_DIRECTORY 屬性

本文來自部落格園,作者:路過的摸魚俠,轉載請註明原文連結:https://www.cnblogs.com/ljx-null/p/15943432.html