为何继承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
相关产品推荐
相关产品推荐

