CMake语法—环境变量(Environment Variable)

1 定义环境变量

set(ENV{<variable>} [<value>])
  • ENV:环境变量标志性前缀
  • variable:变量名称
  • value:变量值

2 应用环境变量

2.1 代码结构

  • learn_cmake:为根目录
  • build:为CMake配置输出目录(在此例中即生成sln解决方案的地方)
  • cmake_config.bat:执行CMake配置过程的脚本(双击直接运行)
  • CMakeLists.txt:CMake脚本

2.2 示例代码

  1. 示例代码(CMakeLists.txt文件内容)

    cmake_minimum_required(VERSION 3.18)
    
    # 设置工程名称
    set(PROJECT_NAME KAIZEN) # 设置工程版本号
    set(PROJECT_VERSION "1.0.0.10" CACHE STRING "默认版本号") # 工程定义
    project(${PROJECT_NAME}
    LANGUAGES CXX C
    VERSION ${PROJECT_VERSION}
    ) # 打印开始日志
    message(STATUS "\n########## BEGIN_TEST_ENV_VARIABLE") # 判断JAVA_HOME变量是否定义
    if(DEFINED ENV{JAVA_HOME})
    message("JAVA_HOME: $ENV{JAVA_HOME}")
    else()
    message("NOT DEFINED JAVA_HOME VARIABLES")
    endif() # 定义环境变量
    set(ENV{CMAKE_PATH} "F:/cmake") # 判断CMAKE_PATH环境变量是否定义
    if(DEFINED ENV{CMAKE_PATH})
    message("CMAKE_PATH_1: $ENV{CMAKE_PATH}")
    else()
    message("NOT DEFINED CMAKE_PATH VARIABLES")
    endif() # 定义测试函数,在函数中新定义环境变量
    function(test_env_variable)
    # 访问环境变量CMAKE_PATH
    message("CMAKE_PATH_2: $ENV{CMAKE_PATH}") # 函数内定义环境变量
    set(ENV{CMAKE_FUNC} "F:/cmake/dir") # 判断CMAKE_FUNC环境变量是否定义
    if(DEFINED ENV{CMAKE_FUNC})
    message("CMAKE_FUNC_1: $ENV{CMAKE_FUNC}")
    else()
    message("NOT DEFINED CMAKE_FUNC_1 VARIABLES")
    endif()
    endfunction() # 调用函数
    test_env_variable() # 判断CMAKE_FUNC环境变量是否定义
    if(DEFINED ENV{CMAKE_FUNC})
    message("CMAKE_FUNC_2: $ENV{CMAKE_FUNC}")
    else()
    message("NOT DEFINED CMAKE_FUNC_2 VARIABLES")
    endif() # 如果没有参数值
    set(ENV{CMAKE_FUNC}) # 判断CMAKE_FUNC环境变量是否定义
    if(DEFINED ENV{CMAKE_FUNC})
    message("CMAKE_FUNC_3: $ENV{CMAKE_FUNC}")
    else()
    message("NOT DEFINED CMAKE_FUNC_3 VARIABLES")
    endif() # 定义测试宏,在函数中新定义环境变量
    macro(test_env_var)
    # 访问环境变量CMAKE_PATH
    message("CMAKE_PATH_3: $ENV{CMAKE_PATH}") # 宏内定义环境变量
    set(ENV{CMAKE_MACRO} "F:/cmake/macro") # 判断CMAKE_MACRO环境变量是否定义
    if(DEFINED ENV{CMAKE_MACRO})
    message("CMAKE_MACRO_1: $ENV{CMAKE_MACRO}")
    else()
    message("NOT DEFINED CMAKE_MACRO_1 VARIABLES")
    endif()
    endmacro() # 调用宏
    test_env_var() # 判断CMAKE_MACRO环境变量是否定义
    if(DEFINED ENV{CMAKE_MACRO})
    message("CMAKE_MACRO_2: $ENV{CMAKE_MACRO}")
    else()
    message("NOT DEFINED CMAKE_MACRO_2 VARIABLES")
    endif() # 如果多个参数值
    set(ENV{CMAKE_FILE} "F:/cmake/cmake1.txt" "F:/cmake/cmake2.txt") # 判断CMAKE_FILE环境变量是否定义
    if(DEFINED ENV{CMAKE_FILE})
    message("CMAKE_FILE: $ENV{CMAKE_FILE}")
    else()
    message("NOT DEFINED CMAKE_FILE VARIABLES")
    endif() # 打印结束日志
    message(STATUS "########## END_TEST_ENV_VARIABLE\n")
  2. cmake_config.bat

    @echo off
    set currentDir=%~dp0
    set buildDir=%currentDir%
    set cmakeOutputDir=%currentDir%\build
    cmake -S %buildDir% -B %cmakeOutputDir% -G"Visual Studio 16 2019" -T v140 -A x64
    pause

