• CMake--Set用法


    CMake中的set用于给一般变量,缓存变量,环境变量赋值。

    cmake官方文档set

    set(<variable> <value>
        [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])
    • Set赋值给一般变量(normal variables)

    什么是一般变量,一般变量和代码中变量相似,仅在自身所在作用域起作用,除非后面使用PARENT_SCOPE

    每一个新的目录或者函数都会创建新的作用域,当在新的作用域创建一般变量且后面加上PARENT_SCOPE,该变量可以在父目录或者调用新函数的函数上起作用。

    有些乱,举个栗子:

    set(FOO  “x”)。         //FOO作用域为当前作用域。
    
    set(FOO "x" PARENT_SCOPE)   //FOO作用域跳上一级(懂点编程的都懂哈)。
    • Set赋值给缓存变量(cache variables)

    什么是缓存变量,缓存变量可以理解为当第一次运行cmake时,这些变量缓存到一份文件中(即编译目录下的CMakeCache.txt)。当再次运行cmake时,这些变量会直接使用缓存值,可以利用ccmake或者cmake-gui等工具来重新赋值。缓存变量在整个cmake运行过程中都可以起作用。

    当使用CACHE时,且缓存(cache)中没有该变量时,变量被创建并存入缓存(cache)中,如果原缓存(cache)中有该变量,也不会改变原缓存中该变量的值,除非后面使用FORCE。

    有点乱,举个栗子:

    set(FOO, "x" CACHE <type>)  
    //原缓存中没有FOO则将FOO赋值为x且存入cache中。 //原缓存中有FOO则不做任何改变,即便原cache中FOO存的不是x。
    set(FOO, "x" CACHE <type><docstring> FORCE)    
    //即便原cache中存在FOO也会创建另一个FOO,官方文档原话(If FORCE is specified, the value of the cache variable 
    //is set,
    even if the variable is already in the cache.This should normally be avoided, as it will
    //remove any changes to
    the cache variable’s value by the user.),小弟笨拙没有搞懂。

    使用CACHE的同时,要设定<type>和<docstring>,<type>可以理解为所存入变量类型,<docstring>为变量的描述。

    <type>分为以下几种类型:

    FILEPATH = File chooser dialog.
    PATH     = Directory chooser dialog.
    STRING   = Arbitrary string.
    BOOL     = Boolean ON/OFF checkbox.
    INTERNAL = No GUI entry (used for persistent variables).

    其中INTERNAL将变量为内部变量,即cmake-gui不会向用户显示这类变量,而其它类型的缓存变量用户都可以通cmake-gui按照特定的类型改变。

    •  注意

      1.CACHE与PARENT_SCOPE不能一起使用。

      2.同一名称(例FOO)的一般变量和缓存变量可以同时存在,但在调用该变量时(${FOO})会在先取一般变量的值,一般变量中没有再取缓存变量的值。

    一些栗子:

    set(FOO “x”)        //设置一般变量FOO,不会触及cache,但是会隐藏cache中的FOO。
    
    set(FOO “x” CACHE ...)  //忽视相同名称的一般变量,在cache中检查FOO是否存在,
                    //如果不存在则存入cache中,存在也不会对cache中FOO重新赋值。

      3.当改变cache中的变量时,同名的一般变量会被删除。一般不建议使用相同名称的一般变量和缓存变量。

    然而在有些工程中可以很好的借助这一交互例如:

    一个工程利用ADD_SUBDIRECTOTY()添加子工程,子工程有它自己的CMakeList.txt。如果在父工程和子工程中都对同一缓存变量赋值,cmake时父工程率先将变量存入cache中,子工程直接在cache中调用该值,保证了父子工程的一致性。当父工程需要改变该变量,而子程序需要利用原值时,可以直接在父工程中设置同名称的一般变量即可。

  • 相关阅读:
    <排序算法> 计数排序CountSort
    <排序算法> 直接插入排序InsertSort
    <排序算法> 快速排序QuickSort
    C# 获取文件的后缀,文件名和路径
    C# 移除HTML标签
    无限层级数
    iOS通用链接配置
    iOS 最新证书制作流程、制作通用证书
    C# FormData 文件太大报错404 Form表单上传大文件,无法进入后台Action,页面提示404.
    IS加载JSON 和 MP4文件 错误 404 提示 需要添加mime映射(默认IIS Express里没有映射)
  • 原文地址:https://www.cnblogs.com/narjaja/p/8351500.html
Copyright © 2020-2023  润新知