Block范围(Block Scope)是指创建一个以block()开始到endblock()结束所的范围,在这个范围内,对变量(或/和策略)的访问需要满足一定规则。block()和endblock()之间的命令列表不会立马执行。
注意:block命令需要CMake 3.25及以上版本才支持。
命令格式
block([SCOPE_FOR [POLICIES] [VARIABLES] ] [PROPAGATE <var-name>...])
<commands>
endblock()
-
SCOPE_FOR
指定是给变量还是策略创建范围,也可以都指定。
-
POLICIES
为策略创建一个范围,等价命令
cmake_policy(PUSH)
。 -
VARIABLES
为变量创建一个范围。
如果这个参数没有指定,那么CMake也会默认加上,等价于
block(SCOPE_FOR VARIABLES POLICIES)
。 -
-
PROPAGATE
当使用block()创建变量范围时,可以通过该参数指定上层范围的变量,这样在block()创建的范围中可以对这些变量进行操作,该参数等价于
set(PARENT_SCOPE)
或unset(PARENT_SCOPE)
。
使用命令
-
不使用PROPAGATE选项
# CMakeLists.txt cmake_minimum_required(VERSION 3.22) project(block_test) set(VAR1 "hello var1") # 创建变量VAR1 set(VAR2 "hello var2") # 创建变量VAR2 # 打印一下变量 message("$ in parent scope: VAR1: ${VAR1}, VAR2: ${VAR2}") block(SCOPE_FOR VARIABLES POLICIES) message("$ Enter BLOCK") message("--$ VAR1 in block scope: ${VAR1}") message("--$ VAR2 in block scope: ${VAR2}") set(VAR1 "hello somebody") # 设置VAR1的值 set(NEW_VAR "hello new VAR") # 在block()范围内新建一个变量 unset(VAR2) # 注销VAR2变量 message("--$ After modify in block scope") message("--$ VAR1 in block scope: ${VAR1}") message("--$ VAR2 in block scope: ${VAR2}") message("--$ new VAR in block scope: ${NEW_VAR}") message("$ Exist BLOCK") endblock() # block之外,变量的情况 message("VAR1 in parent scope: ${VAR1}") message("VAR2 in parent scope: ${VAR2}") message("new VAR in parent scope: ${NEW_VAR}")
执行
cmake .
后的结果:$ in parent scope: VAR1: hello var1, VAR2: hello var2 $ Enter BLOCK --$ VAR1 in block scope: hello var1 --$ VAR2 in block scope: hello var2 --$ After modify in block scope --$ VAR1 in block scope: hello somebody --$ VAR2 in block scope: --$ new VAR in block scope: hello new VAR $ Exist BLOCK $ VAR1 in parent scope: hello var1 $ VAR2 in parent scope: hello var2 $ new VAR in parent scope:
说明未指定任何外部变量的情况下,block()创建的范围内对变量的操作(即使是同名的变量)不会对外层变量造成任何影响。
-
使用PROPAGATE指定变量
# CMakeLists.txt cmake_minimum_required(VERSION 3.22) project(block_test) set(VAR1 "hello var1") # 创建变量VAR1 set(VAR2 "hello var2") # 创建变量VAR2 # 打印一下变量 message("$ in parent scope: VAR1: ${VAR1}, VAR2: ${VAR2}") block(SCOPE_FOR VARIABLES POLICIES PROPAGATE VAR1) message("$ Enter BLOCK") message("--$ VAR1 in block scope: ${VAR1}") message("--$ VAR2 in block scope: ${VAR2}") set(VAR1 "hello somebody") # 设置VAR1的值 set(NEW_VAR "hello new VAR") # 在block()范围内新建一个变量 unset(VAR2) # 注销VAR2变量 message("--$ After modify in block scope") message("--$ VAR1 in block scope: ${VAR1}") message("--$ VAR2 in block scope: ${VAR2}") message("--$ new VAR in block scope: ${NEW_VAR}") message("$ Exist BLOCK") endblock() # block之外,变量的情况 message("VAR1 in parent scope: ${VAR1}") message("VAR2 in parent scope: ${VAR2}") message("new VAR in parent scope: ${NEW_VAR}")
执行
cmake .
后的结果:$ in parent scope: VAR1: hello var1, VAR2: hello var2 $ Enter BLOCK --$ VAR1 in block scope: hello var1 --$ VAR2 in block scope: hello var2 --$ After modify in block scope --$ VAR1 in block scope: hello somebody --$ VAR2 in block scope: --$ new VAR in block scope: hello new VAR $ Exist BLOCK $ VAR1 in parent scope: hello somebody $ VAR2 in parent scope: hello var2 $ new VAR in parent scope:
说明:当PROPAGATE VAR1指定了VAR1变量,结果VAR1变量在block()内被修改后,外层的VAR1的值也被修改了;VAR2只在block()内部被修改,外层未被修改。
-
使用PROPAGATE指定block()范围内创建的变量
cmake_minimum_required(VERSION 3.22) project(block_test) set(VAR1 "hello var1") # 创建变量VAR1 set(VAR2 "hello var2") # 创建变量VAR2 # 打印一下变量 message("$ in parent scope: VAR1: ${VAR1}, VAR2: ${VAR2}") block(SCOPE_FOR VARIABLES POLICIES PROPAGATE NEW_VAR) message("$ Enter BLOCK") message("--$ VAR1 in block scope: ${VAR1}") message("--$ VAR2 in block scope: ${VAR2}") set(VAR1 "hello somebody") # 设置VAR1的值 set(NEW_VAR "hello new VAR") # 在block()范围内新建一个变量 unset(VAR2) # 注销VAR2变量 message("--$ After modify in block scope") message("--$ VAR1 in block scope: ${VAR1}") message("--$ VAR2 in block scope: ${VAR2}") message("--$ new VAR in block scope: ${NEW_VAR}") message("$ Exist BLOCK") endblock() # block之外,变量的情况 message("$ VAR1 in parent scope: ${VAR1}") message("$ VAR2 in parent scope: ${VAR2}") message("$ new VAR in parent scope: ${NEW_VAR}")
执行
cmake .
后的结果:$ in parent scope: VAR1: hello var1, VAR2: hello var2 $ Enter BLOCK --$ VAR1 in block scope: hello var1 --$ VAR2 in block scope: hello var2 --$ After modify in block scope --$ VAR1 in block scope: hello somebody --$ VAR2 in block scope: --$ new VAR in block scope: hello new VAR $ Exist BLOCK $ VAR1 in parent scope: hello var1 $ VAR2 in parent scope: hello var2 $ new VAR in parent scope: hello new VAR
说明:当PROPAGATE NEW_VAR指定了新变量,结果NEW_VAR在外层也可见。
网友评论