O Visual Studio gerou o seguinte CMakePresets.json para mim quando clico em "Gerenciar configurações..." em um projeto CMake:
{
"version": 3,
"configurePresets": [
{
"name": "windows-base",
"description": "Target Windows with the Visual Studio development environment.",
"hidden": true,
"generator": "Ninja",
"binaryDir": "${sourceDir}/out/build/${presetName}",
"installDir": "${sourceDir}/out/install/${presetName}",
"cacheVariables": {
"CMAKE_C_COMPILER": "cl.exe",
"CMAKE_CXX_COMPILER": "cl.exe"
},
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Windows"
}
},
{
"name": "x64-debug",
"displayName": "x64 Debug",
"description": "Target Windows (64-bit) with the Visual Studio development environment. (Debug)",
"inherits": "windows-base",
"architecture": {
"value": "x64",
"strategy": "external"
},
"cacheVariables": { "CMAKE_BUILD_TYPE": "Debug" }
},
{
"name": "x64-release",
"displayName": "x64 Release",
"description": "Target Windows (64-bit) with the Visual Studio development environment. (RelWithDebInfo)",
"inherits": "x64-debug",
"cacheVariables": { "CMAKE_BUILD_TYPE": "Release" }
},
{
"name": "x86-debug",
"displayName": "x86 Debug",
"description": "Target Windows (32-bit) with the Visual Studio development environment. (Debug)",
"inherits": "windows-base",
"architecture": {
"value": "x86",
"strategy": "external"
},
"cacheVariables": { "CMAKE_BUILD_TYPE": "Debug" }
},
{
"name": "x86-release",
"displayName": "x86 Release",
"description": "Target Windows (32-bit) with the Visual Studio development environment. (RelWithDebInfo)",
"inherits": "x86-debug",
"cacheVariables": { "CMAKE_BUILD_TYPE": "Release" }
}
]
}
Estou interessado no prefixo de instalação cmake, que é definido com o installDir
campo. É bom porque o diretório resultante incluirá indiretamente o nome do processador "x64", já que o nome predefinido inclui o processador.
Mas o nome do processador é codificado, ou seja, faz parte da string literal, por exemplo "x64-debug"
, nos vários nomes predefinidos. É possível referenciar o processador como uma variável (ou expansão de macro) em CMakePresets.json? Ou seja, algo semelhante à CMAKE_SYSTEM_PROCESSOR
variável de cache que está disponível em CMakeLists.txt?
Não não é. A lista completa de macros disponíveis pode ser encontrada aqui .
Atualmente está limitado a
${sourceDir}
: Caminho para o diretório de origem do projeto (ou seja, o mesmo queCMAKE_SOURCE_DIR
).${sourceParentDir}
: caminho para o diretório pai do diretório de origem do projeto.${sourceDirName}
: O último componente do nome do arquivo${sourceDir}
. Por exemplo, se${sourceDir}
for/path/to/source
, isso seriasource
.${presetName}
: Nome especificado noname
campo do preset.${generator}
: Gerador especificado nogenerator
campo do preset. Para predefinições de construção e teste, isso será avaliado para o gerador especificado porconfigurePreset
.${hostSystemName}
:O nome do sistema operacional host. Contém o mesmo valor queCMAKE_HOST_SYSTEM_NAME
. Isso é permitido em arquivos predefinidos especificando a versão 3 ou superior.${fileDir}
: Caminho para o diretório que contém o arquivo predefinido que contém a macro. Isso é permitido em arquivos predefinidos especificando a versão 4 ou superior.${dollar}
: Um cifrão literal ($).${pathListSep}
: Caractere nativo para separar listas de caminhos, como:
ou;
. Por exemplo, definirPATH
como/path/to/ninja/bin${pathListSep}$env{PATH}
,${pathListSep}
expandirá para o caractere do sistema operacional subjacente usado para concatenação emPATH
. Isso é permitido em arquivos predefinidos especificando a versão 5 ou superior.$env{<variable-name>}
: Variável de ambiente com nome<variable-name>
. O nome da variável não pode ser uma string vazia. Se a variável for definida noenvironment
campo, esse valor será usado em vez do valor do ambiente pai. Se a variável de ambiente não estiver definida, isso será avaliado como uma sequência vazia. Observe que, embora os nomes de variáveis de ambiente do Windows não façam distinção entre maiúsculas e minúsculas, os nomes de variáveis dentro de uma predefinição ainda diferenciam maiúsculas de minúsculas. Isto pode levar a resultados inesperados ao usar revestimento inconsistente. Para obter melhores resultados, mantenha consistente a capitalização dos nomes das variáveis de ambiente.$penv{<variable-name>}
: semelhante a$env{<variable-name>}
, exceto que o valor vem apenas do ambiente pai e nunca doenvironment
campo. Isso permite acrescentar ou anexar valores às variáveis de ambiente existentes. Por exemplo, definirPATH
como/path/to/ninja/bin:$penv{PATH}
será anexado/path/to/ninja/bin
àPATH
variável de ambiente. Isto é necessário porque$env{<variable-name>}
não permite referências circulares.$vendor{<macro-name>}
: um ponto de extensão para os fornecedores inserirem suas próprias macros. O CMake não será capaz de usar predefinições que possuam uma$vendor{<macro-name>}
macro e efetivamente ignora tais predefinições. No entanto, ainda será possível usar outras predefinições do mesmo arquivo. O CMake não faz nenhuma tentativa de interpretar$vendor{<macro-name>}
macros. No entanto, para evitar colisões de nomes, os fornecedores de IDE devem prefixar<macro-name>
um prefixo de identificador de fornecedor muito curto (de preferência <= 4 caracteres), seguido por um.
, seguido pelo nome da macro. Por exemplo, o IDE de exemplo poderia ter$vendor{xide.ideInstallDir}
.