OrcaSlicer/deps_src/README_CMAKE_INTERFACES.md
SoftFever 883607e1d4
Refactor folder (#10475)
Move many third-party components' source codes from the src folder to a new folder called deps_src. The goal is to make the code structure clearer and easier to navigate.
2025-08-22 20:02:26 +08:00

3.3 KiB

CMake Interfaces for deps_src Libraries

This document describes how to use the CMake interface libraries created for the subdirectories in deps_src/.

Available Libraries

1. semver (Static Library)

  • Type: Static library
  • Target: semver or semver::semver
  • Headers: semver.h
  • Usage:
target_link_libraries(your_target PRIVATE semver)
# or
target_link_libraries(your_target PRIVATE semver::semver)

2. hints (Interface Library)

  • Type: Interface library (header-only)
  • Target: hints
  • Utility: hintsToPot executable
  • Usage:
target_link_libraries(your_target PRIVATE hints)

3. spline (Interface Library)

  • Type: Interface library (header-only)
  • Target: spline or spline::spline
  • Headers: spline.h
  • Usage:
target_link_libraries(your_target PRIVATE spline)
# or
target_link_libraries(your_target PRIVATE spline::spline)

4. stb_dxt (Interface Library)

  • Type: Interface library (header-only)
  • Target: stb_dxt or stb_dxt::stb_dxt
  • Headers: stb_dxt.h
  • Usage:
target_link_libraries(your_target PRIVATE stb_dxt)
# or
target_link_libraries(your_target PRIVATE stb_dxt::stb_dxt)

How to Use in Your Project

From within the OrcaSlicer src/ directory:

  1. In your CMakeLists.txt, simply link the library:
add_executable(my_app main.cpp)
target_link_libraries(my_app 
    PRIVATE 
        semver::semver      # For version parsing
        spline::spline      # For spline interpolation
        stb_dxt::stb_dxt    # For DXT texture compression
        hints               # For hints functionality
)
  1. In your C++ code, include the headers:
// For semver
#include <semver.h>

// For spline
#include <spline.h>

// For stb_dxt
#include <stb_dxt.h>

// Use the libraries as documented in their respective headers

Benefits of This Approach

  1. Modern CMake: Uses target-based CMake with proper INTERFACE/PUBLIC/PRIVATE visibility
  2. Proper Include Paths: Automatically sets up include directories
  3. Namespace Aliases: Provides namespaced aliases (e.g., spline::spline) for clarity
  4. Position Independent Code: Static libraries are built with -fPIC for compatibility
  5. Install Support: Libraries can be installed and used by external projects
  6. Build/Install Interface: Separates build-time and install-time include paths

Example Integration

Here's a complete example of using these libraries in a new component:

# In src/mycomponent/CMakeLists.txt
add_library(mycomponent STATIC
    mycomponent.cpp
    mycomponent.h
)

target_link_libraries(mycomponent
    PUBLIC
        semver::semver  # Version handling is part of public API
    PRIVATE
        spline::spline  # Used internally for interpolation
        stb_dxt::stb_dxt # Used internally for texture compression
)

target_include_directories(mycomponent
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
        $<INSTALL_INTERFACE:include>
)

Notes

  • All header-only libraries use the INTERFACE library type, which means they don't produce any binaries
  • The semver library produces a static library that will be linked into your target
  • The hints project also produces a hintsToPot executable utility
  • All libraries require at least C++11 (some require C++17)