π 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:
1. audiolab_link_core_dependencies(target)¶
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
# )
2. audiolab_link_optional_dependencies(target)¶
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:
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:
FindFFTW3.cmake¶
Estrategia de bΓΊsqueda:
1. β
vcpkg (preferred)
2. β
Sistema (apt/brew/chocolatey)
3. β
Respeta $FFTW3_ROOT
Targets creados:
π 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"¶
β οΈ 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¶
- JUCE: https://juce.com/learn/documentation
- vcpkg: https://vcpkg.io/
- Intel IPP: https://www.intel.com/content/www/us/en/developer/tools/oneapi/ipp.html
- FFTW: http://www.fftw.org/
- CMake find_package: https://cmake.org/cmake/help/latest/command/find_package.html
π 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.