# CMake Configuration Guide

This document provides comprehensive information about the CMake build system configuration for FIX-FastTrade, including available targets, build options, packaging configuration, and installation targets.

CMake Targets

The FIX-FastTrade project provides several CMake targets for different use cases:

Primary Targets

fix-fasttrade (Executable)

The main trading system executable with full optimizations.


# Build main executable only make fix-fasttrade

# Or with CMake directly cmake –build . –target fix-fasttrade

Target Properties: * Type: Executable * Output: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/fix-fasttrade * Sources: All infrastructure, FIX, model, service sources + main.cpp * Dependencies: Boost, QuickFIX, Threads, TBB (optional), spdlog (optional)

fix-fasttrade-core (Static Library)

Core functionality as a static library for integration with other projects.


# Build static library only make fix-fasttrade-core

# Or with CMake directly cmake –build . –target fix-fasttrade-core

Target Properties: * Type: Static Library * Output: ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/libfix-fasttrade-core.a * Sources: Infrastructure, FIX, model, service sources (excluding main.cpp) * Public Dependencies: Boost, QuickFIX, Threads, TBB (optional)

Test Targets

fix-fasttrade-tests (Test Executable)

Comprehensive test suite using Google Test framework.


# Build and run tests make test

# Build test executable only make fix-fasttrade-tests

# Run tests with verbose output ctest –verbose

Target Properties: * Type: Executable * Output: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/fix-fasttrade-tests * Sources: All test files from tests/ directory * Dependencies: Google Test, fix-fasttrade-core

Documentation Targets

docs (Documentation Generation)

Generate API documentation using Doxygen (requires Doxygen to be installed).


# Generate documentation make docs

# Or with CMake directly cmake –build . –target docs

Target Properties: * Type: Custom Target * Output: ${CMAKE_BINARY_DIR}/docs/html/ * Requirements: Doxygen must be found by CMake * Sources: All header files in include/, source files in src/, and README.md

Utility Targets

clean

Remove all build artifacts.


make clean

install

Install the built targets to the system.


make install # Or with CMake directly cmake –build . –target install

Build Options and Variables

Standard CMake Variables

CMAKE_BUILD_TYPE

Controls the build configuration and optimization level.


# Debug build (default for development) cmake .. -DCMAKE_BUILD_TYPE=Debug

# Release build (optimized for production) cmake .. -DCMAKE_BUILD_TYPE=Release

# Release with debug info cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo

# Minimum size release cmake .. -DCMAKE_BUILD_TYPE=MinSizeRel

Build Type Effects: * Debug: -O0 -g3 -DDEBUG -fsanitize=address -fno-omit-frame-pointer * Release: -O3 -march=native -mtune=native -flto -funroll-loops -ffast-math -DNDEBUG * RelWithDebInfo: Release optimizations + debug symbols * MinSizeRel: Size-optimized release build

CMAKE_CXX_STANDARD

C++ standard version (fixed to C++17 for this project).


# This is set automatically, but can be overridden cmake .. -DCMAKE_CXX_STANDARD=20

CMAKE_INSTALL_PREFIX

Installation directory prefix.


# Install to custom location cmake .. -DCMAKE_INSTALL_PREFIX=/opt/fix-fasttrade

# Install to user directory cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/fix-fasttrade

Output Directory Variables

CMAKE_RUNTIME_OUTPUT_DIRECTORY

Directory for executable files (default: ${CMAKE_BINARY_DIR}/bin).


cmake .. -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/custom/bin/path

CMAKE_LIBRARY_OUTPUT_DIRECTORY

Directory for shared library files (default: ${CMAKE_BINARY_DIR}/lib).


cmake .. -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/custom/lib/path

CMAKE_ARCHIVE_OUTPUT_DIRECTORY

Directory for static library files (default: ${CMAKE_BINARY_DIR}/lib).


cmake .. -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=/custom/lib/path

Compiler-Specific Options

GCC/Clang Options


