您正在文档中查找正确的位置:
if(<variable|string>)
如果给定一个定义为非假常量的值的变量,则为真。否则为假。(注意宏参数不是变量。)
但是,文档并不完整,因为<string>
没有明确提及该案例。仅包含字符串的 CMake if 语句的行为与此处描述的变量不同。字符串的文档应为:
如果给定的字符串与真正的常量(1
、ON
、YES
、TRUE
、Y
或非零数)匹配,则为真。否则为假。
换句话说,任何与这些 CMake true 常量之一不匹配的字符串都将评估为 False。正如您已经指出的那样,字符串"VAR"
:
if ("VAR")
message(TRUE)
else()
message(FALSE)
endif()
打印FALSE
。但是,作为字符串的真正常量(比如说"y"
):
if ("y")
message(TRUE)
else()
message(FALSE)
endif()
打印TRUE
。
这个逻辑在 CMake源代码中的一个函数中是可验证的GetBooleanValue()
:
bool cmConditionEvaluator::GetBooleanValue(
cmExpandedCommandArgument& arg) const
{
// Check basic constants.
if (arg == "0") {
return false;
}
if (arg == "1") {
return true;
}
// Check named constants.
if (cmIsOn(arg.GetValue())) {
return true;
}
if (cmIsOff(arg.GetValue())) {
return false;
}
// Check for numbers.
if (!arg.empty()) {
char* end;
double d = strtod(arg.c_str(), &end);
if (*end == '\0') {
// The whole string is a number. Use C conversion to bool.
return static_cast<bool>(d);
}
}
// Check definition.
const char* def = this->GetDefinitionIfUnquoted(arg);
return !cmIsOff(def);
}