首页 > 解决方案 > 在 CMake 中实现条件 FORCE

问题描述

我已经实现了一个方案,它允许我检测MY_VAR用户是否更改了 CACHE 变量,就像这里建议的那样。由于存在许多依赖关系,我没有在单个因变量上强制使用新值,而是引入了一个新变量MY_VAR_CHANGED。要定义因变量,可以执行以下操作:

if( MY_VAR_CHANGED )
  set( DEPENDENT_VAR "${MY_VAR}/ADDITIONAL_INFO" CACHE PATH "" FORCE )
else()
  set( DEPENDENT_VAR "${MY_VAR}/ADDITIONAL_INFO" CACHE PATH "" )
endif()

我在许多不同的地方使用这段代码,所以我想知道是否有一种优雅的方式来有条件地包装 FORCE,例如通过使用类似于? :c++ 中的语句的东西。

标签: c++cmake

解决方案


CMake 缺少许多与“内联”计算相关的功能。相反,您可以始终创建所需的宏/函数封装行为:

# Straightforward macro, which removes code duplicates
macro(set_force_conditional cond_var)
    if(${cond_var})
        set(${ARGV} "" FORCE)
    else()
        set(${ARGV} "")
    endif()
endmacro()

用法:

set_force_conditional(MY_VAR_CHANGED DEPENDENT_VAR "${MY_VAR}/ADDITIONAL_INFO" CACHE PATH)

(普通变量的取消引用会丢失元素,因此宏手动""将空文档字符串传递给命令)。set(CACHE)


推荐阅读