CMake語法—普通變量與子目錄(Normal Variable And Subdirectory)


CMake語法—普通變量與子目錄(Normal Variable And Subdirectory)

1 CMake普通變量與子目錄示例

1.1 代碼目錄結構

  • learn_cmake:為根目錄(即父目錄)
  • build:為CMake配置輸出目錄(在此例中即生成sln解決方案的地方)
  • cmake_config.bat:執行CMake配置過程的腳本(雙擊直接運行即可)
  • CMakeLists.txt:父目錄CMake腳本
  • src:子目錄,包含此子目錄的CMakeLists.txt
  • src_parent_scope: 子目錄, 包含此子目錄的CMakeLists.txt

1.2 父目錄CMakeLists.txt

cmake_minimum_required(VERSION 3.18)

# 設置工程名稱
set(PROJECT_NAME KAIZEN)

# 設置工程版本號
set(PROJECT_VERSION "1.0.0.10" CACHE STRING "默認版本號")

# 工程定義
project(${PROJECT_NAME}
    LANGUAGES CXX C
    VERSION ${PROJECT_VERSION}
)

# 打印開始日志
message(STATUS "\n########## BEGIN_TEST")

# 零個值
set(MY_LOCAL_ZERO_VAR)
message(STATUS "MY_LOCAL_ZERO_VAR: ${MY_LOCAL_ZERO_VAR}")

# 1個值
set(MY_LOCAL_VAR "I am a local variable")
message(STATUS "MY_LOCAL_VAR_1: ${MY_LOCAL_VAR}")

# 在相同作用域修改普通變量
set(MY_LOCAL_VAR "I am a local variable by modify same scope")
message(STATUS "MY_LOCAL_VAR_2: ${MY_LOCAL_VAR}")

# 多個值
set(MY_LOCAL_LIST_VAR "kaizen" "baidu" "C++" "developer")
message(STATUS "MY_LOCAL_LIST_VAR: ${MY_LOCAL_LIST_VAR}")

# 調用子目錄src
message(STATUS "\n########## Begin add_subdirectory src")
add_subdirectory(src)
message(STATUS "########## End add_subdirectory src")
# 調用子目錄src后打印
message(STATUS "MY_LOCAL_VAR_7: ${MY_LOCAL_VAR}")
# 調用子目錄src后打印
message(STATUS "MY_SUB_DIR_VAR_3: ${MY_SUB_DIR_VAR}")

# 調用子目錄src_parent_scope
message(STATUS "\n########## Begin add_subdirectory src_parent_scope")
add_subdirectory(src_parent_scope)
message(STATUS "########## End add_subdirectory src_parent_scope")
# 調用子目錄src_parent_scope后打印
message(STATUS "MY_LOCAL_VAR_8: ${MY_LOCAL_VAR}")
# 調用子目錄src_parent_scope后打印
message(STATUS "MY_SUB_DIR_VAR_4: ${MY_SUB_DIR_VAR}")

# 打印結束日志
message(STATUS "\n########## END_TEST\n")

1.3 src子目錄CMakeLists.txt

cmake_minimum_required(VERSION 3.18)

# 打印進入日志
message(STATUS "########## Enter src subdirectory")

# 修改父作用域普通變量值
# 修改前打印
message(STATUS "MY_LOCAL_VAR_3: ${MY_LOCAL_VAR}")
# 修改動作
set(MY_LOCAL_VAR "I am a local variable by modify in src subdirectory")
# 修改后打印
message(STATUS "MY_LOCAL_VAR_4: ${MY_LOCAL_VAR}")

# 子目錄作用域內定義普通變量,不加選項PARENT_SCOPE
set(MY_SUB_DIR_VAR "I am a src subdirectory inner variable")
# 子目錄作用域打印定義變量值
message(STATUS "MY_SUB_DIR_VAR_1: ${MY_SUB_DIR_VAR}")

# 打印離開日志
message(STATUS "########## Leave src subdirectory")

1.4 src_parent_scope子目錄CMakeLists.txt

cmake_minimum_required(VERSION 3.18)

# 打印進入日志
message(STATUS "##########Enter src_parent_scope subdirectory")

