Skip to content

πŸ” CMake Dependency Integration

Sistema centralizado de gestiΓ³n de dependencias para AudioLab mediante CMake.


πŸ“‹ Contenido

03_03_02_cmake_integration/
β”œβ”€β”€ Dependencies.cmake          ← INCLUIR en CMakeLists.txt raΓ­z
β”œβ”€β”€ FindModules/                ← MΓ³dulos de bΓΊsqueda personalizados
β”‚   β”œβ”€β”€ FindJUCE.cmake
β”‚   β”œβ”€β”€ FindIPP.cmake
β”‚   └── FindFFTW3.cmake
└── README.md                   ← Este archivo

πŸš€ Uso BΓ‘sico

1. Incluir en CMakeLists.txt raΓ­z

cmake_minimum_required(VERSION 3.20)
project(AudioLab VERSION 1.0.0)

# ════════════════════════════════════════════════════════
# INCLUIR SISTEMA DE DEPENDENCIAS
# ════════════════════════════════════════════════════════

include(2 - FOUNDATION/03_INFRA/03_03_dependency_management/03_03_02_cmake_integration/Dependencies.cmake)

# ════════════════════════════════════════════════════════
# USAR EN TUS TARGETS
# ════════════════════════════════════════════════════════

add_executable(mi_plugin src/main.cpp)

# OpciΓ³n 1: Helper function (recomendado)
audiolab_link_core_dependencies(mi_plugin)
audiolab_link_optional_dependencies(mi_plugin)

# OpciΓ³n 2: Manual
target_link_libraries(mi_plugin
    PRIVATE
        juce::juce_core
        juce::juce_audio_processors
        fmt::fmt
        spdlog::spdlog
)

2. Ejecutar CMake

# Configurar proyecto
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=vcpkg/scripts/buildsystems/vcpkg.cmake

# Compilar
cmake --build build --config Release

πŸ“¦ Dependencias Gestionadas

βœ… Obligatorias (siempre requeridas)

LibrerΓ­a VersiΓ³n MΓ­nima PropΓ³sito InstalaciΓ³n
JUCE 7.0 Framework de audio vcpkg install juce
fmt 9.0 String formatting vcpkg install fmt
spdlog 1.11 Logging system vcpkg install spdlog

⚑ Opcionales (performance/features)

LibrerΓ­a PropΓ³sito InstalaciΓ³n Variable CMake
Intel IPP DSP optimizado Intel oneAPI AUDIOLAB_USE_IPP=ON
FFTW3 FFT rΓ‘pido vcpkg install fftw3 AUDIOLAB_USE_FFTW=ON
nlohmann-json Presets JSON vcpkg install nlohmann-json Auto-detectado

πŸ§ͺ Testing/Development (condicionales)

LibrerΓ­a PropΓ³sito InstalaciΓ³n CondiciΓ³n
Catch2 Unit testing vcpkg install catch2 AUDIOLAB_BUILD_TESTS=ON
Google Benchmark Performance vcpkg install benchmark AUDIOLAB_BUILD_BENCHMARKS=ON

πŸ”§ Variables CMake

Control de Dependencias Opcionales

# Habilitar Intel IPP
cmake -B build -DAUDIOLAB_USE_IPP=ON

# Habilitar FFTW3
cmake -B build -DAUDIOLAB_USE_FFTW=ON

# Habilitar testing (busca Catch2)
cmake -B build -DAUDIOLAB_BUILD_TESTS=ON

# Habilitar benchmarks (busca Google Benchmark)
cmake -B build -DAUDIOLAB_BUILD_BENCHMARKS=ON

Variables de Salida (detectadas automΓ‘ticamente)

DespuΓ©s de include(Dependencies.cmake), estas variables estΓ‘n disponibles:

# Flags booleanos
AUDIOLAB_HAS_IPP        # TRUE si Intel IPP encontrado
AUDIOLAB_HAS_FFTW       # TRUE si FFTW3 encontrado
AUDIOLAB_HAS_JSON       # TRUE si nlohmann-json encontrado

