O seguinte CMakePresets.json demonstra a imposição de que uma variável de ambiente seja definida usando condições configurePresets:
{
"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": "notEquals",
"lhs": "$penv{FOO}",
"rhs": ""
}
}
]
}
$ 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_condition/build
$
A seguinte modificação mostra que a condição pode ser herdada:
{
"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": "notEquals",
"lhs": "$penv{FOO}",
"rhs": ""
}
},
{
"name": "inherited_preset",
"inherits": "fail_if_no_foo",
"displayName": "Inherited fail if no FOO",
"description": "Demo inherited condition to fail if environment variable FOO is unset"
}
]
}
$ 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_condition/build
$
Mas a herança da condição dos pais parece desaparecer se a herança de ConditionPresets introduzir sua própria condição:
{
"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": "notEquals",
"lhs": "$penv{FOO}",
"rhs": ""
}
},
{
"name": "inherited_preset",
"inherits": "fail_if_no_foo",
"displayName": "Inherited fail if no FOO",
"description": "Demo inherited condition to fail if environment variable FOO is unset",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Linux"
}
}
]
}
$ uname -s
Linux
$ cmake --preset inherited_preset
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/dev/cmake_learn/preset_condition/build
$
Existe uma maneira de implementar um relacionamento "e" entre as condições implementadas no configurePreset atual e as condições de um configurePreset herdado?
Quero inherited_preset
impor a condição que ${hostSystemName}
é "Linux" e que o ambiente pai define FOO
.
A documentação do CMake Presets indica uma allOf
palavra-chave, mas não dá um exemplo de como usá-la, e não descobri como usá-la para implementar minha necessidade.
Abaixo estão minhas duas tentativas de interpretar a partir da documentação como usar allOf
:
{
"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": {
"allOf": {
"conditions": [
{
"type": "notEquals",
"lhs": "$penv{FOO}",
"rhs": ""
}
]
}
}
},
{
"name": "inherited_preset",
"inherits": "fail_if_no_foo",
"displayName": "Inherited fail if no FOO",
"description": "Demo inherited condition to fail if environment variable FOO is unset",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Linux"
}
}
]
}
{
"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": {
"allOf": {
"conditions": [
{
"type": "notEquals",
"lhs": "$penv{FOO}",
"rhs": ""
}
]
}
}
},
{
"name": "inherited_preset",
"inherits": "fail_if_no_foo",
"displayName": "Inherited fail if no FOO",
"description": "Demo inherited condition to fail if environment variable FOO is unset",
"condition": {
"allOf": {
"conditions": [
{
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Linux"
}
]
}
}
}
]
}
... mas ambas as tentativas falharam na análise com o mesmo erro:
$ cmake --preset fail_if_no_foo
CMake Error: Could not read presets from /home/user/dev/cmake_learn/preset_condition: Invalid preset condition
Atualização: acho que tive um mal-entendido na minha tentativa anterior de usar o allOf
. A tentativa a seguir analisa, mas ainda não consegue implementar o comportamento desejado de impor as condições da criança e dos pais:
{
"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": "inherited_preset",
"inherits": "fail_if_no_foo",
"displayName": "Inherited fail if no FOO",
"description": "Demo inherited condition to fail if environment variable FOO is unset",
"condition": {
"type": "allOf",
"conditions": [
{
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "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_condition/build
$ cmake --preset inherited_preset
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/dev/cmake_learn/preset_condition/build
$
Parece-me que o que você deseja é o que é solicitado nas predefinições de solicitação de recurso abertas: Herança de predefinições condicionais , que solicita que, em vez de as condições serem avaliadas apenas para efeito após a conclusão de toda a herança, ela seja avaliada para efeito em cada predefinido na árvore de herança antes que a herança ocorra. Sugiro que você dê um joinha nesse ticket de problema para mostrar apoio a ele. Você também pode se inscrever para ser notificado sobre discussões e progresso. Evite fazer comentários barulhentos, como aqueles que consistem apenas em "+1" / "bump".