从这个答案和这个链接,我了解到如果继承预设和继承预设都定义了条件,则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 上,行为并不如预期。
在 Windows 上,我预计
fail_if_no_foo
仅在设置了父环境变量 FOO
时才可用,但 fail_if_not_linux
和 inherited_preset
永远不可用,因为“fail if not Linux”条件应适用于两者.FOO
时,没有可用的预设,这很好,但是当设置 FOO
时, fail_if_no_foo
和 inherited_preset
都可用:
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 问题中已涵盖的问题相同?
最终的问题是,您无法“组合”多个条件,无论是严格地从继承的预设,还是从继承的预设和继承预设的组合?
链接的 CMake 问题的术语对我来说有点难以理解该提问者的问题是否与我的问题相同:我不太明白“节点”和“活动预设”是什么。
更新:请注意,对于这个问题,在 Linux 上观察到的行为与通过我之前的相关问题观察到的行为不同。但我仍然有一种挥之不去的感觉,这些问题是“相关的”。我只是无法判断这两个问题是否具有相同的根本原因,从而判断这是否是一个骗局。如果读者想与链接的问题进行比较,这是此 CMakePresets 的行为:
$ 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 则失败”条件是否被忽略。
这是否与链接的 CMake 问题中已涵盖的问题相同?
是的。在CMake问题中,当前具有多重继承的行为被描述为
在多重继承的情况下,总是第一个提供条件的子项似乎“获胜”并提供有效条件。
这正是您所看到的:仅考虑
fail_if_no_foo
,因为它是第一个带有条件的继承预设。