| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- cmake_minimum_required(VERSION 3.16)
- project(mel_band_roformer_cpp VERSION 1.0.0 LANGUAGES CXX)
- set(CMAKE_CXX_STANDARD 17)
- set(CMAKE_CXX_STANDARD_REQUIRED ON)
- #================================================
- # Build Options
- #================================================
- option(GGML_CUDA "Enable CUDA backend" ON)
- option(MBR_BUILD_TESTS "Build tests" OFF)
- option(MBR_BUILD_CLI "Build CLI application" ON)
- #================================================
- # Dependencies - GGML (Flexible Resolution)
- #================================================
- # Strategy: Allow ggml to be shared across multiple projects
- # 1. Check if ggml target already exists (e.g., from parent project like whisper.cpp)
- # 2. If not, try to find ggml via CMAKE_PREFIX_PATH or GGML_DIR
- # 3. If not found, use local ggml (submodule or sibling directory)
- if(NOT TARGET ggml)
- # Try to find ggml package first (for system-wide or parent project installation)
- find_package(ggml QUIET CONFIG)
-
- if(NOT ggml_FOUND)
- # ggml not found as package, look for source directory
- # Priority 1: GGML_DIR variable (explicitly set by user or parent project)
- # Priority 2: Submodule in ggml/
- # Priority 3: Sibling directory ../ggml
-
- if(DEFINED GGML_DIR)
- set(GGML_PATH "${GGML_DIR}")
- message(STATUS "Using GGML from GGML_DIR: ${GGML_PATH}")
- elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/ggml/CMakeLists.txt")
- set(GGML_PATH "${CMAKE_CURRENT_SOURCE_DIR}/ggml")
- message(STATUS "Using GGML from submodule: ${GGML_PATH}")
- elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../ggml/CMakeLists.txt")
- set(GGML_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../ggml")
- message(STATUS "Using GGML from sibling directory: ${GGML_PATH}")
- else()
- message(FATAL_ERROR
- "ggml not found. Please either:\n"
- " 1. Add ggml as submodule: git submodule add https://github.com/ggerganov/ggml.git\n"
- " 2. Clone ggml to parent directory: cd .. && git clone https://github.com/ggerganov/ggml.git\n"
- " 3. Set GGML_DIR to point to ggml source: cmake -DGGML_DIR=/path/to/ggml\n"
- " 4. Let parent project provide ggml target"
- )
- endif()
-
- # Add ggml as subdirectory
- add_subdirectory(${GGML_PATH} ggml EXCLUDE_FROM_ALL)
- else()
- message(STATUS "Using GGML from installed package")
- endif()
- else()
- message(STATUS "Using GGML target from parent project")
- endif()
- #================================================
- # Core Library
- #================================================
- set(MBR_SOURCES
- src/model.cpp
- src/utils.cpp
- src/inference.cpp
- )
- add_library(mel_band_roformer STATIC ${MBR_SOURCES})
- target_include_directories(mel_band_roformer PUBLIC
- $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
- $<INSTALL_INTERFACE:include>
- )
- target_include_directories(mel_band_roformer PRIVATE
- ${CMAKE_CURRENT_SOURCE_DIR}/src
- )
- target_link_libraries(mel_band_roformer PUBLIC ggml)
- if(GGML_CUDA AND TARGET ggml-cuda)
- target_link_libraries(mel_band_roformer PUBLIC ggml-cuda)
- endif()
- # Compiler options
- if(MSVC)
- target_compile_options(mel_band_roformer PRIVATE /W3 /utf-8)
- else()
- target_compile_options(mel_band_roformer PRIVATE -Wall -Wextra)
- endif()
- # OpenMP support
- find_package(OpenMP)
- if(OpenMP_CXX_FOUND)
- target_link_libraries(mel_band_roformer PUBLIC OpenMP::OpenMP_CXX)
- target_compile_definitions(mel_band_roformer PUBLIC USE_OPENMP)
- message(STATUS "OpenMP: ENABLED")
- else()
- message(STATUS "OpenMP: NOT FOUND")
- endif()
- #================================================
- # DLL Copy Helper (Windows)
- #================================================
- function(mbr_copy_ggml_dlls target_name)
- if(NOT WIN32)
- return()
- endif()
-
- set(GGML_DLL_TARGETS ggml ggml-base ggml-cpu ggml-cuda)
-
- foreach(dll_target ${GGML_DLL_TARGETS})
- if(TARGET ${dll_target})
- add_custom_command(TARGET ${target_name} POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy_if_different
- $<TARGET_FILE:${dll_target}>
- $<TARGET_FILE_DIR:${target_name}>
- COMMENT "Copying ${dll_target}.dll for ${target_name}"
- )
- endif()
- endforeach()
- endfunction()
- #================================================
- # CLI Application
- #================================================
- if(MBR_BUILD_CLI)
- # audio.cpp implements AudioFile utilities (using dr_wav)
- add_executable(mel_band_roformer-cli
- cli/main.cpp
- src/audio.cpp
- )
- target_link_libraries(mel_band_roformer-cli PRIVATE mel_band_roformer)
- target_include_directories(mel_band_roformer-cli PRIVATE
- src
- third_party
- )
-
- if(MSVC)
- target_compile_options(mel_band_roformer-cli PRIVATE /W3 /utf-8)
- endif()
-
- mbr_copy_ggml_dlls(mel_band_roformer-cli)
- endif()
- #================================================
- # Tests (Optional)
- #================================================
- if(MBR_BUILD_TESTS)
- enable_testing()
- add_subdirectory(tests)
- message(STATUS "Tests: ENABLED")
- else()
- message(STATUS "Tests: DISABLED (use -DMBR_BUILD_TESTS=ON to enable)")
- endif()
|