From 0650b14ba17f221d9ef65cd8f59028caf6c917a2 Mon Sep 17 00:00:00 2001 From: Tabitha Cromarty Date: Fri, 21 Nov 2025 00:14:06 +0000 Subject: [PATCH] Fix MacOS 12 crashes and codesigning issues (#262) * Refactor, fix codesigning, generate debug package * Bundle libomp and Accelerate framework * Bump version numbers * Stop bundling Accelerate framework * Update whispercpp deps to 0.0.11-2 * Format cmake files --- .github/scripts/.package.zsh | 2 +- CMakeLists.txt | 2 +- README.md | 6 +- buildspec.json | 2 +- cmake/BuildWhispercpp.cmake | 171 +++-------------------------- cmake/BuildWhispercppHelpers.cmake | 142 ++++++++++++++++++++++++ cmake/FetchOnnxruntime.cmake | 12 +- cmake/common/ccache.cmake | 3 + cmake/macos/compilerconfig.cmake | 4 +- cmake/macos/helpers.cmake | 30 +++++ cmake/macos/xcode.cmake | 4 +- 11 files changed, 203 insertions(+), 175 deletions(-) create mode 100644 cmake/BuildWhispercppHelpers.cmake diff --git a/.github/scripts/.package.zsh b/.github/scripts/.package.zsh index 43c4ce7..044b894 100755 --- a/.github/scripts/.package.zsh +++ b/.github/scripts/.package.zsh @@ -242,7 +242,7 @@ ${_usage_host:-}" popd } - if [[ ${config} == Release ]] { + if [[ -f ${product_name}.plugin.dSYM ]] { log_group "Archiving ${product_name} Debug Symbols..." pushd ${project_root}/release/${config} XZ_OPT=-T0 tar "-${_tarflags}" ${project_root}/release/${output_name}-dSYMs.tar.xz ${product_name}.plugin.dSYM diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ba6ce8..550fa9a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -187,7 +187,7 @@ if(APPLE) add_custom_command( TARGET "${CMAKE_PROJECT_NAME}" POST_BUILD VERBATIM - COMMAND /usr/bin/codesign --force --verify --verbose --sign "${CODESIGN_IDENTITY}" + COMMAND /usr/bin/codesign --force --deep --verify --verbose --sign "${CODESIGN_IDENTITY}" "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${PROJECT_NAME}.plugin/Contents/MacOS/${PROJECT_NAME}") endif() diff --git a/README.md b/README.md index 42a542d..ec1fef6 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,9 @@ If you’re looking for a hosted desktop recording API, consider checking out [R [![GitHub stars](https://badgen.net/github/stars/locaal-ai/obs-localvocal)](https://GitHub.com/locaal-ai/obs-localvocal/stargazers/)
Download:
-[![Static Badge](https://img.shields.io/badge/Windows%20(generic)-0078d6?style=for-the-badge&logo=windows&logoColor=white)](https://github.com/locaal-ai/obs-localvocal/releases/download/0.5.1/obs-localvocal-0.5.1-windows-x64-generic-Installer.exe) [![Static Badge](https://img.shields.io/badge/Windows%20(NVidia)-0078d6?style=for-the-badge&logo=windows&logoColor=white)](https://github.com/locaal-ai/obs-localvocal/releases/download/0.5.1/obs-localvocal-0.5.1-windows-x64-nvidia-Installer.exe) [![Static Badge](https://img.shields.io/badge/Windows%20(AMD)-0078d6?style=for-the-badge&logo=windows&logoColor=white)](https://github.com/locaal-ai/obs-localvocal/releases/download/0.5.1/obs-localvocal-0.5.1-windows-x64-amd-Installer.exe) -[![Static Badge](https://img.shields.io/badge/mac%20Intel-000000?style=for-the-badge&logo=apple&logoColor=white)](https://github.com/locaal-ai/obs-localvocal/releases/download/0.5.1/obs-localvocal-0.5.1-macos-x86_64.pkg) [![Static Badge](https://img.shields.io/badge/mac%20M1/2/3-0a0a0a?style=for-the-badge&logo=apple&logoColor=white)](https://github.com/locaal-ai/obs-localvocal/releases/download/0.5.1/obs-localvocal-0.5.1-macos-arm64.pkg) -[![Static Badge](https://img.shields.io/badge/Linux%20(generic)-FCC624?style=for-the-badge&logo=linux&logoColor=black)](https://github.com/locaal-ai/obs-localvocal/releases/download/0.5.1/obs-localvocal-0.5.1-generic-x86_64-linux-gnu.deb) [![Static Badge](https://img.shields.io/badge/Linux%20(NVidia)-FCC624?style=for-the-badge&logo=linux&logoColor=black)](https://github.com/locaal-ai/obs-localvocal/releases/download/0.5.1/obs-localvocal-0.5.1-nvidia-x86_64-linux-gnu.deb) [![Static Badge](https://img.shields.io/badge/Linux%20(AMD)-FCC624?style=for-the-badge&logo=linux&logoColor=black)](https://github.com/locaal-ai/obs-localvocal/releases/download/0.5.1/obs-localvocal-0.5.1-amd-x86_64-linux-gnu.deb) +[![Static Badge](https://img.shields.io/badge/Windows%20(generic)-0078d6?style=for-the-badge&logo=windows&logoColor=white)](https://github.com/locaal-ai/obs-localvocal/releases/download/0.5.2/obs-localvocal-0.5.2-windows-x64-generic-Installer.exe) [![Static Badge](https://img.shields.io/badge/Windows%20(NVidia)-0078d6?style=for-the-badge&logo=windows&logoColor=white)](https://github.com/locaal-ai/obs-localvocal/releases/download/0.5.2/obs-localvocal-0.5.2-windows-x64-nvidia-Installer.exe) [![Static Badge](https://img.shields.io/badge/Windows%20(AMD)-0078d6?style=for-the-badge&logo=windows&logoColor=white)](https://github.com/locaal-ai/obs-localvocal/releases/download/0.5.2/obs-localvocal-0.5.2-windows-x64-amd-Installer.exe) +[![Static Badge](https://img.shields.io/badge/mac%20Intel-000000?style=for-the-badge&logo=apple&logoColor=white)](https://github.com/locaal-ai/obs-localvocal/releases/download/0.5.2/obs-localvocal-0.5.2-macos-x86_64.pkg) [![Static Badge](https://img.shields.io/badge/mac%20M1/2/3-0a0a0a?style=for-the-badge&logo=apple&logoColor=white)](https://github.com/locaal-ai/obs-localvocal/releases/download/0.5.2/obs-localvocal-0.5.2-macos-arm64.pkg) +[![Static Badge](https://img.shields.io/badge/Linux%20(generic)-FCC624?style=for-the-badge&logo=linux&logoColor=black)](https://github.com/locaal-ai/obs-localvocal/releases/download/0.5.2/obs-localvocal-0.5.2-generic-x86_64-linux-gnu.deb) [![Static Badge](https://img.shields.io/badge/Linux%20(NVidia)-FCC624?style=for-the-badge&logo=linux&logoColor=black)](https://github.com/locaal-ai/obs-localvocal/releases/download/0.5.2/obs-localvocal-0.5.2-nvidia-x86_64-linux-gnu.deb) [![Static Badge](https://img.shields.io/badge/Linux%20(AMD)-FCC624?style=for-the-badge&logo=linux&logoColor=black)](https://github.com/locaal-ai/obs-localvocal/releases/download/0.5.2/obs-localvocal-0.5.2-amd-x86_64-linux-gnu.deb) diff --git a/buildspec.json b/buildspec.json index 18ba8f8..8a4933a 100644 --- a/buildspec.json +++ b/buildspec.json @@ -35,7 +35,7 @@ }, "name": "obs-localvocal", "displayName": "OBS Localvocal", - "version": "0.5.1", + "version": "0.5.2", "author": "Roy Shilkrot", "website": "https://github.com/locaal-ai/obs-localvocal", "email": "roy.shil@gmail.com", diff --git a/cmake/BuildWhispercpp.cmake b/cmake/BuildWhispercpp.cmake index 5ed0c17..3be9607 100644 --- a/cmake/BuildWhispercpp.cmake +++ b/cmake/BuildWhispercpp.cmake @@ -1,155 +1,21 @@ include(ExternalProject) include(FetchContent) -set(PREBUILT_WHISPERCPP_VERSION "0.0.10-2") +set(PREBUILT_WHISPERCPP_VERSION "0.0.11-2") set(PREBUILT_WHISPERCPP_URL_BASE "https://github.com/locaal-ai/occ-ai-dep-whispercpp/releases/download/${PREBUILT_WHISPERCPP_VERSION}") add_library(Whispercpp INTERFACE) -# Get the name for the whisper library file from the CMake component name -function(LIB_NAME COMPONENT WHISPER_COMPONENT_IMPORT_LIB) - if((COMPONENT STREQUAL "Whisper") OR (COMPONENT STREQUAL "Whispercpp::Whisper")) - set(WHISPER_COMPONENT_IMPORT_LIB - whisper - PARENT_SCOPE) - elseif((COMPONENT STREQUAL "GGML") OR (COMPONENT STREQUAL "Whispercpp::GGML")) - set(WHISPER_COMPONENT_IMPORT_LIB - ggml - PARENT_SCOPE) - elseif((COMPONENT STREQUAL "WhisperCoreML") OR (COMPONENT STREQUAL "Whispercpp::WhisperCoreML")) - set(WHISPER_COMPONENT_IMPORT_LIB - whisper.coreml - PARENT_SCOPE) - else() - string(REGEX REPLACE "(Whispercpp::)?(GGML)" "\\2" COMPONENT ${COMPONENT}) - string(REGEX REPLACE "GGML(.*)" "\\1" LIB_SUFFIX ${COMPONENT}) - string(TOLOWER ${LIB_SUFFIX} IMPORT_LIB_SUFFIX) - set(WHISPER_COMPONENT_IMPORT_LIB - "ggml-${IMPORT_LIB_SUFFIX}" - PARENT_SCOPE) - endif() -endfunction() - -# Get library paths for Whisper libs -function(WHISPER_LIB_PATHS COMPONENT SOURCE_DIR WHISPER_STATIC_LIB_PATH WHISPER_SHARED_LIB_PATH - WHISPER_SHARED_MODULE_PATH) - lib_name(${COMPONENT} WHISPER_COMPONENT_IMPORT_LIB) - - if(UNIX AND NOT APPLE) - if(${LINUX_SOURCE_BUILD}) - set(STATIC_PATH ${SOURCE_DIR}) - set(SHARED_PATH ${SOURCE_DIR}) - set(SHARED_BIN_PATH ${SOURCE_DIR}) - else() - set(STATIC_PATH ${SOURCE_DIR}/lib) - set(SHARED_PATH ${SOURCE_DIR}/lib) - set(SHARED_BIN_PATH ${SOURCE_DIR}/bin) - endif() - else() - set(STATIC_PATH ${SOURCE_DIR}/${CMAKE_INSTALL_LIBDIR}) - set(SHARED_PATH ${SOURCE_DIR}/${CMAKE_INSTALL_LIBDIR}) - set(SHARED_BIN_PATH ${SOURCE_DIR}/${CMAKE_INSTALL_BINDIR}) - endif() - - set(WHISPER_STATIC_LIB_PATH - "${STATIC_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_STATIC_LIBRARY_SUFFIX}" - PARENT_SCOPE) - set(WHISPER_SHARED_LIB_PATH - "${SHARED_PATH}/${CMAKE_SHARED_LIBRARY_PREFIX}${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_SHARED_LIBRARY_SUFFIX}" - PARENT_SCOPE) - set(WHISPER_SHARED_MODULE_PATH - "${SHARED_BIN_PATH}/${CMAKE_SHARED_MODULE_PREFIX}${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_SHARED_MODULE_SUFFIX}" - PARENT_SCOPE) - - # Debugging - set(WHISPER_STATIC_LIB_PATH - "${STATIC_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_STATIC_LIBRARY_SUFFIX}") - set(WHISPER_SHARED_LIB_PATH - "${SHARED_PATH}/${CMAKE_SHARED_LIBRARY_PREFIX}${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_SHARED_LIBRARY_SUFFIX}") - set(WHISPER_SHARED_MODULE_PATH - "${SHARED_BIN_PATH}/${CMAKE_SHARED_MODULE_PREFIX}${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_SHARED_MODULE_SUFFIX}") - message(STATUS "Whisper lib import path: " ${WHISPER_STATIC_LIB_PATH}) - message(STATUS "Whisper shared lib import path: " ${WHISPER_SHARED_LIB_PATH}) - message(STATUS "Whisper shared MODULE import path: " ${WHISPER_SHARED_MODULE_PATH}) -endfunction() - -# Add a Whisper component to the build -function(ADD_WHISPER_COMPONENT COMPONENT LIB_TYPE SOURCE_DIR LIB_DIR) - whisper_lib_paths(${COMPONENT} ${LIB_DIR} WHISPER_STATIC_LIB_PATH WHISPER_SHARED_LIB_PATH WHISPER_SHARED_MODULE_PATH) - lib_name(${COMPONENT} WHISPER_COMPONENT_IMPORT_LIB) - - if(APPLE AND (LIB_TYPE STREQUAL SHARED)) - target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE "${WHISPER_SHARED_LIB_PATH}") - target_sources(${CMAKE_PROJECT_NAME} PRIVATE "${WHISPER_SHARED_LIB_PATH}") - set_property(SOURCE "${WHISPER_SHARED_LIB_PATH}" PROPERTY MACOSX_PACKAGE_LOCATION Frameworks) - source_group("Frameworks" FILES "${WHISPER_SHARED_LIB_PATH}") - add_custom_command( - TARGET "${CMAKE_PROJECT_NAME}" - PRE_BUILD VERBATIM - COMMAND /usr/bin/codesign --force --verify --verbose --sign "${CODESIGN_IDENTITY}" "${WHISPER_SHARED_LIB_PATH}") - message(STATUS "lib name: ${WHISPER_COMPONENT_IMPORT_LIB}") - if(${WHISPER_COMPONENT_IMPORT_LIB} STREQUAL whisper) - set(DYLIB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${WHISPER_COMPONENT_IMPORT_LIB}.1${CMAKE_SHARED_LIBRARY_SUFFIX}) - else() - set(DYLIB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_SHARED_LIBRARY_SUFFIX}) - endif() - add_custom_command( - TARGET "${CMAKE_PROJECT_NAME}" - POST_BUILD - COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "@rpath/${DYLIB_NAME}" "@loader_path/../Frameworks/${DYLIB_NAME}" - $) - else() - add_library(${COMPONENT} ${LIB_TYPE} IMPORTED) - - if(LIB_TYPE STREQUAL STATIC) - set_target_properties(${COMPONENT} PROPERTIES IMPORTED_LOCATION "${WHISPER_STATIC_LIB_PATH}") - else() - set_target_properties(${COMPONENT} PROPERTIES IMPORTED_LOCATION "${WHISPER_SHARED_LIB_PATH}") - set_target_properties(${COMPONENT} PROPERTIES IMPORTED_IMPLIB "${WHISPER_STATIC_LIB_PATH}") - endif() - set_target_properties(${COMPONENT} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${SOURCE_DIR}/include") - target_link_libraries(Whispercpp INTERFACE ${COMPONENT}) - endif() -endfunction() - -function(ADD_WHISPER_RUNTIME_MODULE COMPONENT SOURCE_DIR LIB_DIR) - whisper_lib_paths(${COMPONENT} ${LIB_DIR} WHISPER_STATIC_LIB_PATH WHISPER_SHARED_LIB_PATH WHISPER_SHARED_MODULE_PATH) - lib_name(${COMPONENT} WHISPER_COMPONENT_IMPORT_LIB) - - if(APPLE) - target_include_directories(${CMAKE_PROJECT_NAME} SYSTEM PUBLIC "${SOURCE_DIR}/include") - target_sources(${CMAKE_PROJECT_NAME} PRIVATE "${WHISPER_SHARED_MODULE_PATH}") - set_property(SOURCE "${WHISPER_SHARED_MODULE_PATH}" PROPERTY MACOSX_PACKAGE_LOCATION Frameworks) - source_group("Frameworks" FILES "${WHISPER_SHARED_MODULE_PATH}") - # add a codesigning step - add_custom_command( - TARGET "${CMAKE_PROJECT_NAME}" - PRE_BUILD VERBATIM - COMMAND /usr/bin/codesign --force --verify --verbose --sign "${CODESIGN_IDENTITY}" - "${WHISPER_SHARED_MODULE_PATH}") - add_custom_command( - TARGET "${CMAKE_PROJECT_NAME}" - POST_BUILD - COMMAND - ${CMAKE_INSTALL_NAME_TOOL} -change "@rpath/${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_SHARED_MODULE_SUFFIX}" - "@loader_path/../Frameworks/${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_SHARED_MODULE_SUFFIX}" - $) - else() - add_library(${COMPONENT} SHARED IMPORTED) - set_target_properties(${COMPONENT} PROPERTIES IMPORTED_LOCATION "${WHISPER_SHARED_LIB_PATH}") - set_target_properties(${COMPONENT} PROPERTIES IMPORTED_IMPLIB "${WHISPER_STATIC_LIB_PATH}") - set_target_properties(${COMPONENT} PROPERTIES IMPORTED_NO_SONAME TRUE) - set_target_properties(${COMPONENT} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${SOURCE_DIR}/include") - endif() -endfunction() +include(cmake/BuildWhispercppHelpers.cmake) if(APPLE) add_compile_definitions(WHISPER_DYNAMIC_BACKENDS) # check the "MACOS_ARCH" env var to figure out if this is x86 or arm64 if($ENV{MACOS_ARCH} STREQUAL "x86_64") - set(WHISPER_CPP_HASH "02446b1d508711b26cc778db48d5b8ef2dd7b0c98f5c9dfe39a1ad2ef9e3df07") + set(WHISPER_CPP_HASH "e6fa37ea4f76d31a105dc557e90c41b9bb78a629bb3efa71b2c6f9ce029b77dd") + list( APPEND WHISPER_RUNTIME_MODULES @@ -162,7 +28,7 @@ if(APPLE) GGMLCPU-ALDERLAKE GGMLCPU-SAPPHIRERAPIDS) elseif($ENV{MACOS_ARCH} STREQUAL "arm64") - set(WHISPER_CPP_HASH "ff2764b113e0f1fbafe0d8f86a339cd541d86a06d40a10eeac352050cc3be920") + set(WHISPER_CPP_HASH "4d18abb80aba27edc534a1720b2e4c552474d3380df0174465295f6d23d13589") list(APPEND WHISPER_RUNTIME_MODULES GGMLCPU-APPLE_M1 GGMLCPU-APPLE_M2_M3 GGMLCPU-APPLE_M4) else() message( @@ -170,9 +36,10 @@ if(APPLE) "The MACOS_ARCH environment variable is not set to a valid value. Please set it to either `x86_64` or `arm64`") endif() set(WHISPER_CPP_URL - "${PREBUILT_WHISPERCPP_URL_BASE}/whispercpp-macos-$ENV{MACOS_ARCH}-${PREBUILT_WHISPERCPP_VERSION}.tar.gz") + "${PREBUILT_WHISPERCPP_URL_BASE}/whispercpp-macos-$ENV{MACOS_ARCH}-metalembedded-${PREBUILT_WHISPERCPP_VERSION}.tar.gz" + ) - set(WHISPER_LIBRARIES Whisper WhisperCoreML GGML GGMLBase) + set(WHISPER_LIBRARIES Whisper Whisper_1 WhisperCoreML GGML GGMLBase) list(APPEND WHISPER_RUNTIME_MODULES GGMLMetal GGMLBlas) set(WHISPER_DEPENDENCY_LIBRARIES "-framework Accelerate" "-framework CoreML" "-framework Metal" ${BLAS_LIBRARIES}) set(WHISPER_LIBRARY_TYPE SHARED) @@ -188,14 +55,8 @@ if(APPLE) set(WHISPER_SOURCE_DIR ${whispercpp_fetch_SOURCE_DIR}) set(WHISPER_LIB_DIR ${whispercpp_fetch_SOURCE_DIR}) - add_custom_command( - TARGET "${CMAKE_PROJECT_NAME}" - PRE_BUILD VERBATIM - COMMAND /usr/bin/codesign --force --verify --verbose --sign "${CODESIGN_IDENTITY}" - "${whispercpp_fetch_SOURCE_DIR}/lib/libomp.dylib") - - file(GLOB WHISPER_DYLIBS ${whispercpp_fetch_SOURCE_DIR}/lib/*.dylib) - install(FILES ${WHISPER_DYLIBS} DESTINATION "${CMAKE_PROJECT_NAME}.plugin/Contents/Frameworks") + install_library_to_bundle(${whispercpp_fetch_SOURCE_DIR} libomp.dylib) + # target_add_resource(${CMAKE_PROJECT_NAME} ${whispercpp_fetch_SOURCE_DIR}/bin/default.metallib) elseif(WIN32) add_compile_definitions(WHISPER_DYNAMIC_BACKENDS) @@ -222,12 +83,12 @@ elseif(WIN32) "${PREBUILT_WHISPERCPP_URL_BASE}/whispercpp-windows${ARCH_PREFIX}${ACCELERATION_PREFIX}-${PREBUILT_WHISPERCPP_VERSION}.zip" ) if(${ACCELERATION} STREQUAL "generic") - set(WHISPER_CPP_HASH "affff7241d36aa09863d65fe5a2d581251a9955a4465186ffdec00c893abcaee") + set(WHISPER_CPP_HASH "43a69a80d6668fa4714cd145b7826deaa592b454c6f7da8ac71e7062114f1a7d") elseif(${ACCELERATION} STREQUAL "nvidia") - set(WHISPER_CPP_HASH "2b07afba9ad3489e6f173be6be7ffde2625ba5c0d84af7e306308676cabf67a6") + set(WHISPER_CPP_HASH "0893975412bf720c76d4b92a910abdb8ebf7ac927c872e2bbb04db0b647f71fe") list(APPEND WHISPER_RUNTIME_MODULES GGMLCUDA) elseif(${ACCELERATION} STREQUAL "amd") - set(WHISPER_CPP_HASH "9713220e1427b94f733255a25c2cf9f26577d2ce7eb55c48a6a0cc651313e9e5") + set(WHISPER_CPP_HASH "656c242b658b20f8a60f8823b85385c6f03da17cfe401d6ef177ccd5749f2b0d") list(APPEND WHISPER_RUNTIME_MODULES GGMLHip) else() message( @@ -302,9 +163,9 @@ else() set(WHISPER_CPP_URL "${PREBUILT_WHISPERCPP_URL_BASE}/whispercpp-linux${ARCH_PREFIX}${ACCELERATION_PREFIX}-Release.tar.gz") if(${ACCELERATION} STREQUAL "generic") - set(WHISPER_CPP_HASH "5a4f3baf7d7e030f3e5a29d78fdd06f069fe472ad0f9ca93d40ed222052a3fe5") + set(WHISPER_CPP_HASH "77555023b0fa15ce486ef56c6768d31f3b728feee64172e74dd8f8c811b62e10") elseif(${ACCELERATION} STREQUAL "nvidia") - set(WHISPER_CPP_HASH "a43dc8a44577e965caf9b0baaae74f30a9e00d99a296768021e7ccf0b9217878") + set(WHISPER_CPP_HASH "397ea1409a3cc92d049130b5f874bbd9c06325e5a56cd2d08b3d8706ce619b7b") list(APPEND WHISPER_RUNTIME_MODULES GGMLCUDA) # Find CUDA libraries and link against them @@ -319,7 +180,7 @@ else() CUDA::cuda_driver CUDA::OpenCL) elseif(${ACCELERATION} STREQUAL "amd") - set(WHISPER_CPP_HASH "1a7592da41493e57ead23c97a420f2db11a4fe31049c9b01cdb310bff05fdca1") + set(WHISPER_CPP_HASH "7e3c45e92abe3fe4c08009c4842a13937d4a30285fa49116a7a75802f0e6e64a") list(APPEND WHISPER_RUNTIME_MODULES GGMLHip) # Find hip libraries and link against them diff --git a/cmake/BuildWhispercppHelpers.cmake b/cmake/BuildWhispercppHelpers.cmake new file mode 100644 index 0000000..a6c4661 --- /dev/null +++ b/cmake/BuildWhispercppHelpers.cmake @@ -0,0 +1,142 @@ +# Get the name for the whisper library file from the CMake component name +function(LIB_NAME COMPONENT WHISPER_COMPONENT_IMPORT_LIB) + if((COMPONENT STREQUAL "Whisper") OR (COMPONENT STREQUAL "Whispercpp::Whisper")) + if(APPLE) + set(WHISPER_COMPONENT_IMPORT_LIB + whisper.1.8.2 + PARENT_SCOPE) + else() + set(WHISPER_COMPONENT_IMPORT_LIB + whisper + PARENT_SCOPE) + endif() + elseif((COMPONENT STREQUAL "Whisper_1") OR (COMPONENT STREQUAL "Whispercpp::Whisper_1")) + set(WHISPER_COMPONENT_IMPORT_LIB + whisper.1 + PARENT_SCOPE) + elseif((COMPONENT STREQUAL "GGML") OR (COMPONENT STREQUAL "Whispercpp::GGML")) + set(WHISPER_COMPONENT_IMPORT_LIB + ggml + PARENT_SCOPE) + elseif((COMPONENT STREQUAL "WhisperCoreML") OR (COMPONENT STREQUAL "Whispercpp::WhisperCoreML")) + set(WHISPER_COMPONENT_IMPORT_LIB + whisper.coreml + PARENT_SCOPE) + else() + string(REGEX REPLACE "(Whispercpp::)?(GGML)" "\\2" COMPONENT ${COMPONENT}) + string(REGEX REPLACE "GGML(.*)" "\\1" LIB_SUFFIX ${COMPONENT}) + string(TOLOWER ${LIB_SUFFIX} IMPORT_LIB_SUFFIX) + set(WHISPER_COMPONENT_IMPORT_LIB + "ggml-${IMPORT_LIB_SUFFIX}" + PARENT_SCOPE) + endif() +endfunction() + +# Get library paths for Whisper libs +function(WHISPER_LIB_PATHS COMPONENT SOURCE_DIR WHISPER_STATIC_LIB_PATH WHISPER_SHARED_LIB_PATH + WHISPER_SHARED_MODULE_PATH) + lib_name(${COMPONENT} WHISPER_COMPONENT_IMPORT_LIB) + + if(UNIX AND NOT APPLE) + if(${LINUX_SOURCE_BUILD}) + set(STATIC_PATH ${SOURCE_DIR}) + set(SHARED_PATH ${SOURCE_DIR}) + set(SHARED_BIN_PATH ${SOURCE_DIR}) + else() + set(STATIC_PATH ${SOURCE_DIR}/lib) + set(SHARED_PATH ${SOURCE_DIR}/lib) + set(SHARED_BIN_PATH ${SOURCE_DIR}/bin) + endif() + else() + set(STATIC_PATH ${SOURCE_DIR}/${CMAKE_INSTALL_LIBDIR}) + set(SHARED_PATH ${SOURCE_DIR}/${CMAKE_INSTALL_LIBDIR}) + set(SHARED_BIN_PATH ${SOURCE_DIR}/${CMAKE_INSTALL_BINDIR}) + endif() + + set(WHISPER_STATIC_LIB_PATH + "${STATIC_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_STATIC_LIBRARY_SUFFIX}" + PARENT_SCOPE) + set(WHISPER_SHARED_LIB_PATH + "${SHARED_PATH}/${CMAKE_SHARED_LIBRARY_PREFIX}${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_SHARED_LIBRARY_SUFFIX}" + PARENT_SCOPE) + set(WHISPER_SHARED_MODULE_PATH + "${SHARED_BIN_PATH}/${CMAKE_SHARED_MODULE_PREFIX}${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_SHARED_MODULE_SUFFIX}" + PARENT_SCOPE) + + # Debugging + set(WHISPER_STATIC_LIB_PATH + "${STATIC_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_STATIC_LIBRARY_SUFFIX}") + set(WHISPER_SHARED_LIB_PATH + "${SHARED_PATH}/${CMAKE_SHARED_LIBRARY_PREFIX}${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_SHARED_LIBRARY_SUFFIX}") + set(WHISPER_SHARED_MODULE_PATH + "${SHARED_BIN_PATH}/${CMAKE_SHARED_MODULE_PREFIX}${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_SHARED_MODULE_SUFFIX}") + message(DEBUG "Whisper lib import path: " ${WHISPER_STATIC_LIB_PATH}) + message(DEBUG "Whisper shared lib import path: " ${WHISPER_SHARED_LIB_PATH}) + message(DEBUG "Whisper shared MODULE import path: " ${WHISPER_SHARED_MODULE_PATH}) +endfunction() + +# Add a Whisper component to the build +function(ADD_WHISPER_COMPONENT COMPONENT LIB_TYPE SOURCE_DIR LIB_DIR) + whisper_lib_paths(${COMPONENT} ${LIB_DIR} WHISPER_STATIC_LIB_PATH WHISPER_SHARED_LIB_PATH WHISPER_SHARED_MODULE_PATH) + lib_name(${COMPONENT} WHISPER_COMPONENT_IMPORT_LIB) + + if(APPLE AND (LIB_TYPE STREQUAL SHARED)) + target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE "${WHISPER_SHARED_LIB_PATH}") + target_sources(${CMAKE_PROJECT_NAME} PRIVATE "${WHISPER_SHARED_LIB_PATH}") + set_property(SOURCE "${WHISPER_SHARED_LIB_PATH}" PROPERTY MACOSX_PACKAGE_LOCATION Frameworks) + source_group("Frameworks" FILES "${WHISPER_SHARED_LIB_PATH}") + add_custom_command( + TARGET "${CMAKE_PROJECT_NAME}" + PRE_BUILD VERBATIM + COMMAND /usr/bin/codesign --force --verify --verbose --sign "${CODESIGN_IDENTITY}" "${WHISPER_SHARED_LIB_PATH}") + set(DYLIB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_SHARED_LIBRARY_SUFFIX}) + add_custom_command( + TARGET "${CMAKE_PROJECT_NAME}" + POST_BUILD + COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "@rpath/${DYLIB_NAME}" "@loader_path/../Frameworks/${DYLIB_NAME}" + $) + else() + add_library(${COMPONENT} ${LIB_TYPE} IMPORTED) + + if(LIB_TYPE STREQUAL STATIC) + set_target_properties(${COMPONENT} PROPERTIES IMPORTED_LOCATION "${WHISPER_STATIC_LIB_PATH}") + else() + set_target_properties(${COMPONENT} PROPERTIES IMPORTED_LOCATION "${WHISPER_SHARED_LIB_PATH}") + set_target_properties(${COMPONENT} PROPERTIES IMPORTED_IMPLIB "${WHISPER_STATIC_LIB_PATH}") + endif() + set_target_properties(${COMPONENT} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${SOURCE_DIR}/include") + target_link_libraries(Whispercpp INTERFACE ${COMPONENT}) + endif() +endfunction() + +function(ADD_WHISPER_RUNTIME_MODULE COMPONENT SOURCE_DIR LIB_DIR) + whisper_lib_paths(${COMPONENT} ${LIB_DIR} WHISPER_STATIC_LIB_PATH WHISPER_SHARED_LIB_PATH WHISPER_SHARED_MODULE_PATH) + lib_name(${COMPONENT} WHISPER_COMPONENT_IMPORT_LIB) + + if(APPLE) + target_include_directories(${CMAKE_PROJECT_NAME} SYSTEM PUBLIC "${SOURCE_DIR}/include") + target_sources(${CMAKE_PROJECT_NAME} PRIVATE "${WHISPER_SHARED_MODULE_PATH}") + set_property(SOURCE "${WHISPER_SHARED_MODULE_PATH}" PROPERTY MACOSX_PACKAGE_LOCATION Frameworks) + source_group("Frameworks" FILES "${WHISPER_SHARED_MODULE_PATH}") + + # add a codesigning step + add_custom_command( + TARGET "${CMAKE_PROJECT_NAME}" + PRE_BUILD VERBATIM + COMMAND /usr/bin/codesign --force --verify --verbose --sign "${CODESIGN_IDENTITY}" + "${WHISPER_SHARED_MODULE_PATH}") + add_custom_command( + TARGET "${CMAKE_PROJECT_NAME}" + POST_BUILD + COMMAND + ${CMAKE_INSTALL_NAME_TOOL} -change "@rpath/${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_SHARED_MODULE_SUFFIX}" + "@loader_path/../Frameworks/${WHISPER_COMPONENT_IMPORT_LIB}${CMAKE_SHARED_MODULE_SUFFIX}" + $) + else() + add_library(${COMPONENT} SHARED IMPORTED) + set_target_properties(${COMPONENT} PROPERTIES IMPORTED_LOCATION "${WHISPER_SHARED_LIB_PATH}") + set_target_properties(${COMPONENT} PROPERTIES IMPORTED_IMPLIB "${WHISPER_STATIC_LIB_PATH}") + set_target_properties(${COMPONENT} PROPERTIES IMPORTED_NO_SONAME TRUE) + set_target_properties(${COMPONENT} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${SOURCE_DIR}/include") + endif() +endfunction() diff --git a/cmake/FetchOnnxruntime.cmake b/cmake/FetchOnnxruntime.cmake index a5f3b14..ff11678 100644 --- a/cmake/FetchOnnxruntime.cmake +++ b/cmake/FetchOnnxruntime.cmake @@ -52,17 +52,7 @@ FetchContent_Declare( FetchContent_MakeAvailable(onnxruntime) if(APPLE) - set(Onnxruntime_LIB "${onnxruntime_SOURCE_DIR}/lib/libonnxruntime.${Onnxruntime_VERSION}.dylib") - target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE "${Onnxruntime_LIB}") - target_include_directories(${CMAKE_PROJECT_NAME} SYSTEM PUBLIC "${onnxruntime_SOURCE_DIR}/include") - target_sources(${CMAKE_PROJECT_NAME} PRIVATE "${Onnxruntime_LIB}") - set_property(SOURCE "${Onnxruntime_LIB}" PROPERTY MACOSX_PACKAGE_LOCATION Frameworks) - source_group("Frameworks" FILES "${Onnxruntime_LIB}") - # add a codesigning step - add_custom_command( - TARGET "${CMAKE_PROJECT_NAME}" - PRE_BUILD VERBATIM - COMMAND /usr/bin/codesign --force --verify --verbose --sign "${CODESIGN_IDENTITY}" "${Onnxruntime_LIB}") + install_library_to_bundle(${onnxruntime_SOURCE_DIR} libonnxruntime.${Onnxruntime_VERSION}.dylib BUILD_DEPENDENCY) add_custom_command( TARGET "${CMAKE_PROJECT_NAME}" POST_BUILD diff --git a/cmake/common/ccache.cmake b/cmake/common/ccache.cmake index acfff5a..b1223ee 100644 --- a/cmake/common/ccache.cmake +++ b/cmake/common/ccache.cmake @@ -18,5 +18,8 @@ if(CCACHE_PROGRAM) set(CMAKE_OBJC_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") set(CMAKE_OBJCXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") set(CMAKE_CUDA_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") + if(APPLE) + set(CLANG_ENABLE_EXPLICIT_MODULES_WITH_COMPILER_LAUNCHER YES) + endif() endif() endif() diff --git a/cmake/macos/compilerconfig.cmake b/cmake/macos/compilerconfig.cmake index 1fe9330..4a16fd1 100644 --- a/cmake/macos/compilerconfig.cmake +++ b/cmake/macos/compilerconfig.cmake @@ -10,9 +10,11 @@ add_compile_options(-fopenmp-simd) if(XCODE) # Use Xcode's standard architecture selection set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD)") - # Enable dSYM generation for Release builds + # set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym") Enable dSYM generation for Release builds string(APPEND CMAKE_C_FLAGS_RELEASE " -g") string(APPEND CMAKE_CXX_FLAGS_RELEASE " -g") + string(APPEND CMAKE_C_FLAGS_DEBUG " -g") + string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g") else() option(ENABLE_COMPILER_TRACE "Enable clang time-trace (requires Ninja)" OFF) mark_as_advanced(ENABLE_COMPILER_TRACE) diff --git a/cmake/macos/helpers.cmake b/cmake/macos/helpers.cmake index 76541b8..f080f26 100644 --- a/cmake/macos/helpers.cmake +++ b/cmake/macos/helpers.cmake @@ -91,3 +91,33 @@ function(target_add_resource target resource) set_property(SOURCE "${resource}" PROPERTY MACOSX_PACKAGE_LOCATION Resources) source_group("Resources" FILES "${resource}") endfunction() + +function(INSTALL_LIBRARY_TO_BUNDLE SOURCE_DIR LIB_NAME) + set(options FRAMEWORK BUILD_DEPENDENCY) + cmake_parse_arguments(INSTALL_LIBRARY_TO_BUNDLE "${options}" "" "" ${ARGN}) + if(APPLE) + if(${INSTALL_LIBRARY_TO_BUNDLE_FRAMEWORK}) + set(LIB_DIR Frameworks) + set(DEEP_SIGN "--deep") + else() + set(LIB_DIR lib) + set(DEEP_SIGN "") + endif() + + set(LIB ${SOURCE_DIR}/${LIB_DIR}/${LIB_NAME}) + + if(${INSTALL_LIBRARY_TO_BUNDLE_BUILD_DEPENDENCY}) + target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE "${LIB}") + target_include_directories(${CMAKE_PROJECT_NAME} SYSTEM PUBLIC "${SOURCE_DIR}/include") + endif() + + add_custom_command( + TARGET "${CMAKE_PROJECT_NAME}" + PRE_BUILD VERBATIM + COMMAND /usr/bin/codesign --force ${DEEP_SIGN} --verify --verbose --sign "${CODESIGN_IDENTITY}" "${LIB}") + + target_sources(${CMAKE_PROJECT_NAME} PRIVATE "${LIB}") + set_property(SOURCE "${LIB}" PROPERTY MACOSX_PACKAGE_LOCATION Frameworks) + source_group("Frameworks" FILES "${LIB}") + endif() +endfunction() diff --git a/cmake/macos/xcode.cmake b/cmake/macos/xcode.cmake index 3b4184c..1746c29 100644 --- a/cmake/macos/xcode.cmake +++ b/cmake/macos/xcode.cmake @@ -69,8 +69,8 @@ set(CMAKE_XCODE_ATTRIBUTE_SWIFT_VERSION 5.0) # * Currently overruled by CMake's Xcode generator, requires adding '-g' flag to raw compiler command line for desired # output configuration. Report to KitWare. # -set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Debug] dwarf) -set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=RelWithDebInfo] dwarf) +set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Debug] dwarf-with-dsym) +set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=RelWithDebInfo] dwarf-with-dsym) set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Release] dwarf-with-dsym) set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=MinSizeRel] dwarf-with-dsym)