美文网首页
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