# Custom compiler flags cmake .. -DCMAKE_CXX_FLAGS=”-Wall -Wextra -O2”

# Link-time optimization cmake .. -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON

# Address sanitizer (Debug builds) cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS=”-fsanitize=address”

MSVC Options


# Custom MSVC flags cmake .. -DCMAKE_CXX_FLAGS=”/W4 /O2”

# Multi-processor compilation cmake .. -DCMAKE_CXX_FLAGS=”/MP”

Platform-Specific Options

macOS Options


# Target specific macOS version cmake .. -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0

# Target specific architecture cmake .. -DCMAKE_OSX_ARCHITECTURES=arm64

# Universal binary (Intel + Apple Silicon) cmake .. -DCMAKE_OSX_ARCHITECTURES=”x86_64;arm64”

Windows Options


# Target specific Windows version cmake .. -DCMAKE_SYSTEM_VERSION=10.0

# Use specific Visual Studio generator cmake .. -G “Visual Studio 16 2019” -A x64

Dependency Configuration

Boost Configuration


# Specify Boost root directory cmake .. -DBOOST_ROOT=/usr/local/boost

# Use specific Boost version cmake .. -DBoost_NO_SYSTEM_PATHS=ON -DBOOST_ROOT=/opt/boost_1_82_0

# Disable specific Boost components cmake .. -DBoost_NO_BOOST_CMAKE=ON

QuickFIX Configuration


# Specify QuickFIX installation path cmake .. -DQUICKFIX_ROOT=/usr/local/quickfix

# Use QuickFIX from submodule cmake .. -DQUICKFIX_INCLUDE_DIR=third_party/quickfix/include

-DQUICKFIX_LIBRARY=third_party/quickfix/lib/libquickfix.a

Optional Dependencies


# Enable Intel TBB cmake .. -DTBB_ROOT=/opt/intel/tbb

# Enable Google Benchmark cmake .. -Dbenchmark_ROOT=/usr/local/benchmark

# Enable spdlog cmake .. -Dspdlog_ROOT=/usr/local/spdlog

Build Configuration Examples

Development Build

Optimized for fast compilation and debugging.


mkdir -p build-debug && cd build-debug cmake ..

-DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_CXX_FLAGS=”-Wall -Wextra -g3”

make -j$(nproc)

Production Release Build

Fully optimized for maximum performance.


mkdir -p build-release && cd build-release cmake ..

-DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DCMAKE_CXX_FLAGS=”-O3 -march=native -mtune=native -flto”

make -j$(nproc)

Cross-Platform Release Build

Optimized but portable across different CPUs.


mkdir -p build-portable && cd build-portable cmake ..

-DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=”-O2 -mtune=generic”

make -j$(nproc)

Profiling Build

Optimized with profiling information.


mkdir -p build-profile && cd build-profile cmake ..

-DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_CXX_FLAGS=”-O2 -g -fno-omit-frame-pointer”

make -j$(nproc)

Static Analysis Build

Build with static analysis tools enabled.


mkdir -p build-analysis && cd build-analysis cmake ..

-DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_CLANG_TIDY=”clang-tidy;-checks=*” -DCMAKE_CXX_CPPCHECK=”cppcheck;–enable=all”

make -j$(nproc)

Sanitizer Builds

Builds with various sanitizers for debugging.


# Address Sanitizer mkdir -p build-asan && cd build-asan cmake ..

-DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS=”-fsanitize=address -fno-omit-frame-pointer”

# Thread Sanitizer mkdir -p build-tsan && cd build-tsan cmake ..

-DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS=”-fsanitize=thread”

# Memory Sanitizer mkdir -p build-msan && cd build-msan cmake ..

-DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS=”-fsanitize=memory”

Advanced Build Configurations

Custom Toolchain Build

Using a specific compiler toolchain.


