Tiga jalur CMake pada Chapter lalu punya prasyarat yang sama: library harus sudah ada — terpasang di sistem atau tinggal di sebuah folder. Siapa yang mengerjakan pekerjaan mengunduh, membangun, dan memasang ratusan library itu di setiap mesin developer? Menjawabnya manual berarti membaca README setiap library dan mengulanginya tiap berganti mesin. Di sinilah manajer paket masuk, dan vcpkg — dibangun Microsoft, terbuka untuk semua — adalah yang paling lekat dengan CMake: satu perintah memasang library, satu file vcpkg.json mencatat daftarnya, dan satu toolchain menyambungkannya ke find_package yang sudah kita kenal. Pada Chapter ini kita menelusuri alur lengkapnya dari clone sampai build.
Peran vcpkg dalam Build Kita #
vcpkg menjaga port — resep build untuk setiap library, lebih dari dua ribu di antaranya, di repositori resminya. Saat kita meminta sebuah port, vcpkg yang mengunduh source-nya, mengompilasi dengan compiler kita, dan menaruh hasilnya di folder installed/ miliknya — lengkap dengan file konfigurasi CMake yang dibutuhkan find_package. Tiga konsep menopang semua ini:
- Port: resep (versi, sumber, aturan build) untuk satu library —
fmt,zlib,boost-asio, dan kawan-kawannya. - Triplet: kombinasi platform dan tipe pustaka yang dituju build, misalnya
x64-linux,x64-windows,arm64-osx; default diambil dari sistem Anda. - Manifest: file
vcpkg.jsonproyek yang mencatat daftar dependensi — sumber kebenaran yang ikut tersimpan di repositori.
Memasang vcpkg #
vcpkg tidak butuh installer: ia di-clone lalu di-bootstrap — proses bootstrap mengompilasi tool vcpkg itu sendiri dari source C++, jadi compiler sudah harus ada:
git clone https://github.com/microsoft/vcpkg.git
./vcpkg/bootstrap-vcpkg.sh
export VCPKG_ROOT=$PWD/vcpkgVariabel VCPKG_ROOT menunjuk folder vcpkg agar toolchain CMake kelak menemukannya tanpa path yang diketik ulang. Di Windows langkahnya sama dengan bootstrap-vcpkg.bat.
Mode Klasik: Pasang ke Instalasi Global #
Cara paling langsung memakai vcpkg adalah mode klasik — satu perintah per library:
vcpkg install fmtvcpkg mengunduh port fmt, membangunnya dengan triplet default (x64-linux di sistem ini), dan memasangnya di <VCPKG_ROOT>/installed/. Semua proyek di mesin itu bisa memakai hasil instalasi yang sama. Praktis untuk eksplorasi, tetapi punya lubang: proyek kita tidak mencatat bahwa ia butuh fmt — rekan satu tim yang baru clone repositori tidak tahu harus memasang apa.
Manifest Mode: vcpkg.json #
Mode manifest membalik arah pencatatan: daftar dependensi hidup di dalam proyek, dalam file vcpkg.json di folder teratas:
{
"name": "laporan-penjualan",
"version-string": "0.1.0",
"dependencies": [
"fmt"
]
}Kita bisa menulisnya manual atau menyuruh vcpkg menambahkan satu port sekaligus — vcpkg add port fmt — lalu sekadar menjalankan vcpkg install di folder proyek. Karena manifest ikut tersimpan di repositori, git clone cukup untuk mereproduksi lingkungan build di mesin mana pun: versi library, jumlahnya, dan urutannya terkunci bersama source. Inilah mode yang disarankan untuk proyek serius.
Integrasi dengan CMake #
Sambungan vcpkg–CMake adalah satu toolchain file — skrip CMake yang dijalankan CMake pada fase configure:
cmake_minimum_required(VERSION 3.20)
project(LaporanPenjualan LANGUAGES CXX)
find_package(fmt CONFIG REQUIRED)
add_executable(laporan-penjualan laporan-penjualan.cpp)
target_link_libraries(laporan-penjualan PRIVATE fmt::fmt)cmake -B build -DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/laporan-penjualanToolchain itulah yang menyambungkan dua chapter terakhir: ia menyiapkan lokasi instalasi vcpkg sebagai tempat pencarian, sehingga find_package(fmt CONFIG REQUIRED) dari Chapter CMake Dependencies menemukan fmtConfig.cmake yang disiapkan vcpkg — dan bila proyek punya vcpkg.json, instalasi dependensinya bahkan dijalankan otomatis saat configure. Bagian CMakeLists.txt kita tidak mengetahui vcpkg sama sekali; ganti toolchain, dan proyek yang sama build dari sumber lain.
Aplikasi Kita, Dua Wajah #
Program yang dibangun oleh CMakeLists di atas menggunakan fmt untuk menyusun tabel laporan. Untuk memverifikasi logikanya di lingkungan praktikum, kita jalankan versi iostream-nya — identik strukturnya, hanya format teks yang ditulis dengan iomanip:
#include <iomanip>
#include <iostream>
#include <string>
#include <vector>
struct Penjualan {
std::string produk;
int unit;
int harga;
};
int main() {
std::vector<Penjualan> data {
{"Keyboard", 12, 350000},
{"Mouse", 30, 150000},
{"Monitor", 5, 1750000}
};
std::cout << std::left << std::setw(12) << "Produk"
<< std::right << std::setw(6) << "Unit"
<< std::setw(16) << "Pendapatan" << "\n";
int total = 0;
for (const Penjualan& p : data) {
int pendapatan = p.unit * p.harga;
total += pendapatan;
std::cout << std::left << std::setw(12) << p.produk
<< std::right << std::setw(6) << p.unit
<< std::setw(16) << pendapatan << "\n";
}
std::cout << std::setfill('-') << std::setw(34) << "" << std::setfill(' ') << "\n";
std::cout << std::left << std::setw(18) << "Total" << std::right
<< std::setw(16) << total << "\n";
return 0;
}Output yang Dihasilkan:
Produk Unit Pendapatan
Keyboard 12 4200000
Mouse 30 4500000
Monitor 5 8750000
----------------------------------
Total 17450000Versi fmt memformat tabel yang sama dengan spesifikasi mini-language fmt — {:<12}, {:>6}, {:>16} — dan itulah satu-satunya bagian yang berbeda:
#include <fmt/core.h>
int main() {
fmt::print("{:<12}{:>6}{:>16}\n", "Produk", "Unit", "Pendapatan");
fmt::print("{:-^34}\n", "");
fmt::print("{:<18}{:>16}\n", "Total", 17450000);
return 0;
}Mengganti iostream dengan fmt bukan sekadar gaya: format string yang bisa diperiksa saat kompilasi, sintaks yang dekat dengan Python, dan performa pencetakan yang lebih baik adalah alasan fmt menjadi library paling populer untuk pekerjaan ini — dan port pertama yang biasa dicoba di vcpkg.
Kapan vcpkg Cocok #
- Tim campuran Windows/Linux/macOS — triplet menyeragamkan dependensi lintas platform, dan integrasi Visual Studio/VS Code bekerja tanpa konfigurasi tambahan.
- Proyek berbasis CMake — toolchain resminya paling mulus di antara manajer paket C++.
- Butuh kecepatan build tim — binary caching menyimpan hasil build library, sehingga mesin kedua tidak mengompilasi ulang dari nol.
Sebaliknya, bila tim memakai build system selain CMake, atau butuh kontrol sangat halus atas opsi build dan pencampuran versi, pesaing utamanya menarik untuk dilihat — itulah Conan, topik chapter berikutnya.
Referensi: Dokumentasi vcpkg , Manifest mode .