Install and use packages with CMake
This tutorial shows you how to create a C++ "Hello World" program that uses the fmt library with CMake and kmpkg. You'll install dependencies, configure, build, and run a simple application.
Prerequisites
For Windows users, Visual Studio's MSVC (Microsoft Visual C++ Compiler) is the required compiler for C++ development.
1 - Set up kmpkg
-
Clone the repository
The first step is to clone the kmpkg repository from GitHub. The repository contains scripts to acquire the kmpkg executable and a registry of curated open-source libraries maintained by the kmpkg community. To do this, run:
git clone https://github.com/kumose/kmpkg.gitThe kmpkg curated registry is a set of over 2,000 open-source libraries. These libraries have been validated by kmpkg's continuous integration pipelines to work together. While the kmpkg repository does not contain the source code for these libraries, it holds recipes and metadata to build and install them in your system.
-
Run the bootstrap script
Now that you have cloned the kmpkg repository, navigate to the
kmpkgdirectory and execute the bootstrap script:
- cmd
- powershell
- bash
cd kmpkg && bootstrap-kmpkg.bat
cd kmpkg; .\bootstrap-kmpkg.bat
cd kmpkg && ./bootstrap-kmpkg.sh
The bootstrap script performs prerequisite checks and downloads the kmpkg executable.
That's it! kmpkg is set up and ready to use.
2 - Set up the project
- Configure the
KMPKG_ROOTenvironment variable.
- bash
- cmd
- powershell
export KMPKG_ROOT=/path/to/kmpkg
export PATH=$KMPKG_ROOT:$PATH
Setting environment variables using the
exportcommand only affects the current shell session. To make this change permanent across sessions, add theexportcommand to your shell's profile script (e.g.,~/.bashrcor~/.zshrc).
set "KMPKG_ROOT=C:\path\to\kmpkg"
set PATH=%KMPKG_ROOT%;%PATH%
Setting environment variables in this manner only affects the current terminal session. To make these changes permanent across all sessions, set them through the Windows System Environment Variables panel.
$env:KMPKG_ROOT = "C:\path\to\kmpkg"
$env:PATH = "$env:KMPKG_ROOT;$env:PATH"
Setting environment variables in this manner only affects the current terminal session. To make these changes permanent across all sessions, set them through the Windows System Environment Variables panel.
Setting KMPKG_ROOT tells kmpkg where your kmpkg instance is located.
Adding it to PATH ensures you can run kmpkg commands directly from the shell.
-
Create the project directory.
mkdir helloworld && cd helloworld
3 - Add dependencies and project files
-
Create the manifest file and add the
fmtdependency.First, create a manifest file (
kmpkg.json) in your project's directory by running thekmpkg newcommand from within thehelloworlddirectory:kmpkg new --applicationNext, add the
fmtdependency:kmpkg add port fmtYour
kmpkg.jsonshould look like this:{
"dependencies": [
"fmt"
]
}This is your manifest file. kmpkg reads the manifest file to learn what dependencies to install and integrates with CMake to provide the dependencies required by your project.
The default
kmpkg-configuration.jsonfile introduces baseline constraints, specifying the minimum versions of dependencies that your project should use. While modifying this file is beyond the scope of this tutorial, it plays a crucial role in defining version constraints for your project's dependencies. Therefore, even though it's not strictly necessary for this tutorial, it's a good practice to addkmpkg-configuration.jsonto your source control to ensure version consistency across different development environments. -
Create the project files.
Create the
CMakeLists.txtfile with the following content:
cmake_minimum_required(VERSION 3.10)
project(HelloWorld)
find_package(fmt CONFIG REQUIRED)
add_executable(HelloWorld helloworld.cpp)
target_link_libraries(HelloWorld PRIVATE fmt::fmt)
Now, let's break down what each line in the CMakeLists.txt file does:
cmake_minimum_required(VERSION 3.10): Specifies that the minimum version of CMake required to build the project is 3.10. If the version of CMake installed on your system is lower than this, an error will be generated.project(HelloWorld): Sets the name of the project to "HelloWorld."find_package(fmt CONFIG REQUIRED): Looks for thefmtlibrary using its CMake configuration file. TheREQUIREDkeyword ensures that an error is generated if the package is not found.add_executable(HelloWorld helloworld.cpp): Adds an executable target named "HelloWorld," built from the source filehelloworld.cpp.target_link_libraries(HelloWorld PRIVATE fmt::fmt): Specifies that theHelloWorldexecutable should link against thefmtlibrary. ThePRIVATEkeyword indicates thatfmtis only needed for buildingHelloWorldand should not propagate to other dependent projects.
Create the helloworld.cpp file with the following content:
#include <fmt/core.h>
int main()
{
fmt::print("Hello World!\n");
return 0;
}
In this helloworld.cpp file, the <fmt/core.h> header is included for using the fmt library. The main() function then calls fmt::print() to output the "Hello World!" message to the console.
4 - Build and run the project
-
Run CMake configuration
CMake can automatically link libraries installed by kmpkg when
CMAKE_TOOLCHAIN_FILEis set to use kmpkg's custom toolchain. This can be acomplished using CMake presets files.Create the following files inside the
helloworlddirectory:CMakePresets.json
{
"version": 2,
"configurePresets": [
{
"name": "kmpkg",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "$env{KMPKG_ROOT}/scripts/buildsystems/kmpkg.cmake"
}
}
]
}
CMakeUserPresets.json
{
"version": 2,
"configurePresets": [
{
"name": "default",
"inherits": "kmpkg",
"environment": {
"KMPKG_ROOT": "<path to kmpkg>"
}
}
]
}
The CMakePresets.json file contains a single preset named "kmpkg", which
sets the CMAKE_TOOLCHAIN_FILE variable. The CMakeUserPresets.json file
sets the KMPKG_ROOT environment variable to point to the absolute path
containing your local installation of kmpkg. It is recommended to not check
CMakeUserPresets.json into version control systems.
Finally, configure the build using CMake:
cmake --preset=default
-
Build the project
Run:
cmake --build build -
Run the application
Finally, run the executable to see your application in action:
- bash
- powershell
./build/HelloWorld
Hello World!
.\build\HelloWorld.exe
Hello World!