Building YAMS with GCC or Clang¶
Quick reference for building YAMS with either GCC or Clang toolchains.
Quick Start¶
Recommended: Use the setup.sh script (auto-detects compiler, handles Conan + Meson):
# Release build (default: Clang if available, else GCC)
./setup.sh Release
# Debug build with tests
./setup.sh Debug
# Force specific compiler
YAMS_COMPILER=gcc ./setup.sh Release
YAMS_COMPILER=clang ./setup.sh Release
Then compile:
meson compile -C build/release # or builddir for Debug
Prerequisites¶
Compiler (choose one): - GCC 13+ (recommended) or GCC 11+ (C++20 minimum) - Clang 16+ (recommended) or Clang 14+ (C++20 minimum)
Build tools:
# Ubuntu/Debian
sudo apt-get install -y build-essential cmake meson ninja-build pkg-config
# Optional but recommended for faster builds
sudo apt-get install -y ccache lld clang clang-tidy
System dependencies:
# Ubuntu/Debian
sudo apt-get install -y libssl-dev libcurl4-openssl-dev libsqlite3-dev \
protobuf-compiler libprotobuf-dev zlib1g-dev
# Fedora
sudo dnf install -y openssl-devel libcurl-devel sqlite-devel protobuf-devel zlib-devel
# Arch
sudo pacman -S openssl curl sqlite protobuf zlib
Conan:
pip install conan
conan profile detect --force
Manual Build (without setup.sh)¶
GCC¶
conan install . -of build/release -s build_type=Release \
-s compiler.cppstd=20 -b missing --build=qpdf/*
meson setup build/release \
--prefix /usr/local \
--native-file build/release/build-release/conan/conan_meson_native.ini \
--buildtype=release
meson compile -C build/release
Clang¶
conan install . -of build/release -s build_type=Release \
-s compiler=clang -s compiler.version=18 -s compiler.libcxx=libstdc++11 \
-s compiler.cppstd=20 -b missing --build=qpdf/*
CC=clang CXX=clang++ meson setup build/release \
--prefix /usr/local \
--native-file build/release/build-release/conan/conan_meson_native.ini \
--buildtype=release
meson compile -C build/release
Note: Clang automatically uses LLD linker if available (faster linking).
Common Options¶
Enable tests:
./setup.sh Debug
meson configure builddir -Dbuild-tests=true
meson test -C builddir
Disable optional features:
YAMS_DISABLE_ONNX=true ./setup.sh Release
YAMS_DISABLE_PDF=true ./setup.sh Release
YAMS_DISABLE_SYMBOL_EXTRACTION=true ./setup.sh Release
Code coverage:
./setup.sh Debug --coverage
meson test -C builddir
gcovr --html --html-details -o builddir/coverage.html
libc++ hardening (Clang only):
YAMS_LIBCXX_HARDENING=fast ./setup.sh Debug # ~5% overhead, recommended
YAMS_LIBCXX_HARDENING=extensive ./setup.sh Debug # ~10-20% overhead
Troubleshooting¶
qpdf linking error: “recompile with -fPIC”¶
Error:
/usr/bin/ld: libqpdf.a(...): relocation R_X86_64_PC32 against symbol `...` can not be used when making a shared object; recompile with -fPIC
Cause: Cached qpdf package was built without -fPIC (required for plugins).
Fix:
# Remove cached qpdf packages
conan remove 'qpdf/*' -c
# Rebuild with forced qpdf rebuild
./setup.sh Release
# or manually:
conan install . -of build/release -s build_type=Release \
-s compiler.cppstd=20 -b missing --build=qpdf/*
Clang: “cannot find -lstdc++”¶
Error:
/usr/bin/ld: cannot find -lstdc++: No such file or directory
Cause: Clang trying to use libstdc++ but missing development files.
Fix (choose one):
-
Switch to GCC:
YAMS_COMPILER=gcc ./setup.sh Release -
Use Clang’s libc++ instead:
sudo apt-get install libc++-dev libc++abi-dev # Edit ~/.conan2/profiles/default: # Change: compiler.libcxx=libstdc++11 → compiler.libcxx=libc++ -
Install libstdc++ dev files:
sudo apt-get install libstdc++-13-dev
See: Conan Profiles
Missing dependencies¶
pkg-config errors:
pkg-config --list-all | grep -E "(sqlite|openssl|protobuf|libcurl)"
If missing, install development packages (see Prerequisites).
Old compiler version¶
GCC < 11 or Clang < 14:
Upgrade your compiler:
# Ubuntu
sudo apt-get install gcc-13 g++-13 clang-18
# Update alternatives (optional)
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100
ONNX disabled¶
Check configure output for “ONNX Runtime found”. If disabled:
# Enable in build
./setup.sh Release # ONNX enabled by default
# Or explicitly
conan install . -of build/release -s build_type=Release \
-o yams/*:enable_onnx=True -b missing
Compiler Comparison¶
| Feature | GCC 13+ | Clang 16+ |
|---|---|---|
| C++20 coroutines | ✓ | ✓ |
| std::format | ✓ | ✓ |
| Default linker | GNU ld | LLD (faster) |
| Hardening | -D_GLIBCXX_DEBUG |
libc++ modes |
| Diagnostics | Good | Better |
Both work equally well. Clang + LLD gives faster link times.
Advanced¶
Custom C++ standard:
# C++20 (default, widely supported)
YAMS_CPPSTD=20 ./setup.sh Release
# C++23 (optional, for constexpr containers - requires GCC 13+ or Clang 16+)
YAMS_CPPSTD=23 ./setup.sh Release
Note: YAMS detects C++23 features at compile-time via cpp23_features.hpp and uses them when available. C++20 is the baseline requirement.
Custom install prefix:
YAMS_INSTALL_PREFIX=/opt/yams ./setup.sh Release
LTO (Link Time Optimization):
# GCC
CC=gcc CXX=g++ CXXFLAGS="-flto" LDFLAGS="-flto" ./setup.sh Release
# Clang (ThinLTO)
CC=clang CXX=clang++ CXXFLAGS="-flto=thin" LDFLAGS="-flto=thin" ./setup.sh Release
Machine-specific optimizations:
CXXFLAGS="-march=native -mtune=native" ./setup.sh Release
Verification¶
# Check version
./build/release/tools/yams-cli/yams --version
# Quick test
echo "Hello, YAMS!" | ./build/release/tools/yams-cli/yams add -
# After install
yams --version
References¶
- Main Build Guide - Detailed build options
- Conan Documentation
- Meson Documentation
- GCC C++20 Status
- Clang C++ Status