CMake基础篇(五)——宏

前言:
   本篇文章帮助你快速熟悉CMake宏的使用。

1 用法

  CMake的宏原理和c/c++相同,本质都是替换。以下代码说明了宏的参数是字符串替换的特点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
project(ProjectName)

macro(PrintAndModifyMacro var)
message(STATUS "Macro before: var = ${var}")
set(var "Modified by Macro")
message(STATUS "Macro after: var = ${var}")
endmacro()

function(PrintAndModifyFunction var)
message(STATUS "Function before: var = ${var}")
set(_internalVar "Modified by Function")
set(var "${_internalVar}" PARENT_SCOPE)
message(STATUS "Function after: var (internal) = ${_internalVar}")
endfunction()

set(testVar "Original Value")

message(STATUS "Before Macro: testVar = ${testVar}")
PrintAndModifyMacro(${testVar})
message(STATUS "After Macro: testVar = ${testVar}")

set(testVar "Original Value Again")
message(STATUS "Before Function: testVar = ${testVar}")
PrintAndModifyFunction(${testVar})
message(STATUS "After Function: testVar = ${testVar}")

  输出结果为。

1
2
3
4
5
6
7
8
-- Before Macro: testVar = Original Value
-- Macro before: var = Original Value
-- Macro after: var = Modified by Macro
-- After Macro: testVar = Modified by Macro
-- Before Function: testVar = Original Value Again
-- Function before: var = Original Value Again
-- Function after: var (internal) = Modified by Function
-- After Function: testVar = Modified by Function

  CMake的宏是替换,因此宏没有自己的作用域,宏中定义的变量等于在调用位置定义变量。

1
2
3
4
5
6
7
8
9
10
project(ProjectName)

macro(MacroName Param)
set(Var ${Param})
message(STATUS ${Var})
endmacro()

MacroName("1")
MacroName("2")
message(STATUS "${Var}")

  输出结果为。

1
2
3
4
╰─ cmake ..
-- 1
-- 2
-- 2