# 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**: ```cmake 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**: ```cmake 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**: ```cmake 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**: ```cmake 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: ```cmake 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 ) ``` 2. **In your C++ code**, include the headers: ```cpp // For semver #include // For spline #include // For stb_dxt #include // 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: ```cmake # 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 $ $ ) ``` ## 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)