2.3 运行结果

  1. 本地环境

    本地安装VS版本:Visual Studio 2019(2015工具集)

    CMake版本:3.18.2

    F:\learn_cmake
    λ cmake --version
    cmake version 3.18.2 CMake suite maintained and supported by Kitware (kitware.com/cmake).
  2. 输出结果

    -- Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.17763.
    -- The CXX compiler identification is MSVC 19.0.24245.0
    -- The C compiler identification is MSVC 19.0.24245.0
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/amd64/cl.exe - skipped
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/amd64/cl.exe - skipped
    -- Detecting C compile features
    -- Detecting C compile features - done
    --
    ########## BEGIN_TEST_ENV_VARIABLE
    JAVA_HOME: C:\Program Files\Java\jdk1.8.0_201
    CMAKE_PATH_1: F:/cmake
    CMAKE_PATH_2: F:/cmake
    CMAKE_FUNC_1: F:/cmake/dir
    CMAKE_FUNC_2: F:/cmake/dir
    NOT DEFINED CMAKE_FUNC_3 VARIABLES
    CMAKE_PATH_3: F:/cmake
    CMAKE_MACRO_1: F:/cmake/macro
    CMAKE_MACRO_2: F:/cmake/macro
    CMake Warning (dev) at CMakeLists.txt:98 (set):
    Only the first value argument is used when setting an environment variable.
    Argument 'F:/cmake/cmake2.txt' and later are unused.
    This warning is for project developers. Use -Wno-dev to suppress it. CMAKE_FILE: F:/cmake/cmake1.txt
    -- ########## END_TEST_ENV_VARIABLE -- Configuring done
    -- Generating done
    -- Build files have been written to: F:/learn_cmake/build
    请按任意键继续. . .

3 小结

  1. 设定或读取环境变量时,都通过ENV前缀来访问环境变量。

  2. 读取环境变量值时,要在ENV前加$符号;但if判断是否定义时,不用加$符号。

  3. 设定环境变量,此命令只影响当前CMake进程,不影响调用CMake的进程,也不影响整个系统环境。

  4. 设定环境变量时,没有给变量赋值:

    如果有同名环境变量,此命令将清除已存在的同名环境变量;

    如果没有同名环境变量,此命令将被视为无效代码。

    如示例程序中第62行,将清除已存在的环境变量CMAKE_FUNC,这样导致输出结果第21行:NOT DEFINED CMAKE_FUNC_3 VARIABLES

  5. 设定环境变量时,变量值仅有一个。多余的值会被忽略,并且会提示警告信息。

    如示例程序中第98行,变量值为2个,结果第二个值被忽略,且会有CMake Warning打印到输出结果内容中。

  6. 环境变量,不存在作用域的区分。即函数、宏、子目录、包含模块中都一样,只会影响当前CMake进程。

    如示例程序中第52、88行,经过调用函数和宏的测试,其内部可以访问外部的环境变量;在其内部定义的环境变量,在外部也可以正常使用。

    子目录与函数属于同类(有作用域区分),宏和包含模块属于同类(无作用域区分),因此,在此只用测试两种即可说明问题。