# Create toolchain file (toolchain-gcc11.cmake) cat > toolchain-gcc11.cmake << EOF set(CMAKE_C_COMPILER gcc-11) set(CMAKE_CXX_COMPILER g++-11) set(CMAKE_CXX_FLAGS “-std=c++17 -Wall -Wextra”) EOF

# Use custom toolchain cmake .. -DCMAKE_TOOLCHAIN_FILE=toolchain-gcc11.cmake

Ninja Build System

Using Ninja instead of Make for faster builds.


# Generate Ninja build files cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release

# Build with Ninja ninja -j$(nproc)

# Build specific target ninja fix-fasttrade

Multi-Configuration Build

Using Visual Studio or Xcode generators.


# Visual Studio (Windows) cmake .. -G “Visual Studio 16 2019” -A x64

# Build Release configuration cmake –build . –config Release

# Build Debug configuration cmake –build . –config Debug

# Xcode (macOS) cmake .. -G Xcode cmake –build . –config Release

Installation Configuration

Install Targets

The CMake configuration defines several install targets:

Executables


install(TARGETS fix-fasttrade fix-fasttrade-core

RUNTIME DESTINATION bin # Executables LIBRARY DESTINATION lib # Shared libraries ARCHIVE DESTINATION lib # Static libraries

)

Header Files


install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/

DESTINATION include FILES_MATCHING PATTERN “.h” PATTERN “.hpp”

)

Configuration Files


install(DIRECTORY ${CMAKE_SOURCE_DIR}/config/

DESTINATION config FILES_MATCHING PATTERN “.json” PATTERN “.xml” PATTERN “*.conf”

)

Documentation


install(DIRECTORY ${CMAKE_BINARY_DIR}/docs/html/

DESTINATION docs OPTIONAL

)

Installation Examples

System-Wide Installation


# Build and install to /usr/local cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local make -j$(nproc) sudo make install

User Installation


# Install to user directory cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/.local make -j$(nproc) make install

Custom Installation


# Install to custom directory cmake .. -DCMAKE_INSTALL_PREFIX=/opt/fix-fasttrade make -j$(nproc) sudo make install

Component-Specific Installation


# Install only runtime components cmake –build . –target install –component Runtime

# Install only development components cmake –build . –target install –component Development

Packaging Configuration (CPack)

FIX-FastTrade includes comprehensive CPack configuration for creating distribution packages.

Package Generators

The following package formats are supported:

  • ZIP: Cross-platform archive

  • TGZ: Compressed tar archive

  • DEB: Debian/Ubuntu packages

  • RPM: Red Hat/CentOS/Fedora packages

Package Configuration Variables


set(CPACK_GENERATOR “ZIP;TGZ;DEB;RPM”) set(CPACK_PACKAGE_NAME “FIX-FastTrade”) set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) set(CPACK_PACKAGE_DESCRIPTION “Ultra-low latency FIX protocol trading system”) set(CPACK_PACKAGE_CONTACT “FIX-FastTrade Team”) set(CPACK_RESOURCE_FILE_LICENSE “${CMAKE_SOURCE_DIR}/LICENSE”) set(CPACK_RESOURCE_FILE_README “${CMAKE_SOURCE_DIR}/README.md”)

Debian Package Configuration


set(CPACK_DEBIAN_PACKAGE_DEPENDS “libboost-all-dev (>= 1.71)”) set(CPACK_DEBIAN_PACKAGE_SECTION “finance”)

RPM Package Configuration


set(CPACK_RPM_PACKAGE_REQUIRES “boost >= 1.71”) set(CPACK_RPM_PACKAGE_GROUP “Applications/Finance”)

Creating Packages

Create All Package Types


# Build the project first make -j$(nproc)

# Create packages cpack

Create Specific Package Types


# Create only DEB package cpack -G DEB

# Create only RPM package cpack -G RPM

# Create only ZIP archive cpack -G ZIP

Custom Package Configuration


# Override package name cpack -D CPACK_PACKAGE_NAME=”CustomFIXTrade”