# Versiones
JUCE_VERSION            # "7.0.5"
fmt_VERSION             # "9.1.0"
spdlog_VERSION          # "1.11.0"
IPP_VERSION             # "2021.7" (si encontrado)

🎯 Helper Functions

El sistema provee dos funciones para simplificar linking:

AΓ±ade dependencias obligatorias al target:

add_executable(mi_app src/main.cpp)
audiolab_link_core_dependencies(mi_app)

# Equivale a:
# target_link_libraries(mi_app PRIVATE
#     juce::juce_core
#     juce::juce_audio_basics
#     juce::juce_audio_devices
#     juce::juce_audio_processors
#     fmt::fmt
#     spdlog::spdlog
# )

AΓ±ade dependencias opcionales si estΓ‘n disponibles:

audiolab_link_optional_dependencies(mi_app)

# Si IPP encontrado:
#   target_link_libraries(mi_app PRIVATE IPP::IPP)
#   target_compile_definitions(mi_app PRIVATE AUDIOLAB_HAS_IPP=1)
#
# Si FFTW encontrado:
#   target_link_libraries(mi_app PRIVATE FFTW3::FFTW3f)
#   target_compile_definitions(mi_app PRIVATE AUDIOLAB_HAS_FFTW=1)
#
# Si JSON encontrado:
#   target_link_libraries(mi_app PRIVATE nlohmann_json::nlohmann_json)
#   target_compile_definitions(mi_app PRIVATE AUDIOLAB_HAS_JSON=1)

πŸ“‚ Find Modules Personalizados

FindJUCE.cmake

Estrategia de bΓΊsqueda: 1. βœ… Intenta find_package(JUCE CONFIG) (funciona con vcpkg) 2. βœ… Busca en paths comunes: - Windows: C:/JUCE, C:/Program Files/JUCE - macOS: /Applications/JUCE, ~/JUCE - Linux: /opt/JUCE, ~/JUCE 3. βœ… Respeta $JUCE_DIR / $JUCE_ROOT

Targets creados:

juce::juce_core
juce::juce_audio_basics
juce::juce_audio_processors
# ... (todos los mΓ³dulos JUCE)

FindIPP.cmake

Estrategia de bΓΊsqueda: 1. βœ… Respeta $IPPROOT (instalaciΓ³n estΓ‘ndar Intel) 2. βœ… Busca en oneAPI toolkit: - Windows: C:/Program Files (x86)/Intel/oneAPI/ipp/latest - Linux/macOS: /opt/intel/oneapi/ipp/latest

Target creado:

IPP::IPP  # Incluye: ippcore, ipps, ippvm

FindFFTW3.cmake

Estrategia de bΓΊsqueda: 1. βœ… vcpkg (preferred) 2. βœ… Sistema (apt/brew/chocolatey) 3. βœ… Respeta $FFTW3_ROOT

Targets creados:

FFTW3::FFTW3   # Double precision
FFTW3::FFTW3f  # Single precision (PARA AUDIO) ⭐


πŸ” Troubleshooting

❌ Error: "JUCE Framework NO encontrado"

# SoluciΓ³n 1: Instalar via vcpkg
vcpkg install juce

# SoluciΓ³n 2: Especificar path manualmente
cmake -B build -DJUCE_DIR=/path/to/juce

# SoluciΓ³n 3: Variable de entorno
export JUCE_DIR=/path/to/juce
cmake -B build

❌ Error: "fmt NO encontrado"

# Instalar via vcpkg
vcpkg install fmt spdlog

⚠️ Warning: "Intel IPP NO encontrado"

No es error! IPP es opcional. El warning solo informa que se usarΓ‘n implementaciones estΓ‘ndar.