# 修改父作用域普通變量值
# 修改前打印
message(STATUS "MY_LOCAL_VAR_5: ${MY_LOCAL_VAR}")
# 修改動作
set(MY_LOCAL_VAR "I am a local variable by modify in src_parent_scope subdirectory" PARENT_SCOPE)
# 修改后打印
message(STATUS "MY_LOCAL_VAR_6: ${MY_LOCAL_VAR}")

# 子目錄作用域內定義普通變量,加選項PARENT_SCOPE
set(MY_SUB_DIR_VAR "I am a src_parent_scope subdirectory inner variable" PARENT_SCOPE)
# 子目錄作用域打印定義變量值
message(STATUS "MY_SUB_DIR_VAR_2: ${MY_SUB_DIR_VAR}")

# 打印離開日志
message(STATUS "##########Leave src_parent_scope subdirectory")

1.5 執行CMake配置腳本

@echo off
set currentDir=%~dp0
set buildDir=%currentDir%
set cmakeOutputDir=%currentDir%\build
cmake -S %buildDir% -B %cmakeOutputDir% -G"Visual Studio 16 2019" -T v140 -A x64
pause

2 運行結果

2.1 環境說明

本地安裝VS版本:Visual Studio 2019(2015工具集)

CMake版本:3.18.2

F:\learn_cmake
λ cmake --version
cmake version 3.18.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).

2.2 運行結果

-- Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.17763.
-- The CXX compiler identification is MSVC 19.0.24245.0
-- The C compiler identification is MSVC 19.0.24245.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/amd64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/amd64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
--
########## BEGIN_TEST
-- MY_LOCAL_ZERO_VAR:
-- MY_LOCAL_VAR_1: I am a local variable
-- MY_LOCAL_VAR_2: I am a local variable by modify same scope
-- MY_LOCAL_LIST_VAR: kaizen;baidu;C++;developer
--
########## Begin add_subdirectory src
-- ########## Enter src subdirectory
-- MY_LOCAL_VAR_3: I am a local variable by modify same scope
-- MY_LOCAL_VAR_4: I am a local variable by modify in src subdirectory
-- MY_SUB_DIR_VAR_1: I am a src subdirectory inner variable
-- ########## Leave src subdirectory
-- ########## End add_subdirectory src
-- MY_LOCAL_VAR_7: I am a local variable by modify same scope
-- MY_SUB_DIR_VAR_3:
--
########## Begin add_subdirectory src_parent_scope
-- ##########Enter src_parent_scope subdirectory
-- MY_LOCAL_VAR_5: I am a local variable by modify same scope
-- MY_LOCAL_VAR_6: I am a local variable by modify same scope
-- MY_SUB_DIR_VAR_2:
-- ##########Leave src_parent_scope subdirectory
-- ########## End add_subdirectory src_parent_scope
-- MY_LOCAL_VAR_8: I am a local variable by modify in src_parent_scope subdirectory
-- MY_SUB_DIR_VAR_4: I am a src_parent_scope subdirectory inner variable
--
########## END_TEST

-- Configuring done
-- Generating done
-- Build files have been written to: F:/learn_cmake/build
請按任意鍵繼續. . .

2.3 結論

2.3.1 定義普通變量方式
set(<variable> <value>... [PARENT_SCOPE])
2.3.2 variable:表示普通變量名稱;
2.3.3 value:表示變量的值列表,value后面有三個點,表示變量的值可以為0或1或n個值

示例程序中第19行:定義普通變量,賦值為0個值,可理解為占位符。值為空,打印結果也為空,參見運行結果輸出第16行。

示例程序中第23行:定義普通變量,賦值為1個值,即字符串中內容。參見運行結果輸出第17、18行打印內容。

示例程序中第31行:定義普通變量,賦值為4個值,當多個值時,將來會用分號拼接起來為一個字符串。參見運行結果輸出第19行打印內容。

2.3.4 PARENT_SCOPE:表示父作用域,若加此選項,特別明確定義或修改父作用域變量的值
2.3.5 普通變量,在子目錄subdirectory作用域中,會拷貝一份父作用域的所有普通變量(即在被add子目錄內可訪問父作用域內的普通變量)

從示例程序出發,再結合輸出結果分析可知:普通變量在函數作用域與子目錄作用域中,實際運行效果完全相同。

因此避免贅述,請參見隨筆 CMake語法—普通變量與函數(Normal Variable And Function)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM