美文网首页
CMake命令之block介绍

CMake命令之block介绍

作者: Domibaba | 来源:发表于2023-09-06 13:34 被阅读0次

    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在外层也可见。

    相关文章

      网友评论

          本文标题:CMake命令之block介绍

          本文链接:https://www.haomeiwen.com/subject/asezmdtx.html