CMakeLists.txt 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. cmake_minimum_required(VERSION 3.17)
  2. project(bs_roformer_cpp VERSION 1.0.0 LANGUAGES CXX)
  3. set(CMAKE_CXX_STANDARD 17)
  4. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  5. #================================================
  6. # Build Options
  7. #================================================
  8. option(BSR_BUILD_CLI ON)
  9. option(BSR_BUILD_TESTS OFF)
  10. option(GGML_CUDA OFF) # cuda
  11. option(GGML_CUDA_FA ON) # leave it on
  12. option(GGML_CUDA_NO_VMM ON) # not needed
  13. option(GGML_HIP OFF) # rocm
  14. option(GGML_HIP_RCCL OFF) # not needed
  15. option(GGML_HIP_GRAPH OFF) # definitely not needed
  16. option(GGML_HIP_ROCWMMA_FATTN ON) # turn it off if you have rocm flash attention issues
  17. option(GGML_HIP_NO_VMM ON) # Breaks support in most cards right now leave it on
  18. option(GGML_CUDA_FA_ALL_QUANT ON) # leave it on
  19. #================================================
  20. # Dependencies - GGML (Flexible Resolution)
  21. #================================================
  22. if(NOT TARGET ggml)
  23. find_package(ggml QUIET CONFIG)
  24. if(NOT ggml_FOUND)
  25. if(DEFINED GGML_DIR)
  26. set(GGML_PATH "${GGML_DIR}")
  27. message(STATUS "Using GGML from GGML_DIR: ${GGML_PATH}")
  28. elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/ggml/CMakeLists.txt")
  29. set(GGML_PATH "${CMAKE_CURRENT_SOURCE_DIR}/ggml")
  30. message(STATUS "Using GGML from submodule: ${GGML_PATH}")
  31. elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../ggml/CMakeLists.txt")
  32. set(GGML_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../ggml")
  33. message(STATUS "Using GGML from sibling directory: ${GGML_PATH}")
  34. else()
  35. message(FATAL_ERROR
  36. "ggml not found. Please either:\n"
  37. " 1. Add ggml as submodule: git submodule add https://github.com/ggerganov/ggml.git\n"
  38. " 2. Clone ggml to parent directory: cd .. && git clone https://github.com/ggerganov/ggml.git\n"
  39. " 3. Set GGML_DIR to point to ggml source: cmake -DGGML_DIR=/path/to/ggml\n"
  40. " 4. Let parent project provide ggml target"
  41. )
  42. endif()
  43. add_subdirectory(${GGML_PATH} ggml EXCLUDE_FROM_ALL)
  44. else()
  45. message(STATUS "Using GGML from installed package")
  46. endif()
  47. else()
  48. message(STATUS "Using GGML target from parent project")
  49. endif()
  50. #================================================
  51. # Core Library
  52. #================================================
  53. set(BSR_SOURCES
  54. src/model.cpp
  55. src/utils.cpp
  56. src/inference.cpp
  57. )
  58. add_library(bs_roformer STATIC ${BSR_SOURCES})
  59. target_include_directories(bs_roformer PUBLIC
  60. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  61. $<INSTALL_INTERFACE:include>
  62. )
  63. target_include_directories(bs_roformer PRIVATE
  64. ${CMAKE_CURRENT_SOURCE_DIR}/src
  65. )
  66. target_link_libraries(bs_roformer PUBLIC ggml)
  67. if(GGML_CUDA AND TARGET ggml-cuda)
  68. find_package(CUDAToolkit REQUIRED)
  69. if(TARGET CUDA::cuda_driver)
  70. target_link_libraries(bs_roformer PUBLIC CUDA::cuda_driver)
  71. message(STATUS "Linked against CUDA driver stubs")
  72. endif()
  73. endif()
  74. target_compile_options(bs_roformer PRIVATE -Wall -Wextra)
  75. # OpenMP support
  76. find_package(OpenMP)
  77. if(OpenMP_CXX_FOUND)
  78. target_link_libraries(bs_roformer PUBLIC OpenMP::OpenMP_CXX)
  79. target_compile_definitions(bs_roformer PUBLIC USE_OPENMP)
  80. message(STATUS "OpenMP: ENABLED")
  81. else()
  82. message(STATUS "OpenMP: NOT FOUND")
  83. endif()
  84. #================================================
  85. # DLL Copy Helper (Windows)
  86. #================================================
  87. function(bsr_copy_ggml_runtime_dlls target_name)
  88. if(NOT WIN32)
  89. return()
  90. endif()
  91. if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.21")
  92. add_custom_command(TARGET ${target_name} POST_BUILD
  93. COMMAND ${CMAKE_COMMAND} -E copy_if_different
  94. $<TARGET_RUNTIME_DLLS:${target_name}>
  95. $<TARGET_FILE_DIR:${target_name}>
  96. COMMAND_EXPAND_LISTS
  97. COMMENT "Copying runtime DLLs for ${target_name}"
  98. )
  99. return()
  100. endif()
  101. set(ggml_dll_targets ggml ggml-base ggml-cpu ggml-cuda ggml-vulkan)
  102. set(runtime_dll_files)
  103. foreach(dll_target IN LISTS ggml_dll_targets)
  104. if(NOT TARGET ${dll_target})
  105. continue()
  106. endif()
  107. get_target_property(dll_target_type ${dll_target} TYPE)
  108. if(dll_target_type STREQUAL "SHARED_LIBRARY" OR dll_target_type STREQUAL "MODULE_LIBRARY")
  109. list(APPEND runtime_dll_files $<TARGET_FILE:${dll_target}>)
  110. endif()
  111. endforeach()
  112. if(runtime_dll_files)
  113. add_custom_command(TARGET ${target_name} POST_BUILD
  114. COMMAND ${CMAKE_COMMAND} -E copy_if_different
  115. ${runtime_dll_files}
  116. $<TARGET_FILE_DIR:${target_name}>
  117. COMMAND_EXPAND_LISTS
  118. COMMENT "Copying GGML runtime DLLs for ${target_name}"
  119. )
  120. endif()
  121. endfunction()
  122. #================================================
  123. # CLI Application
  124. #================================================
  125. if(BSR_BUILD_CLI)
  126. add_executable(bs_roformer-cli
  127. cli/main.cpp
  128. src/audio.cpp
  129. )
  130. target_link_libraries(bs_roformer-cli PRIVATE bs_roformer)
  131. target_include_directories(bs_roformer-cli PRIVATE
  132. src
  133. third_party
  134. ${CMAKE_SOURCE_DIR}/libav
  135. )
  136. # Link against libav libraries from submodule and system dependencies
  137. target_link_libraries(bs_roformer-cli PRIVATE
  138. ${CMAKE_SOURCE_DIR}/libav/libavformat/libavformat.a
  139. ${CMAKE_SOURCE_DIR}/libav/libavcodec/libavcodec.a
  140. ${CMAKE_SOURCE_DIR}/libav/libavresample/libavresample.a
  141. ${CMAKE_SOURCE_DIR}/libav/libavutil/libavutil.a
  142. z bz2
  143. )
  144. bsr_copy_ggml_runtime_dlls(bs_roformer-cli)
  145. endif()
  146. #================================================
  147. # Tests (Optional)
  148. #================================================
  149. if(BSR_BUILD_TESTS)
  150. enable_testing()
  151. add_subdirectory(tests)
  152. message(STATUS "Tests: ENABLED")
  153. else()
  154. message(STATUS "Tests: DISABLED (use -DBSR_BUILD_TESTS=ON to enable)")
  155. endif()