# Para habilitar IPP:
# 1. Descargar Intel oneAPI (gratis): https://www.intel.com/content/www/us/en/developer/tools/oneapi/ipp.html
# 2. Instalar IPP component
# 3. Configurar:
cmake -B build -DAUDIOLAB_USE_IPP=ON

πŸ”§ Debug: Ver quΓ© se encontrΓ³

# Ejecutar CMake con verbose
cmake -B build --trace-expand 2>&1 | grep -E "FOUND|VERSION"

# O inspeccionar cache
cmake -B build -LAH | grep -E "JUCE|fmt|spdlog|IPP|FFTW"

πŸ“Š Salida de CMake

Al incluir Dependencies.cmake, verΓ‘s:

═══════════════════════════════════════════════
πŸ” Buscando dependencias de AudioLab
═══════════════════════════════════════════════
πŸ“‚ Module path: .../FindModules

🎡 Buscando JUCE Framework...
   βœ“ JUCE encontrado: v7.0.5
   πŸ“ Path: C:/vcpkg/installed/x64-windows
   βœ“ juce::juce_core disponible
   βœ“ juce::juce_audio_processors disponible

πŸ“ Buscando sistema de logging...
   βœ“ fmt encontrado: v9.1.0
   βœ“ spdlog encontrado: v1.11.0

πŸ§ͺ Buscando framework de testing...
   βœ“ Catch2 encontrado: v3.3.2

⚑ Buscando Intel IPP...
   ⚠️  Intel IPP NO encontrado
   Operaciones DSP usarΓ‘n implementaciones estΓ‘ndar

═══════════════════════════════════════════════
πŸ“¦ Resumen de Dependencias:

   Obligatorias:
      βœ… JUCE Framework:    v7.0.5
      βœ… fmt:               v9.1.0
      βœ… spdlog:            v1.11.0

   Opcionales encontradas:
      βœ… Catch2:            v3.3.2

βœ… Dependencias configuradas correctamente
═══════════════════════════════════════════════

πŸ’‘ Helper functions disponibles:
   β€’ audiolab_link_core_dependencies(target)
   β€’ audiolab_link_optional_dependencies(target)

🎯 Ejemplo Completo

# CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(AudioLab)

# ════════════════════════════════════════════════════════
# OPCIONES
# ════════════════════════════════════════════════════════

option(AUDIOLAB_BUILD_TESTS "Build tests" ON)
option(AUDIOLAB_USE_IPP "Use Intel IPP" OFF)
option(AUDIOLAB_USE_FFTW "Use FFTW3" OFF)

# ════════════════════════════════════════════════════════
# DEPENDENCIAS
# ════════════════════════════════════════════════════════

include(Dependencies.cmake)

# ════════════════════════════════════════════════════════
# PLUGIN
# ════════════════════════════════════════════════════════

add_library(MyCompressor SHARED
    src/PluginProcessor.cpp
    src/PluginEditor.cpp
)

# Link dependencies
audiolab_link_core_dependencies(MyCompressor)
audiolab_link_optional_dependencies(MyCompressor)

# ════════════════════════════════════════════════════════
# TESTS (si habilitados)
# ════════════════════════════════════════════════════════

if(AUDIOLAB_BUILD_TESTS AND TARGET Catch2::Catch2WithMain)
    add_executable(CompressorTests
        tests/test_compressor.cpp
    )

    target_link_libraries(CompressorTests
        PRIVATE
            MyCompressor
            Catch2::Catch2WithMain
    )
endif()

πŸ“š Recursos


πŸ”„ ActualizaciΓ³n de Dependencias

# Actualizar todas las dependencias vcpkg
vcpkg upgrade --no-dry-run

# O actualizar especΓ­fica
vcpkg upgrade juce

# Luego re-configurar CMake
cmake -B build --fresh

βœ… Sistema listo para usar!

Simplemente incluye Dependencies.cmake en tu CMakeLists.txt raΓ­z y todas las dependencias se configurarΓ‘n automΓ‘ticamente.