# Override version cpack -D CPACK_PACKAGE_VERSION=”2.1.0”

# Create package in specific directory cpack –config CPackConfig.cmake -B /tmp/packages

Package Contents

Each package includes:

  • Executables: fix-fasttrade binary

  • Libraries: libfix-fasttrade-core.a static library

  • Headers: All public header files from include/

  • Configuration: Example configuration files from config/

  • Documentation: Generated API documentation (if available)

  • License: Project license file

  • README: Project documentation

Doxygen Configuration

Doxygen Integration

The CMake configuration automatically integrates with Doxygen for API documentation generation.

Doxygen Variables


set(DOXYGEN_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/docs) set(DOXYGEN_GENERATE_HTML YES) set(DOXYGEN_GENERATE_LATEX NO) set(DOXYGEN_EXTRACT_ALL YES) set(DOXYGEN_EXTRACT_PRIVATE YES) set(DOXYGEN_EXTRACT_STATIC YES) set(DOXYGEN_USE_MDFILE_AS_MAINPAGE ${CMAKE_SOURCE_DIR}/README.md) set(DOXYGEN_EXCLUDE_PATTERNS /third_party/ /build/)

Generating Documentation


# Generate documentation (requires Doxygen) make docs

# Or with CMake directly cmake –build . –target docs

# View generated documentation open build/docs/html/index.html # macOS xdg-open build/docs/html/index.html # Linux

Custom Doxygen Configuration


# Use custom Doxyfile cmake .. -DDOXYGEN_CONFIG_FILE=/path/to/custom/Doxyfile

# Override output directory cmake .. -DDOXYGEN_OUTPUT_DIRECTORY=/custom/docs/path

Configuration Summary

Build Information Display

The CMake configuration displays a comprehensive summary after configuration:

FIX-FastTrade Configuration Summary:

Version: 2.0.0 Build Type: Release C++ Standard: 17 Compiler: GNU 11.3.0 Boost Version: 1.82.0 QuickFIX: Found at /usr/local/include Intel TBB: TRUE Google Benchmark: TRUE Documentation: TRUE

Verification Commands

After configuration, verify the setup:


# Check available targets cmake –build . –target help

# Verify compiler flags cmake -LA | grep CMAKE_CXX_FLAGS

# Check install destinations cmake -LA | grep CMAKE_INSTALL

# Verify dependencies cmake -LA | grep -E “(Boost|QUICKFIX|TBB)”

Troubleshooting CMake Issues

Common Configuration Problems

Boost Not Found


# Solution 1: Specify Boost root cmake .. -DBOOST_ROOT=/usr/local/boost

# Solution 2: Use pkg-config export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH cmake ..

# Solution 3: Install Boost development packages sudo apt install libboost-all-dev # Ubuntu/Debian brew install boost # macOS

QuickFIX Not Found


# Solution 1: Initialize submodules git submodule update –init –recursive

# Solution 2: Specify QuickFIX paths cmake .. -DQUICKFIX_INCLUDE_DIR=/usr/local/include

-DQUICKFIX_LIBRARY=/usr/local/lib/libquickfix.a

# Solution 3: Build QuickFIX submodule manually cd third_party/quickfix mkdir build && cd build cmake .. && make -j$(nproc)

Compiler Version Issues


# Check compiler version gcc –version clang –version

# Use specific compiler cmake .. -DCMAKE_C_COMPILER=gcc-11 -DCMAKE_CXX_COMPILER=g++-11

# Update compiler (Ubuntu) sudo apt install gcc-11 g++-11 sudo update-alternatives –install /usr/bin/gcc gcc /usr/bin/gcc-11 100

CMake Version Issues


# Check CMake version cmake –version

# Update CMake (Ubuntu) sudo apt remove cmake pip install cmake

# Update CMake (macOS) brew upgrade cmake

This comprehensive CMake configuration guide provides all the information needed to build, configure, and package FIX-FastTrade across different platforms and use cases.