Saphira Linux · an AKADATA project

fmt — C++ formatting library

Use the fmt 12.1 C++ formatting library on Saphira Linux: include, link, format chrono types, ranges, and package your application into stage4.

Saphira, the Version 0 mascot
Technical preview

Saphira Linux

Saphira Linux has a home of its own

Saphira Linux is AKADATA’s source-built, musl/OpenRC server distribution for self-hosted infrastructure. Development, downloads, documentation, packages and the Dragon feature sets now live on the dedicated Saphira Linux website.

Visit Saphira Linux saphira.vm2.uk


Stack guide — fmt

fmt 12.1 — C++ formatting library

fmt is the modern C++ formatting library: fast, safe, and a direct replacement for printf and iostreams. It is installed as a system library on Saphira Linux and is available to any C++ project that links against it.

The library provides fmt::print, fmt::format, and compile‑time format‑string checking. It integrates with C++20 std::format where the compiler supports it.


Usage

Include and link

The headers are in the standard system include path. Link with -lfmt:

#include <fmt/core.h>

int main() {
    fmt::print("Hello, {}!\n", "Saphira Linux");

    std::string s = fmt::format("The answer is {}.\n", 42);
    fmt::print("{}", s);

    return 0;
}

Compile with GCC 16.1, matching the distribution baseline:

g++ -O3 -march=x86-64-v3 -std=c++20 -o /usr/local/bin/myapp myapp.cpp -lfmt

The -std=c++20 flag enables std::format support, but {fmt} works with C++14 and later. The system fmt is compiled with x86-64-v3 and O3, matching the rest of the distribution.


Features

Beyond printf

fmt supports positional arguments, named arguments, chrono formatting, range and tuple formatting, and user‑defined type formatters:

// Positional arguments
fmt::print("{1} comes before {0}\n", "second", "first");

// Chrono formatting
#include <fmt/chrono.h>
auto now = std::chrono::system_clock::now();
fmt::print("Date: {:%Y-%m-%d %H:%M:%S}\n", now);

// Format a vector
#include <fmt/ranges.h>
std::vector<int> v = {1, 2, 3, 4};
fmt::print("Vector: {}\n", v);  // Prints [1, 2, 3, 4]

For full documentation, see fmt.dev. The man page is available at man fmt.


Production

Package your fmt‑based application

If your application uses fmt, declare it as a dependency in your stage4 recipe. The package manager will ensure the library is present at build time and runtime:

# packages/myapp/recipe.sh
depends="fmt"
source="https://example.com/myapp-1.0.tar.gz"

When your recipe runs, the fmt headers and library are already on the system. Your binary links against the same fmt that ships with the distribution. No vendored copies, no submodules, no ABI surprises.