diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ca1c189..d928d1f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -81,7 +81,7 @@ jobs: if: runner.os == 'Windows' uses: msys2/setup-msys2@v2 with: - msystem: MINGW64 + msystem: UCRT64 update: true install: ${{ matrix.msys2_packages }} @@ -111,6 +111,7 @@ jobs: libudev-dev \ libvulkan-dev \ glslang-tools \ + glslc \ vulkan-validationlayers # macOS: Ensure full Xcode is active (needed for ObjC/Metal in SDL3) @@ -133,9 +134,9 @@ jobs: path: | build/_deps build/CPM.cmake - key: ${{ runner.os }}-cmake-deps-${{ hashFiles('CMakeLists.txt', 'cmake/**') }} + key: ${{ runner.os }}-cmake-deps-v3-${{ hashFiles('CMakeLists.txt', 'cmake/**') }} restore-keys: | - ${{ runner.os }}-cmake-deps- + ${{ runner.os }}-cmake-deps-v3- # ──────────────────────────────────────────────────────────── # 4. Configure diff --git a/CMakeLists.txt b/CMakeLists.txt index ce0e67f..aab54c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,14 +9,8 @@ set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++23") set(CMAKE_CXX_SCAN_FOR_MODULES OFF CACHE BOOL "Disable C++ modules scanning for MinGW" FORCE) -# Define UNICODE and _UNICODE for wide-character support on Windows -if(WIN32) - add_definitions(-DUNICODE -D_UNICODE) - # Ensure wchar_t support is enabled - add_definitions(-D_WCHAR_T) - if(MSVC) - add_compile_options(/utf-8) - endif() +if(WIN32 AND MSVC) + add_compile_options(/utf-8) endif() set(PROJ_MAJOR_VERSION 1) @@ -390,6 +384,25 @@ FetchContent_MakeAvailable(curl) include(add_mupdf_library) +################################################################ +# llama.cpp +################################ + +set(LLAMA_BUILD_TESTS OFF CACHE BOOL "Disable llama tests" FORCE) +set(LLAMA_BUILD_EXAMPLES OFF CACHE BOOL "Disable llama examples" FORCE) +set(LLAMA_BUILD_SERVER OFF CACHE BOOL "Disable llama server" FORCE) + +FetchContent_Declare( + llama + GIT_REPOSITORY https://github.com/ggerganov/llama.cpp.git + GIT_TAG b4400 + GIT_SHALLOW TRUE + GIT_SUBMODULES "" + UPDATE_DISCONNECTED TRUE +) + +FetchContent_MakeAvailable(llama) + ################################ # whisper ################################ @@ -419,9 +432,9 @@ else() set(GGML_VULKAN OFF CACHE BOOL "Disable Vulkan for GGML" FORCE) else() # Priority 2: Vulkan (Supported under MinGW GCC, MSVC, and Linux) - find_package(Vulkan QUIET) - if(Vulkan_FOUND) - message(STATUS "CUDA not supported by toolchain, Vulkan SDK found — Enabling Vulkan GPU backend for Whisper (Priority 2).") + find_package(Vulkan QUIET COMPONENTS glslc) + if(Vulkan_FOUND AND Vulkan_glslc_FOUND) + message(STATUS "CUDA not supported by toolchain, Vulkan SDK & glslc found — Enabling Vulkan GPU backend for Whisper (Priority 2).") set(GGML_CUDA OFF CACHE BOOL "Disable CUDA for GGML" FORCE) set(GGML_VULKAN ON CACHE BOOL "Enable Vulkan GPU acceleration" FORCE) else() @@ -437,6 +450,9 @@ FetchContent_Declare( whisper GIT_REPOSITORY https://github.com/ggerganov/whisper.cpp.git GIT_TAG v1.8.3 + GIT_SHALLOW TRUE + GIT_SUBMODULES "" + UPDATE_DISCONNECTED TRUE OVERRIDE_FIND_PACKAGE ) FetchContent_MakeAvailable(whisper) @@ -460,85 +476,26 @@ target_link_libraries(whisper PUBLIC ggml) if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") target_compile_options(whisper PRIVATE -O3) - target_compile_options(ggml-cpu PRIVATE -O3) + if(TARGET ggml-cpu) + target_compile_options(ggml-cpu PRIVATE -O3) + endif() elseif(MSVC) target_compile_options(whisper PRIVATE /O2) - target_compile_options(ggml-cpu PRIVATE /O2) -endif() - -################################ -# llama.cpp -################################ - -set(LLAMA_BUILD_TESTS OFF CACHE BOOL "Disable llama tests" FORCE) -set(LLAMA_BUILD_EXAMPLES OFF CACHE BOOL "Disable llama examples" FORCE) -set(LLAMA_BUILD_SERVER OFF CACHE BOOL "Disable llama server" FORCE) - -FetchContent_Declare( - llama - GIT_REPOSITORY https://github.com/ggerganov/llama.cpp.git - GIT_TAG b3600 -) - -FetchContent_GetProperties(llama) -if(NOT llama_POPULATED) - FetchContent_Populate(llama) - - # Workaround for macOS CI (C++23 libc++ / Apple Clang): - if(EXISTS "${llama_SOURCE_DIR}/src/unicode.cpp") - file(READ "${llama_SOURCE_DIR}/src/unicode.cpp" LLAMA_UNICODE_CPP) - if(NOT LLAMA_UNICODE_CPP MATCHES "#include ") - file(WRITE "${llama_SOURCE_DIR}/src/unicode.cpp" "#include \n${LLAMA_UNICODE_CPP}") - endif() + if(TARGET ggml-cpu) + target_compile_options(ggml-cpu PRIVATE /O2) endif() +endif() - # Isolate llama's ggml target into ggml_llama so it does not collide with whisper's ggml target - if(EXISTS "${llama_SOURCE_DIR}/CMakeLists.txt") - file(READ "${llama_SOURCE_DIR}/CMakeLists.txt" LLAMA_ROOT_CMAKE) - if(NOT LLAMA_ROOT_CMAKE MATCHES "ggml_llama") - string(REPLACE "if (NOT TARGET ggml)" "if (NOT TARGET ggml_llama)" LLAMA_ROOT_CMAKE "${LLAMA_ROOT_CMAKE}") - string(REPLACE "get_target_property(GGML_DIRECTORY ggml" "get_target_property(GGML_DIRECTORY ggml_llama" LLAMA_ROOT_CMAKE "${LLAMA_ROOT_CMAKE}") - string(REPLACE "get_target_property(GGML_TARGET_DEFINES ggml" "get_target_property(GGML_TARGET_DEFINES ggml_llama" LLAMA_ROOT_CMAKE "${LLAMA_ROOT_CMAKE}") - string(REPLACE "get_target_property(GGML_LINK_LIBRARIES ggml" "get_target_property(GGML_LINK_LIBRARIES ggml_llama" LLAMA_ROOT_CMAKE "${LLAMA_ROOT_CMAKE}") - file(WRITE "${llama_SOURCE_DIR}/CMakeLists.txt" "${LLAMA_ROOT_CMAKE}") - endif() - endif() - if(EXISTS "${llama_SOURCE_DIR}/ggml/src/CMakeLists.txt") - file(READ "${llama_SOURCE_DIR}/ggml/src/CMakeLists.txt" LLAMA_GGML_CMAKE) - if(NOT LLAMA_GGML_CMAKE MATCHES "ggml_llama") - string(REPLACE "add_library(ggml\n" "add_library(ggml_llama\n" LLAMA_GGML_CMAKE "${LLAMA_GGML_CMAKE}") - string(REPLACE "add_library(ggml " "add_library(ggml_llama " LLAMA_GGML_CMAKE "${LLAMA_GGML_CMAKE}") - string(REPLACE "(ggml PUBLIC" "(ggml_llama PUBLIC" LLAMA_GGML_CMAKE "${LLAMA_GGML_CMAKE}") - string(REPLACE "(ggml PRIVATE" "(ggml_llama PRIVATE" LLAMA_GGML_CMAKE "${LLAMA_GGML_CMAKE}") - string(REPLACE "(ggml PROPERTIES" "(ggml_llama PROPERTIES" LLAMA_GGML_CMAKE "${LLAMA_GGML_CMAKE}") - string(REPLACE "ALIAS ggml)" "ALIAS ggml_llama)" LLAMA_GGML_CMAKE "${LLAMA_GGML_CMAKE}") - string(REPLACE "_ggml_vk_genshaders_cmd vulkan-shaders-gen" "_ggml_vk_genshaders_cmd vulkan-shaders-gen-llama" LLAMA_GGML_CMAKE "${LLAMA_GGML_CMAKE}") - file(WRITE "${llama_SOURCE_DIR}/ggml/src/CMakeLists.txt" "${LLAMA_GGML_CMAKE}") - endif() - endif() - if(EXISTS "${llama_SOURCE_DIR}/src/CMakeLists.txt") - file(READ "${llama_SOURCE_DIR}/src/CMakeLists.txt" LLAMA_SRC_CMAKE) - if(NOT LLAMA_SRC_CMAKE MATCHES "ggml_llama") - string(REPLACE "target_link_libraries(llama PUBLIC ggml)" "target_link_libraries(llama PUBLIC ggml_llama)" LLAMA_SRC_CMAKE "${LLAMA_SRC_CMAKE}") - file(WRITE "${llama_SOURCE_DIR}/src/CMakeLists.txt" "${LLAMA_SRC_CMAKE}") - endif() - endif() - if(EXISTS "${llama_SOURCE_DIR}/ggml/src/vulkan-shaders/CMakeLists.txt") - file(READ "${llama_SOURCE_DIR}/ggml/src/vulkan-shaders/CMakeLists.txt" LLAMA_VK_SHADERS_CMAKE) - string(REPLACE "set(TARGET vulkan-shaders-gen)" "set(TARGET vulkan-shaders-gen-llama)" LLAMA_VK_SHADERS_CMAKE "${LLAMA_VK_SHADERS_CMAKE}") - string(REPLACE "target_link_libraries(vulkan-shaders-gen " "target_link_libraries(vulkan-shaders-gen-llama " LLAMA_VK_SHADERS_CMAKE "${LLAMA_VK_SHADERS_CMAKE}") - string(REPLACE "vulkan-shaders-gen-llama.cpp" "vulkan-shaders-gen.cpp" LLAMA_VK_SHADERS_CMAKE "${LLAMA_VK_SHADERS_CMAKE}") - file(WRITE "${llama_SOURCE_DIR}/ggml/src/vulkan-shaders/CMakeLists.txt" "${LLAMA_VK_SHADERS_CMAKE}") - endif() - if(EXISTS "${llama_SOURCE_DIR}/ggml/src/ggml-vulkan/CMakeLists.txt") - file(READ "${llama_SOURCE_DIR}/ggml/src/ggml-vulkan/CMakeLists.txt" LLAMA_GGML_VK_CMAKE) - string(REPLACE "vulkan-shaders-gen" "vulkan-shaders-gen-llama" LLAMA_GGML_VK_CMAKE "${LLAMA_GGML_VK_CMAKE}") - string(REPLACE "vulkan-shaders-gen-llama-llama" "vulkan-shaders-gen-llama" LLAMA_GGML_VK_CMAKE "${LLAMA_GGML_VK_CMAKE}") - file(WRITE "${llama_SOURCE_DIR}/ggml/src/ggml-vulkan/CMakeLists.txt" "${LLAMA_GGML_VK_CMAKE}") +# Set hidden visibility on ggml targets to avoid symbol collisions when linking static libraries on macOS/Linux +foreach(target_name ggml ggml-base ggml-cpu ggml-vulkan) + if(TARGET ${target_name}) + set_target_properties(${target_name} PROPERTIES + C_VISIBILITY_PRESET hidden + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON + ) endif() - - add_subdirectory(${llama_SOURCE_DIR} ${llama_BINARY_DIR}) -endif() +endforeach() ##################################################################################################### # PROJECT RULES diff --git a/CantaTema/components/infrastructure/embeddings/src/llama_context_impl.cpp b/CantaTema/components/infrastructure/embeddings/src/llama_context_impl.cpp index d1120a5..c1b84b8 100644 --- a/CantaTema/components/infrastructure/embeddings/src/llama_context_impl.cpp +++ b/CantaTema/components/infrastructure/embeddings/src/llama_context_impl.cpp @@ -172,7 +172,7 @@ std::vector LlamaContextImpl::decode_and_get_embedding(const std::vector< llama_batch batch = llama_batch_get_one( const_cast(reinterpret_cast(tokens.data())), - static_cast(tokens.size()), 0, 0); + static_cast(tokens.size())); fn_llama_kv_cache_clear(m_ctx); diff --git a/cmake/add_mupdf_library.cmake b/cmake/add_mupdf_library.cmake index 27bb053..6c5d910 100644 --- a/cmake/add_mupdf_library.cmake +++ b/cmake/add_mupdf_library.cmake @@ -1,9 +1,5 @@ include(FetchContent) -if(POLICY CMP0169) - cmake_policy(SET CMP0169 OLD) -endif() - # ============================================================ # 1. Fetch MuPDF (Source only) # ============================================================ @@ -245,4 +241,4 @@ set_target_properties(mupdf PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${MUPDF_ROOT}/include" INTERFACE_LINK_LIBRARIES mupdf_third INTERFACE_COMPILE_DEFINITIONS "${MUPDF_EXPORT_DEFINITIONS}" -) +) \ No newline at end of file diff --git a/cmake/library_install_test.cmake b/cmake/library_install_test.cmake index a71ec7c..b334f37 100644 --- a/cmake/library_install_test.cmake +++ b/cmake/library_install_test.cmake @@ -20,6 +20,13 @@ function(create_test_exec) add_executable(${PARSED_ARGS_TARGET} ${PARSED_ARGS_SRCS}) + if(TARGET mupdf_make) + add_dependencies(${PARSED_ARGS_TARGET} mupdf_make) + endif() + if(TARGET mupdf_ext) + add_dependencies(${PARSED_ARGS_TARGET} mupdf_ext) + endif() + if(PARSED_ARGS_INC_PRIVATE) target_link_libraries(${PARSED_ARGS_TARGET} PRIVATE gtest gmock ${PARSED_ARGS_INC_PRIVATE}) endif(PARSED_ARGS_INC_PRIVATE)