You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何继承Windows不满足条件的CMake预设在Windows仍可用?

CMake预设多继承条件组合问题

从相关资料得知,当继承预设与被继承预设均定义condition时,CMake预设目前不会组合条件。我尝试通过多继承规避该问题:两个独立预设分别实现两个独立条件,继承预设不定义任何条件,配置如下:

{
  "version": 3,
  "cmakeMinimumRequired": {
    "major": 3,
    "minor": 20
  },
  "configurePresets": [
    {
      "name": "fail_if_no_foo",
      "displayName": "Fail if no FOO",
      "description": "Demo failing if environment variable FOO is unset",
      "binaryDir": "${sourceDir}/build",
      "generator": "Unix Makefiles",
      "condition": {
        "type": "allOf",
        "conditions": [
          {
            "type": "notEquals",
            "lhs": "$penv{FOO}",
            "rhs": ""
          }
        ]
      }
    },
    {
      "name": "fail_if_not_linux",
      "displayName": "Fail if not Linux",
      "description": "Demo failing if the host is not Linux",
      "condition": {
        "type": "allOf",
        "conditions": [
          {
            "type": "equals",
            "lhs": "${hostSystemName}",
            "rhs": "Linux"
          }
        ]
      }
    },
    {
      "name": "inherited_preset",
      "displayName": "Inherited fail if no FOO and fail if not Linux",
      "description": "Demo multiple inherited conditions",
      "inherits": [
        "fail_if_no_foo",
        "fail_if_not_linux"
      ]
    }
  ]
}

Linux下行为(符合预期)

Linux下仅需判断父环境是否定义FOO,条件不满足时预设会被隐藏:

$ uname -s
Linux
$
$ cmake --list-presets
Available configure presets:

  "fail_if_not_linux" - Fail if not Linux
$
$ FOO=bar cmake --list-presets
Available configure presets:

  "fail_if_no_foo"    - Fail if no FOO
  "fail_if_not_linux" - Fail if not Linux
  "inherited_preset"  - Inherited fail if no FOO and fail if not Linux
$

Windows下行为(不符合预期)

预期fail_if_no_foo仅在FOO环境变量被设置时可用,fail_if_not_linux和inherited_preset因非Linux系统应始终不可用,但实际观察到:

c:\dev\cmake-learn\preset_multiple_conditions_with_multiple_inheritance>cmake --list-presets

c:\dev\cmake-learn\preset_multiple_conditions_with_multiple_inheritance>set FOO=bar

c:\dev\cmake-learn\preset_multiple_conditions_with_multiple_inheritance>cmake --list-presets
Available configure presets:

  "fail_if_no_foo"   - Fail if no FOO
  "inherited_preset" - Inherited fail if no FOO and fail if not Linux

c:\dev\cmake-learn\preset_multiple_conditions_with_multiple_inheritance>

核心疑问

这是否属于已知CMake问题?核心问题是否为:无论仅从继承预设,还是继承预设与被继承预设组合,均无法「组合」多个条件?

由于无法理解相关问题中的术语(如「nodes」和「active presets」),无法确认该问题是否与我的问题一致。


更新

本次Linux下的行为与我此前相关问题中的行为不同,但感觉二者存在关联,无法判断是否为同一根因导致的重复问题。以下是本次CMakePresets在Linux下的执行行为,供对比:

$ cmake --preset fail_if_no_foo
CMake Error: Could not use disabled preset "fail_if_no_foo"
$
$ FOO=bar cmake --preset fail_if_no_foo
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/dev/cmake-learn/preset_multiple_conditions_with_multiple_inheritance/build
$
$ cmake --preset inherited_preset
CMake Error: Could not use disabled preset "inherited_preset"
$
$ FOO=bar cmake --preset inherited_preset
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/dev/cmake-learn/preset_multiple_conditions_with_multiple_inheritance/build
$

此处Linux下的行为看似「正确」。在之前的问题中,继承预设强制执行了被继承预设的条件,但未强制执行自身的条件;而本次问题中,我无法确认继承预设是否正确强制执行了两个继承条件,还是「非Linux则失效」的条件被忽略了。


内容的提问来源于stack exchange,提问作者StoneThrow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 12:25:14