Variables 如何指定必须设置并存在于cmake中的变量

Variables 如何指定必须设置并存在于cmake中的变量,variables,cmake,defined,Variables,Cmake,Defined,我需要指定一些变量并存在于环境中。 如果不存在,则需要停止建造 范例 if ( "${VARMUSTEXIST}" STREQUAL "ON" ) message(STATUS is ON) elif ("${VARMUSTEXIST}" STREQUAL "OFF") message(STATUS is OFF) endif() 我不想在脚本中的任何地方都放置if(defined VARMUSTEXIST)。 在bash中,有一个选项用于“set-u”。一些初步要点: if(“

我需要指定一些变量并存在于环境中。 如果不存在,则需要停止建造

范例

if ( "${VARMUSTEXIST}" STREQUAL "ON" )
   message(STATUS is ON)
elif ("${VARMUSTEXIST}" STREQUAL "OFF")
   message(STATUS is OFF)
endif()
我不想在脚本中的任何地方都放置
if(defined VARMUSTEXIST)

在bash中,有一个选项用于“set-u”。

一些初步要点:

  • if(“${VARMUSTEXIST}”STREQUAL ON”)[…]elif(同样是长表达式)[…]endif()

    通常在cmake中只是:
    if(VARMUSTEXIST)[…]else()[…]endif()
  • 命令
    if(DEFINED VARMUSTEXIST)
    要求为大写
  • 您提到bash和环境变量:
    环境变量是使用
  • 对于环境变量,您将执行以下操作:

    if(NOT DEFINED ENV{VARMUSTEXIST})
        message(FATAL_ERROR "You must set VARMUSTEXIST environment variable")
    endif()
    
你说:

我不想在脚本中的任何地方都放置
if(defined VARMUSTEXIST)

这对我来说并不清楚:对于每个变量,您只需要检查一次,可能是在主CMakeLists.txt中。当然,您需要添加
NOT
if(未定义的VARMUSTEXIST)[stop]


如果您能更精确地解决问题,我们可以设计一个宏来检查是否定义了一个或一组变量。

如果环境是指操作系统环境变量,那么语法无论如何都是错误的

如果这些选项是由用户提供的,那么与ON和OFF的文字比较是不正确的,因为CMake有更多的方式来表达布尔语,它们都被广泛使用并成为习惯用语。因此,通过期望
打开
关闭
,您使构建脚本变得怪异,违背了所有人的期望。正如你所注意到的,你也在为自己做更多的工作

首先,您应该记录这些选项,并使用
option()
为它们提供安全的默认值。这样,变量就不会是未定义的

# early in the top-level CMakeLists.txt
option(VARMUSTEXIST "You can provide it. It exists anyway." NO)
然后你会简单地检查它的真假:

# later in top-level file or in subdirectories
if (VARMUSTEXIST)
   message("VARMUSTEXIST is true")
else()
   message("VARMUSTEXIST is false")
endif()

取消引用时,CMake将所有未定义的变量视为具有空值。据我所知,没有办法影响这种行为。顺便说一下,如果没有定义变量,simple
if(VARMUSTEXIST)
将被视为false。在“开”和“关”之间进行选择也可以使用相同的条件-这些字符串对命令有特殊的意义。在cmake脚本的开头使用宏来检查变量列表的想法非常好,但它无法捕捉到开发人员犯错误并拼错变量名的情况。Cmake将默默地继续。我想做的是告诉cmake,当读取变量值时,它应该始终检查变量是否定义,如果没有定义,则失败。为了兼容性,必须只为当前的cmake文件启用此选项,否则在不破坏现有cmake文件的情况下就不可能包含现有的cmake文件。至于bash,我之所以提到它,是因为强制要求必须定义所有变量的特性。例如,以下bash脚本将导致错误:
#/bin/bash
set-u
VAR=Y
echo${VA}
如果可以编写这样的内容,那就太酷了:
cmake_策略(将READ_UNDEFINED_变量设置为OFF)
消息(STATUS${VA})
此时消息行将失败。在使用之前,仍然可以使用
if(DEFINED VA)
检查是否存在。@D.Alex关于开发人员拼写错误的风险,几年前也提出了同样的问题,请参阅。不幸的是,没有解决办法。也许您想发出一个特性请求(注意,即使在C中也有一个特性请求)。顺便说一下,为向后兼容而引入的策略不适合此目的。看见