Esercitazione: Creare un pacchetto di una libreria con vcpkg
Questa esercitazione illustra come creare un pacchetto di una libreria per vcpkg usando una sovrimpressione personalizzata. È consigliabile leggere l'esercitazione Installare e usare pacchetti con CMake prima di procedere.
Prerequisiti
Nota
In Windows questa esercitazione usa MSVC di Visual Studio come compilatore per lo sviluppo C++.
1 - Configurare vcpkg
Clonare il repository
Il primo passaggio consiste nel clonare il repository vcpkg da GitHub. Il repository contiene script per acquisire l'eseguibile vcpkg e un registro di librerie open source curate gestite dalla community vcpkg. A tale scopo, eseguire:
git clone https://github.com/microsoft/vcpkg.git
Il registro curato vcpkg è un set di oltre 2.000 librerie open source. Queste librerie sono state convalidate dalle pipeline di integrazione continua di vcpkg per collaborare. Anche se il repository vcpkg non contiene il codice sorgente per queste librerie, contiene ricette e metadati per compilarli e installarli nel sistema.
Eseguire lo script bootstrap
Dopo aver clonato il repository vcpkg, passare alla
vcpkg
directory ed eseguire lo script bootstrap:cd vcpkg && bootstrap-vcpkg.bat
cd vcpkg; .\bootstrap-vcpkg.bat
cd vcpkg && ./bootstrap-vcpkg.sh
Lo script bootstrap esegue i controlli dei prerequisiti e scarica il file eseguibile vcpkg.
Ecco fatto! vcpkg è configurato e pronto per l'uso.
2 - Configurare la VCPKG_ROOT
variabile di ambiente
Per impostare le VCPKG_ROOT
variabili di ambiente, eseguire i comandi seguenti:
export VCPKG_ROOT=/path/to/vcpkg
export PATH=$VCPKG_ROOT:$PATH
Nota
L'impostazione delle variabili di ambiente tramite il export
comando influisce solo sulla sessione della shell corrente. Per rendere permanente questa modifica tra le sessioni, aggiungere il export
comando allo script del profilo della shell (ad esempio, ~/.bashrc
o ~/.zshrc
).
set "VCPKG_ROOT=C:\path\to\vcpkg"
set PATH=%VCPKG_ROOT%;%PATH%
Nota
L'impostazione delle variabili di ambiente in questo modo influisce solo sulla sessione del terminale corrente. Per rendere permanenti queste modifiche in tutte le sessioni, impostarle tramite il pannello Variabili di ambiente del sistema Windows.
$env:VCPKG_ROOT="C:\path\to\vcpkg"
$env:PATH="$env:VCPKG_ROOT;$env:PATH"
Nota
L'impostazione delle variabili di ambiente in questo modo influisce solo sulla sessione del terminale corrente. Per rendere permanenti queste modifiche in tutte le sessioni, impostarle tramite il pannello Variabili di ambiente del sistema Windows.
L'impostazione VCPKG_ROOT
indica a vcpkg dove si trova l'istanza vcpkg.
Aggiungendolo per PATH
assicurarsi di poter eseguire comandi vcpkg direttamente dalla shell.
3 - Configurare la sovrimpressione personalizzata
- Creare una nuova directory denominata
custom-overlay
accanto alHello World
progetto creato nell'esercitazione Installare e usare pacchetti con CMake . - All'interno della
custom-overlay
directory creare una cartella denominatavcpkg-sample-library
.
4 - Configurare i file di porta
Creare prima di tutto il vcpkg.json
file all'interno della custom-overlay\vcpkg-sample-library
cartella con il contenuto seguente:
{
"name": "vcpkg-sample-library",
"version": "1.0.2",
"homepage": "https://github.com/microsoft/vcpkg-docs/tree/cmake-sample-lib",
"description": "A sample C++ library designed to serve as a foundational example for a tutorial on packaging libraries with vcpkg.",
"license": "MIT",
"dependencies": [
{
"name" : "vcpkg-cmake",
"host" : true
},
{
"name" : "vcpkg-cmake-config",
"host" : true
},
"fmt"
]
}
Il vcpkg.json
file funge da manifesto che definisce metadati e dipendenze per una libreria C++, fornendo a vcpkg le informazioni necessarie per compilare, installare e gestire il pacchetto.
name
: specifica il nome della libreria. Viene usato come identificatore del pacchetto.version
: indica il numero di versione della libreria.homepage
: URL della home page del progetto, spesso il relativo repository. Utile per coloro che vogliono saperne di più o contribuire.description
: breve testo che descrive le operazioni della libreria. Questo vale per la documentazione e gli utenti.license
: specifica la licenza con cui viene distribuita la libreria.dependencies
: matrice contenente l'elenco delle dipendenze necessarie per la libreria.name
:vcpkg-cmake
specifica una dipendenza davcpkg-cmake
, che fornisce funzioni e macro CMake comunemente usate nelle porte vcpkg.host
: true: specifica chevcpkg-cmake
è una dipendenza host, ovvero è necessaria per la compilazione del pacchetto ma non per l'uso.name
:vcpkg-cmake-config
specifica una dipendenza davcpkg-cmake-config
, utile per l'uso degli script di configurazione di CMake.fmt
: specifica una dipendenza di runtime dallafmt
libreria. Ciò significa chefmt
è necessario sia per la compilazione che per l'uso del pacchetto.
Per altre informazioni su vcpkg.json
, vedere la documentazione seguente sui manifesti.
Creare ora il usage
file all'interno della custom-overlay\vcpkg-sample-library
directory con il contenuto seguente:
vcpkg-sample-library provides CMake targets:
find_package(my_sample_lib CONFIG REQUIRED)
target_link_libraries(main PRIVATE my_sample_lib::my_sample_lib)
La documentazione sull'utilizzo per le porte consente agli utenti di adottarli facilmente nei progetti. È consigliabile fornire un usage
file all'interno della directory della porta (ports/<port name>/usage
) che descrive i passaggi minimi necessari per l'integrazione con un sistema di compilazione. Per determinare le istruzioni di utilizzo corrette, è consigliabile seguire le indicazioni di upstream. Nel caso in cui upstream non fornisca informazioni sull'utilizzo, potrebbe essere necessario esaminare il sistema di compilazione per trovare le destinazioni esportate.
Per altre indicazioni, vedere Gestione dei file di utilizzo
Infine, creare il portfile.cmake
file all'interno della custom-overlay\vcpkg-sample-library
directory con il contenuto seguente:
vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH
REPO Microsoft/vcpkg-docs
REF "${VERSION}"
SHA512 0 # This is a temporary value. We will modify this value in the next section.
HEAD_REF cmake-sample-lib
)
vcpkg_cmake_configure(
SOURCE_PATH "${SOURCE_PATH}"
)
vcpkg_cmake_install()
vcpkg_cmake_config_fixup(PACKAGE_NAME "my_sample_lib")
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")
file(INSTALL "${SOURCE_PATH}/LICENSE" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright)
configure_file("${CMAKE_CURRENT_LIST_DIR}/usage" "${CURRENT_PACKAGES_DIR}/share/${PORT}/usage" COPYONLY)
Questo portfile
definisce come scaricare, compilare, installare e creare un pacchetto di una libreria C++ specifica da GitHub usando vcpkg.
vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
: specifica che per questo pacchetto è supportato solo il collegamento statico.vcpkg_from_github
: avvia la funzione per scaricare il codice sorgente da un repository GitHub.OUT_SOURCE_PATH SOURCE_PATH
: imposta la directory in cui verrà estratto il codice sorgente.REPO Microsoft/vcpkg-docs
: repository GitHub contenente il codice sorgente.REF "${VERSION}"
: versione del codice sorgente da scaricare.SHA512 0
: segnaposto per l'hash SHA-512 del codice sorgente per la verifica dell'integrità.HEAD_REF main
: specifica il ramo predefinito per il repository.
vcpkg_cmake_configure
: configura il progetto usando CMake, configurando la compilazione.SOURCE_PATH "${SOURCE_PATH}"
: percorso del codice sorgente scaricato in precedenza.
vcpkg_cmake_install()
: compila e installa il pacchetto usando CMake.vcpkg_cmake_config_fixup(PACKAGE_NAME "my_sample_lib")
: corregge i file di configurazione del pacchetto CMake in modo che siano compatibili con vcpkg.file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")
: elimina la directory di inclusione dall'installazione di debug per evitare sovrapposizioni.file(INSTALL "${SOURCE_PATH}/LICENSE" DESTINATION ...)
: installa il file LICENSE nella directory di condivisione del pacchetto e lo rinomina in copyright.configure_file("${CMAKE_CURRENT_LIST_DIR}/usage" ...)
: copia un file di istruzioni di utilizzo nella directory di condivisione del pacchetto.
Per altre informazioni, vedere la guida del responsabile della manutenzione.
5 - Aggiornare SHA512 per portfile.cmake
Eseguire:
vcpkg install vcpkg-sample-library --overlay-ports=C:\path\to\custom-overlay
Verrà visualizzato un messaggio di errore lungo. Analizza l'output finché non trovi:
Expected hash: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Actual hash: 4202125968a01219deeee14b81e1d476dab18d968425ba36d640816b0b3db6168f8ccf4120ba20526e9930c8c7294e64d43900ad2aef9d5f28175210d0c3a417
Copiare "Hash effettivo" 4202125968a01219deeee14b81e1d476dab18d968425ba36d640816b0b3db6168f8ccf4120ba20526e9930c8c7294e64d43900ad2aef9d5f28175210d0c3a417
e sostituire il SHA512
valore in portfile.cmake
con il relativo valore.
Eseguire nuovamente il comando di installazione:
vcpkg install vcpkg-sample-library --overlay-ports=C:\path\to\custom-overlay
Computing installation plan...
The following packages will be built and installed:
vcpkg-sample-library:x64-windows -> 1.0.2 -- C:\Users\dev\demo\custom-overlay\vcpkg-sample-library
Detecting compiler hash for triplet x64-windows...
Restored 0 package(s) from C:\Users\dev\AppData\Local\vcpkg\archives in 174 us. Use --debug to see more details.
Installing 1/1 vcpkg-sample-library:x64-windows...
Building vcpkg-sample-library:x64-windows...
-- Installing port from location: C:\Users\dev\demo\custom-overlay\vcpkg-sample-library
-- Note: vcpkg-sample-library only supports static library linkage. Building static library.
-- Using cached Microsoft-vcpkg-docs-1.0.2.tar.gz.
-- Cleaning sources at C:/Users/dev/demo/vcpkg/buildtrees/vcpkg-sample-library/src/1.0.2-2aff836404.clean. Use --editable to skip cleaning for the packages you specify.
-- Extracting source C:/Users/dev/demo/vcpkg/downloads/Microsoft-vcpkg-docs-1.0.2.tar.gz
-- Using source at C:/Users/dev/demo/vcpkg/buildtrees/vcpkg-sample-library/src/1.0.2-2aff836404.clean
-- Configuring x64-windows
-- Building x64-windows-dbg
-- Building x64-windows-rel
-- Installing: C:/Users/dev/demo/vcpkg/packages/vcpkg-sample-library_x64-windows/share/vcpkg-sample-library/copyright
-- Performing post-build validation
Stored binaries in 1 destinations in 94 ms.
Elapsed time to handle vcpkg-sample-library:x64-windows: 6.1 s
Total install time: 6.1 s
vcpkg-sample-library provides CMake targets:
find_package(my_sample_lib CONFIG REQUIRED)
target_link_libraries(main PRIVATE my_sample_lib::my_sample_lib)
6 - Verificare la compilazione della porta
Per verificare correttamente le compilazioni e i collegamenti della libreria, aggiungere una nuova dipendenza al helloworld
progetto creato nell'esercitazione sui pacchetti di installazione.
Apportare le modifiche seguenti ai file di configurazione e al manifesto del progetto.
Modificare helloworld/vcpkg.json
per aggiungere una dipendenza da vcpkg-sample-library
:
{
"dependencies": [
"fmt",
"vcpkg-sample-library"
]
}
Modificare helloworld/vcpkg-configuration.json
per includere la overlay-ports
cartella che contiene la nuova porta:
{
"default-registry": {
"kind": "git",
"baseline": "45f6e57d3e10ad96b7db206cf7888f736ba5aa61",
"repository": "https://github.com/microsoft/vcpkg"
},
"registries": [
{
"kind": "artifact",
"location": "https://github.com/microsoft/vcpkg-ce-catalog/archive/refs/heads/main.zip",
"name": "microsoft"
}
],
"overlay-ports": [
"../custom-overlay"
]
}
Modificare helloworld/CMakeLists.txt
quindi e helloworld/main.cpp
per usare la nuova dipendenza.
helloworld/CMakeLists.txt
Modificare con il contenuto seguente:
cmake_minimum_required(VERSION 3.10)
project(HelloWorld)
find_package(fmt CONFIG REQUIRED)
find_package(my_sample_lib CONFIG REQUIRED) # Add this line
add_executable(HelloWorld helloworld.cpp)
target_link_libraries(HelloWorld PRIVATE fmt::fmt)
target_link_libraries(HelloWorld PRIVATE my_sample_lib::my_sample_lib) # Add this line
main.cpp
Modificare con il contenuto seguente:
#include "my_sample_lib.h" // Replace #include <fmt/core.h> with "my_sample_lib.h"
int main()
{
greet("vcpkg!"); // Replace fmt::print("Hello World!\n) with this line
return 0;
}
Configurare, compilare ed eseguire l'applicazione.
- Configurare la compilazione con CMake:
cmake --preset=default
- Compilare il progetto:
cmake --build build
- Eseguire l'applicazione:
./build/HelloWorld
Il percorso dell'eseguibile del progetto può essere diverso, ad esempio: ./build/Debug/HelloWorld.exe
.
Hello vcpkg!
Passaggi successivi
Ora che è vcpkg-sample-library
stato creato un pacchetto come porta, il passaggio successivo consiste nell'aggiungerlo al Registro di sistema curato da vcpkg. Vedere Aggiunta di porte al registro vcpkg.
Per altre informazioni, vedi: