Portas auxiliares de autor
As portas auxiliares, também chamadas de portas de script, expõem funções para outras portas consumirem durante seu processo de compilação. Por exemplo, a vcpkg-cmake
porta define a vcpkg_cmake_configure()
função para outras portas consumirem. Ao empacotar scripts comuns em uma porta auxiliar, a manutenção se torna mais simplificada, pois as atualizações podem ser feitas em um único local. Além disso, as portas auxiliares podem ser versionadas e dependem do uso dos mesmos mecanismos que as portas regulares.
Como eles funcionam?
As portas auxiliares são implementadas através do mecanismo de vcpkg-port-config.cmake
extensão.
Antes de uma porta ser executada, vcpkg importará qualquer vcpkg-port-config.cmake
arquivo que tenha sido exportado pelas dependências diretas da porta prestes a ser executada.
Se uma porta auxiliar depender de uma porta auxiliar diferente, ela deverá importar explicitamente o vcpkg-port-config.cmake
arquivo de sua dependência. As dependências de porta auxiliar para auxiliar não devem ser marcadas como dependências de host, isso garante que um script possa depender de o outro estar no mesmo diretório de instalação.
As portas que dependem de uma porta auxiliar devem marcar a dependência como uma dependência de host.
As portas auxiliares devem sempre instalar seu vcpkg-port-config.cmake
arquivo em um share/${PORT}
subdiretório na árvore de instalação.
Exemplo: Escrever uma porta auxiliar simples
1 - Crie um arquivo CMake que defina a função auxiliar.
my-helper/my_helper_function.cmake
include_guard(GLOBAL)
function(my_helper_function)
message(STATUS "my_helper_function() was called")
my_other_helper_function()
endfunction()
O include_guard(GLOBAL)
na parte superior do arquivo protege contra a redefinição dessa função quando o arquivo é incluído várias vezes.
As linhas a seguir declaram uma função chamada my_helper_function
que exibe uma mensagem e chama o my_other_helper_function
que é definido em uma porta auxiliar diferente.
2 - Criar o arquivo da porftile.cmake
porta auxiliar
my-helper/portfile.cmake
set(VCPKG_POLICY_HELPER_PORT enabled)
file(INSTALL
"${CMAKE_CURRENT_LIST_DIR}/vcpkg-port-config.cmake"
DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}")
file(INSTALL "${VCPKG_ROOT_DIR}/LICENSE.txt" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright)
Ao habilitar a política, o VCPKG_POLICY_HELPER_PORT
vcpkg habilita verificações pós-compilação que se aplicam especificamente às portas auxiliares. Especificamente, verifica se vcpkg-port-config.cmake
está instalado no caminho correto e se nenhum arquivo está instalado no include
diretório.
As próximas linhas instalam os arquivos necessários vcpkg-port-config.cmake
e copyright
em seu local correto (share/${PORT}
).
3 - Crie o arquivo da vcpkg.json
porta auxiliar
my-helper/vcpkg.json
{
"name": "my-helper",
"version-date": "2024-03-20",
"description": "Provide my_helper_function()",
"license": "MIT",
"dependencies": [
{ "name": "my-other-helper" }
]
}
Recomendamos usar version-date
como esquema de controle de versão para portas auxiliares.
O dependencies
neste exemplo contém uma referência a outra porta auxiliar chamada my-other-helper
. A dependência não é marcada propositalmente como uma dependência de host, pois essa é uma dependência de porta auxiliar para auxiliar.
4 - Crie o arquivo da vcpkg-port-config.cmake
porta auxiliar
my-helper/vcpkg-port-config.cmake
include_guard(GLOBAL)
include("${CMAKE_CURRENT_LIST_DIR}/../my-other-helper/vcpkg-port-config.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/my_helper_function.cmake")
O vcpkg-port-config.cmake
arquivo consiste em três linhas, a primeira é um protetor de inclusão global que impede que o arquivo seja incluído várias vezes.
A segunda linha inclui my-other-helper/vcpkg-port-config.cmake
disponibilizar as funções para my-other-helper
portas que dependem sem my-helper
que elas precisem incluir my-other-helper
em sua lista de dependências diretas.
Finalmente, o my_helper_function.cmake
arquivo que contém a my_helper_function
definição é incluído.
5 - Consumir my-helper
em um manifesto
Qualquer consumidor de my-helper
apenas precisa incluir uma dependência direta para my-helper
si mesmo, nenhuma dependência my-other-helper
é necessária. O manifesto de consumo deve marcar a dependência como uma dependência de host.
my-port/vcpkg.json
{
"name": "my-port",
"version": "1.0.0",
"dependencies": [
{
"name": "my-helper",
"host": true
}
]
}
Isso é my_helper_function
disponibilizado em my-port/portfile.cmake
.
my-port/portfile.cmake
my_helper_function()