CMake语法—环境变量(Environment Variable)的更多相关文章

  1. ABAP Netweaver和Cloud Foundry上的环境变量Environment Variable

    Netweaver 更准确的说应该是系统变量:结构体sy 设一个断点,调试器里看这些字段的值就能知道每个字段是用来做什么的. sy-dbsys sy-sysid sy-opsys sy-saprl s ...

  2. CMake语法—普通变量与函数(Normal Variable And Function)

    目录 CMake语法-普通变量与函数(Normal Variable And Function) 1 CMake普通变量与函数示例 1.1 CMakeLists.txt 1.2 执行CMake配置脚本 ...

  3. CMake语法—普通变量与子目录(Normal Variable And Subdirectory)

    目录 CMake语法-普通变量与子目录(Normal Variable And Subdirectory) 1 CMake普通变量与子目录示例 1.1 代码目录结构 1.2 父目录CMakeLists ...

  4. CMake语法—普通变量与包含、宏(Normal Variable And Include、Macro)

    目录 CMake语法-普通变量与包含.宏(Normal Variable And Include.Macro) 1 CMake普通变量与包含.宏示例 1.1 代码目录结构 1.2 根目录CMakeLi ...

  5. CMake语法—缓存变量(Cache Variable)

    目录 CMake语法-缓存变量(Cache Variable) 1 CMake缓存变量 2 定义缓存变量 2.1 定义格式 2.2 定义示例代码 2.3 运行结果 2.4 小结 3 CMakeCach ...

  6. postman 用环境变量Environment实现多服务器版本

    现存问题 在测试API期间,往往存在多种环境,对应IP地址(或域名也不同) 比如: Prod: http://116.62.25.57/ucows 用于开发完成发布到生产环境 Dev: http:// ...

  7. [Elixir004]通过环境变量(Environment Variables)来管理config

    在elixir的config中我们有时会使用的到一些不想暴露出来的配置项,常用的作法是如Phoenix #config/prod.exs use Mix.Config ... # Finally im ...

  8. Cmake设置环境变量

    references: http://stackoverflow.com/questions/21047399/cmake-set-environment-variables-from-a-scrip ...

  9. CentOS中环境变量和配置文件

    什么是环境变量 bash shell用一个叫做 环境变量(environment variable) 的特性来存储有关shell会话和工作环境的信息.即允许在内存中存储数据,使得在程序或shell中运 ...

随机推荐

  1. curl常用选项

    下载单个文件,默认将输出打印到标准输出中(STDOUT)中 curl http://www.centos.org 通过-o/-O选项保存下载的文件到指定的文件中:-o:将文件保存为命令行中指定的文件名 ...

  2. ORACLE数据库登录显示ORA-28001: the password has expired

    Oracle数据库登录显示 "这个密码已过期,请输入新密码" 点击win键 找到Oracle的SQL Plus 点击打开之后输入登录的用户名密码,然后会显示该密码已过期,输入新口令 ...

  3. Java 计算加几个月之后的时间

    Java 计算加几个月之后的时间 public static Date getAfterMonth(String inputDate,int number) { Calendar c = Calend ...

  4. 据库自增ID用完

    Mysql里int类型是4个字节,如果有符号位的话就是[-2^31,2^31-1],无符号位的话最大值就是2^32-1,也就是4294967295. 自增ID达到上限用完了之后,分为两种情况: 如果设 ...

  5. 第四十五个知识点:描述一些对抗RSA侧信道攻击的基础防御方法

    第四十五个知识点:描述一些对抗RSA侧信道攻击的基础防御方法 原文地址:http://bristolcrypto.blogspot.com/2015/08/52-things-number-45-de ...

  6. 计算机系统2->从芯片说起 | 芯片怎样诞生

    这部分数字逻辑课上老师在讲CMOS部分时有讲过,当时在课堂上放了一个全英的视频,没怎么看懂,现在在研究计算机系统,自底层说起,也得从这讲起. 主要参考: <嵌入式C语言自我素养> b站相关 ...

  7. 登陆认证框架:SpringSecurity

    最近想给自己的小系统搭建一个登录认证服务,最初是想着一套oauth2权鉴就可以,但是发现这个oauth2只是权鉴,具体的登录认证需要由 SpringSecurity来进行实现. 也就是说SpringS ...

  8. Java开发之项目分包

    在我们开始准备写一个大点规模的项目时,我们不能随便地从main函数就开始往下写,要有清晰的逻辑思路和各个层面上的数据的传递和交互. 同时在我们写项目时也应该分出不同的包来做不同的事情,比如view包就 ...

  9. javaScript系列 [43]-TS、Class and ES5

    本文讨论Typescript中的Class同ES5构造函数的对应关系,涉及TypeScript的诸多语法.构造函数.面向对象以及原型对象等相关知识点细节,本文只简单对比并不进行深入展开. TypeSc ...

  10. Kerberos加密级别不支持的问题

    1.问题现象 Zookeeper开启kerberos认证后出现如下问题,不支持的加密级别: 2017-02-23 09:20:57,048 [myid:1] - WARN [NIOWorkerThre ...