From c6b56a7a392b50e32bdcc38cc9ed384d026d59a5 Mon Sep 17 00:00:00 2001 From: Ismael Casaban Date: Fri, 24 Jul 2026 14:01:21 +0200 Subject: [PATCH 01/15] ci fixes --- .github/workflows/ci.yml | 3 ++- CMakeLists.txt | 53 +++++----------------------------------- 2 files changed, 8 insertions(+), 48 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ca1c189..a24b6de 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 \ + shaderc \ vulkan-validationlayers # macOS: Ensure full Xcode is active (needed for ObjC/Metal in SDL3) diff --git a/CMakeLists.txt b/CMakeLists.txt index ce0e67f..02349b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -419,9 +419,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() @@ -492,50 +492,9 @@ if(NOT llama_POPULATED) 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}") - endif() + # Note: llama.cpp natively checks 'if (NOT TARGET ggml)' in its root CMakeLists.txt. + # Since whisper.cpp already created the 'ggml' target above, llama will share the same + # ggml library target, avoiding duplicate symbols and duplicate compilation. add_subdirectory(${llama_SOURCE_DIR} ${llama_BINARY_DIR}) endif() From b1eebc4f02758e5647b6a67d41a3715c58e3bc2d Mon Sep 17 00:00:00 2001 From: Ismael Casaban Date: Fri, 24 Jul 2026 14:45:52 +0200 Subject: [PATCH 02/15] ci fixes --- .github/workflows/ci.yml | 2 +- CMakeLists.txt | 58 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a24b6de..c913619 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -111,7 +111,7 @@ jobs: libudev-dev \ libvulkan-dev \ glslang-tools \ - shaderc \ + glslc \ vulkan-validationlayers # macOS: Ensure full Xcode is active (needed for ObjC/Metal in SDL3) diff --git a/CMakeLists.txt b/CMakeLists.txt index 02349b5..7807e37 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -492,13 +492,65 @@ if(NOT llama_POPULATED) endif() endif() - # Note: llama.cpp natively checks 'if (NOT TARGET ggml)' in its root CMakeLists.txt. - # Since whisper.cpp already created the 'ggml' target above, llama will share the same - # ggml library target, avoiding duplicate symbols and duplicate compilation. + # Isolate llama's ggml target into ggml_llama so it uses its matching ggml headers and code + 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}") + endif() add_subdirectory(${llama_SOURCE_DIR} ${llama_BINARY_DIR}) endif() +# 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 ggml_llama) + if(TARGET ${target_name}) + set_target_properties(${target_name} PROPERTIES + C_VISIBILITY_PRESET hidden + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON + ) + endif() +endforeach() + ##################################################################################################### # PROJECT RULES ##################################################################################################### From 29752e35ac4c0d62d28bfb706ddc6f1f480bb8a3 Mon Sep 17 00:00:00 2001 From: Ismael Casaban Date: Fri, 24 Jul 2026 15:48:06 +0200 Subject: [PATCH 03/15] ci fixes --- CMakeLists.txt | 108 ++++-------------- .../embeddings/src/llama_context_impl.cpp | 2 +- cmake/add_mupdf_library.cmake | 34 +++++- 3 files changed, 54 insertions(+), 90 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7807e37..56495f5 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,22 @@ 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 +) + +FetchContent_MakeAvailable(llama) + ################################ # whisper ################################ @@ -460,88 +470,18 @@ 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() - - # Isolate llama's ggml target into ggml_llama so it uses its matching ggml headers and code - 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}") - endif() - - add_subdirectory(${llama_SOURCE_DIR} ${llama_BINARY_DIR}) endif() # 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 ggml_llama) +foreach(target_name ggml ggml-base ggml-cpu ggml-vulkan) if(TARGET ${target_name}) set_target_properties(${target_name} PROPERTIES C_VISIBILITY_PRESET hidden 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..067223d 100644 --- a/cmake/add_mupdf_library.cmake +++ b/cmake/add_mupdf_library.cmake @@ -35,6 +35,7 @@ if(NOT mupdf_src_POPULATED) thirdparty/jbig2dec thirdparty/mujs thirdparty/lcms2 + thirdparty/gumbo-parser ) execute_process( @@ -100,6 +101,8 @@ foreach(DEF IN LISTS MUPDF_DEFINITIONS) endforeach() set(MUPDF_MAKE_OPTIONS + "CC=${CMAKE_C_COMPILER}" + "CXX=${CMAKE_CXX_COMPILER}" HAVE_CURL=no HAVE_FREETYPE=no HAVE_GLFW=no @@ -130,9 +133,17 @@ set(MUPDF_MAKE_OPTIONS HAVE_TIFF=no HAVE_X11=no HAVE_ZXINGCPP=no + HAVE_CJK=no + HAVE_CJK_FULL=no + HAVE_CJK_SINGLE=no + "FONT_FLAGS=" + "TOFU_FLAGS=" + FONT_CJK=no + FONT_SMALL=yes + TOFU_CJK_LANG=no + TOFU_CJK_EXT=no USE_BROTLI=no USE_EXTRACT=no - USE_GUMBO=no USE_LEPTONICA=no USE_LIBARCHIVE=no USE_MUJS=no @@ -180,11 +191,21 @@ else() set(MUPDF_ARCH_FLAGS "-msse4.1") endif() - set(BUILD_CMD ${MAKE_EXE} -j${N_CORES} "XCFLAGS=${MUPDF_ARCH_FLAGS} ${MUPDF_DEFINITIONS_STR}" ${MUPDF_MAKE_OPTIONS} extract=no OUT=build/release-cmake) + if(WIN32) + find_program(SH_EXE sh PATHS C:/msys64/usr/bin C:/msys64/ucrt64/bin "C:/Program Files/Git/bin") + if(SH_EXE) + string(REPLACE ";" " " MUPDF_MAKE_OPTIONS_STR "${MUPDF_MAKE_OPTIONS}") + set(BUILD_CMD ${SH_EXE} -c "export PATH=/usr/bin:/ucrt64/bin:C:/msys64/usr/bin:C:/msys64/ucrt64/bin:\$PATH; ${MAKE_EXE} -j${N_CORES} XCFLAGS=\"${MUPDF_ARCH_FLAGS} ${MUPDF_DEFINITIONS_STR}\" ${MUPDF_MAKE_OPTIONS_STR} extract=no build=release libs") + else() + set(BUILD_CMD ${MAKE_EXE} -j${N_CORES} "XCFLAGS=${MUPDF_ARCH_FLAGS} ${MUPDF_DEFINITIONS_STR}" ${MUPDF_MAKE_OPTIONS} extract=no build=release libs) + endif() + else() + set(BUILD_CMD ${MAKE_EXE} -j${N_CORES} "XCFLAGS=${MUPDF_ARCH_FLAGS} ${MUPDF_DEFINITIONS_STR}" ${MUPDF_MAKE_OPTIONS} extract=no build=release libs) + endif() # Standard Makefile builds into build/release/ - set(LIB_MUPDF "${MUPDF_ROOT}/build/release-cmake/libmupdf.a") - set(LIB_THIRD "${MUPDF_ROOT}/build/release-cmake/libmupdf-third.a") + set(LIB_MUPDF "${MUPDF_ROOT}/build/release/libmupdf.a") + set(LIB_THIRD "${MUPDF_ROOT}/build/release/libmupdf-third.a") endif() # ============================================================ @@ -221,9 +242,12 @@ add_custom_target(mupdf_make WORKING_DIRECTORY ${MUPDF_ROOT} COMMENT "Building MuPDF using native make..." BYPRODUCTS ${LIB_MUPDF} ${LIB_THIRD} - VERBATIM ) +if(WIN32) + set_property(TARGET mupdf_make PROPERTY ENVIRONMENT "PATH=C:/msys64/usr/bin;C:/msys64/ucrt64/bin;$ENV{PATH}") +endif() + # ============================================================ # 5. Import Library # ============================================================ From 66bd6924a6836881970475264cd63eb498f8cc3d Mon Sep 17 00:00:00 2001 From: Ismael Casaban Date: Fri, 24 Jul 2026 17:02:29 +0200 Subject: [PATCH 04/15] ci fixes --- .github/workflows/ci.yml | 4 ++-- CMakeLists.txt | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c913619..d928d1f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -134,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 56495f5..aab54c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -396,6 +396,9 @@ 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) @@ -447,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) From 390293608b3dd755d4d636b2bf891e591cdaaf2d Mon Sep 17 00:00:00 2001 From: Ismael Casaban Date: Fri, 24 Jul 2026 17:26:12 +0200 Subject: [PATCH 05/15] ci fixes --- cmake/add_mupdf_library.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/add_mupdf_library.cmake b/cmake/add_mupdf_library.cmake index 067223d..84093ad 100644 --- a/cmake/add_mupdf_library.cmake +++ b/cmake/add_mupdf_library.cmake @@ -195,12 +195,12 @@ else() find_program(SH_EXE sh PATHS C:/msys64/usr/bin C:/msys64/ucrt64/bin "C:/Program Files/Git/bin") if(SH_EXE) string(REPLACE ";" " " MUPDF_MAKE_OPTIONS_STR "${MUPDF_MAKE_OPTIONS}") - set(BUILD_CMD ${SH_EXE} -c "export PATH=/usr/bin:/ucrt64/bin:C:/msys64/usr/bin:C:/msys64/ucrt64/bin:\$PATH; ${MAKE_EXE} -j${N_CORES} XCFLAGS=\"${MUPDF_ARCH_FLAGS} ${MUPDF_DEFINITIONS_STR}\" ${MUPDF_MAKE_OPTIONS_STR} extract=no build=release libs") + set(BUILD_CMD ${SH_EXE} -c "export PATH=/usr/bin:/ucrt64/bin:C:/msys64/usr/bin:C:/msys64/ucrt64/bin:\$PATH; ${MAKE_EXE} -j${N_CORES} XCFLAGS=\"${MUPDF_ARCH_FLAGS} ${MUPDF_DEFINITIONS_STR}\" ${MUPDF_MAKE_OPTIONS_STR} extract=no build=release OUT=build/release libs") else() - set(BUILD_CMD ${MAKE_EXE} -j${N_CORES} "XCFLAGS=${MUPDF_ARCH_FLAGS} ${MUPDF_DEFINITIONS_STR}" ${MUPDF_MAKE_OPTIONS} extract=no build=release libs) + set(BUILD_CMD ${MAKE_EXE} -j${N_CORES} "XCFLAGS=${MUPDF_ARCH_FLAGS} ${MUPDF_DEFINITIONS_STR}" ${MUPDF_MAKE_OPTIONS} extract=no build=release OUT=build/release libs) endif() else() - set(BUILD_CMD ${MAKE_EXE} -j${N_CORES} "XCFLAGS=${MUPDF_ARCH_FLAGS} ${MUPDF_DEFINITIONS_STR}" ${MUPDF_MAKE_OPTIONS} extract=no build=release libs) + set(BUILD_CMD ${MAKE_EXE} -j${N_CORES} "XCFLAGS=${MUPDF_ARCH_FLAGS} ${MUPDF_DEFINITIONS_STR}" ${MUPDF_MAKE_OPTIONS} extract=no build=release OUT=build/release libs) endif() # Standard Makefile builds into build/release/ @@ -228,7 +228,7 @@ if(NOT "${CURRENT_CONFIG_STR}" STREQUAL "${OLD_CONFIG_STR}") if(MSVC) execute_process(COMMAND ${NMAKE_EXE} /f platform/win32/NMakefile clean WORKING_DIRECTORY ${MUPDF_ROOT} OUTPUT_QUIET ERROR_QUIET) else() - execute_process(COMMAND ${MAKE_EXE} clean OUT=build/release-cmake WORKING_DIRECTORY ${MUPDF_ROOT} OUTPUT_QUIET ERROR_QUIET) + execute_process(COMMAND ${MAKE_EXE} clean OUT=build/release WORKING_DIRECTORY ${MUPDF_ROOT} OUTPUT_QUIET ERROR_QUIET) endif() file(WRITE "${MUPDF_CONFIG_FILE}" "${CURRENT_CONFIG_STR}") endif() From 00148703086b14ab810f599ea595f6c96139c4ca Mon Sep 17 00:00:00 2001 From: Ismael Casaban Date: Fri, 24 Jul 2026 17:43:54 +0200 Subject: [PATCH 06/15] ci fixes --- cmake/add_mupdf_library.cmake | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/cmake/add_mupdf_library.cmake b/cmake/add_mupdf_library.cmake index 84093ad..f2559c2 100644 --- a/cmake/add_mupdf_library.cmake +++ b/cmake/add_mupdf_library.cmake @@ -237,16 +237,14 @@ endif() # 4. Build Target # ============================================================ -add_custom_target(mupdf_make +add_custom_command( + OUTPUT ${LIB_MUPDF} ${LIB_THIRD} COMMAND ${BUILD_CMD} WORKING_DIRECTORY ${MUPDF_ROOT} COMMENT "Building MuPDF using native make..." - BYPRODUCTS ${LIB_MUPDF} ${LIB_THIRD} ) -if(WIN32) - set_property(TARGET mupdf_make PROPERTY ENVIRONMENT "PATH=C:/msys64/usr/bin;C:/msys64/ucrt64/bin;$ENV{PATH}") -endif() +add_custom_target(mupdf_make DEPENDS ${LIB_MUPDF} ${LIB_THIRD}) # ============================================================ # 5. Import Library From fd9800847230d40018af740bc92f3211cadffdec Mon Sep 17 00:00:00 2001 From: Ismael Casaban Date: Fri, 24 Jul 2026 18:02:00 +0200 Subject: [PATCH 07/15] ci fixes --- cmake/add_mupdf_library.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/add_mupdf_library.cmake b/cmake/add_mupdf_library.cmake index f2559c2..c715134 100644 --- a/cmake/add_mupdf_library.cmake +++ b/cmake/add_mupdf_library.cmake @@ -244,7 +244,7 @@ add_custom_command( COMMENT "Building MuPDF using native make..." ) -add_custom_target(mupdf_make DEPENDS ${LIB_MUPDF} ${LIB_THIRD}) +add_custom_target(mupdf_make ALL DEPENDS ${LIB_MUPDF} ${LIB_THIRD}) # ============================================================ # 5. Import Library From 1fce9ba323f5cbf039b4cb6ef51f888d7bffc5ea Mon Sep 17 00:00:00 2001 From: Ismael Casaban Date: Fri, 24 Jul 2026 19:40:40 +0200 Subject: [PATCH 08/15] ci fixes --- cmake/add_mupdf_library.cmake | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/cmake/add_mupdf_library.cmake b/cmake/add_mupdf_library.cmake index c715134..c40775a 100644 --- a/cmake/add_mupdf_library.cmake +++ b/cmake/add_mupdf_library.cmake @@ -247,24 +247,13 @@ add_custom_command( add_custom_target(mupdf_make ALL DEPENDS ${LIB_MUPDF} ${LIB_THIRD}) # ============================================================ -# 5. Import Library +# 5. Export Interface Library # ============================================================ -# Helper to import the thirdparty lib -add_library(mupdf_third STATIC IMPORTED GLOBAL) -add_dependencies(mupdf_third mupdf_make) -set_target_properties(mupdf_third PROPERTIES - IMPORTED_LOCATION "${LIB_THIRD}" -) - -# Main mupdf library -add_library(mupdf STATIC IMPORTED GLOBAL) +add_library(mupdf INTERFACE) add_library(mupdf::mupdf ALIAS mupdf) add_dependencies(mupdf mupdf_make) -set_target_properties(mupdf PROPERTIES - IMPORTED_LOCATION "${LIB_MUPDF}" - INTERFACE_INCLUDE_DIRECTORIES "${MUPDF_ROOT}/include" - INTERFACE_LINK_LIBRARIES mupdf_third - INTERFACE_COMPILE_DEFINITIONS "${MUPDF_EXPORT_DEFINITIONS}" -) +target_link_libraries(mupdf INTERFACE "${LIB_MUPDF}" "${LIB_THIRD}") +target_include_directories(mupdf INTERFACE "${MUPDF_ROOT}/include") +target_compile_definitions(mupdf INTERFACE ${MUPDF_EXPORT_DEFINITIONS}) From 98ca654d946b15e3f67a74e867e86f7795e25d26 Mon Sep 17 00:00:00 2001 From: Ismael Casaban Date: Fri, 24 Jul 2026 20:14:16 +0200 Subject: [PATCH 09/15] ci fixes --- cmake/add_mupdf_library.cmake | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cmake/add_mupdf_library.cmake b/cmake/add_mupdf_library.cmake index c40775a..09c53df 100644 --- a/cmake/add_mupdf_library.cmake +++ b/cmake/add_mupdf_library.cmake @@ -233,6 +233,22 @@ if(NOT "${CURRENT_CONFIG_STR}" STREQUAL "${OLD_CONFIG_STR}") file(WRITE "${MUPDF_CONFIG_FILE}" "${CURRENT_CONFIG_STR}") endif() +# ============================================================ +# 3.6. Ensure Initial Build of MuPDF on Configure (Fixes MinGW Makefiles) +# ============================================================ + +if(NOT EXISTS "${LIB_MUPDF}" OR NOT EXISTS "${LIB_THIRD}") + message(STATUS "Initial MuPDF build starting...") + execute_process( + COMMAND ${BUILD_CMD} + WORKING_DIRECTORY ${MUPDF_ROOT} + RESULT_VARIABLE MUPDF_INIT_RESULT + ) + if(NOT MUPDF_INIT_RESULT EQUAL 0) + message(FATAL_ERROR "Initial MuPDF build failed with exit code ${MUPDF_INIT_RESULT}") + endif() +endif() + # ============================================================ # 4. Build Target # ============================================================ From e7eea3e324a4644efedef5fbe58fc026e36038e4 Mon Sep 17 00:00:00 2001 From: Ismael Casaban Date: Fri, 24 Jul 2026 20:40:46 +0200 Subject: [PATCH 10/15] ci fixes --- CantaTema/components/infrastructure/file_handler/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CantaTema/components/infrastructure/file_handler/CMakeLists.txt b/CantaTema/components/infrastructure/file_handler/CMakeLists.txt index c129812..2a45765 100644 --- a/CantaTema/components/infrastructure/file_handler/CMakeLists.txt +++ b/CantaTema/components/infrastructure/file_handler/CMakeLists.txt @@ -30,4 +30,6 @@ target_include_directories(_infra_FILE_HANDLER PRIVATE $ ) +add_dependencies(_infra_FILE_HANDLER mupdf_make) + add_subdirectory(test) From fb8188bdeebba2f36a50e436ef137709dfe698ae Mon Sep 17 00:00:00 2001 From: Ismael Casaban Date: Fri, 24 Jul 2026 20:57:28 +0200 Subject: [PATCH 11/15] ci fixes --- .../file_handler/CMakeLists.txt | 2 - cmake/add_mupdf_library.cmake | 44 ++++++++----------- 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/CantaTema/components/infrastructure/file_handler/CMakeLists.txt b/CantaTema/components/infrastructure/file_handler/CMakeLists.txt index 2a45765..c129812 100644 --- a/CantaTema/components/infrastructure/file_handler/CMakeLists.txt +++ b/CantaTema/components/infrastructure/file_handler/CMakeLists.txt @@ -30,6 +30,4 @@ target_include_directories(_infra_FILE_HANDLER PRIVATE $ ) -add_dependencies(_infra_FILE_HANDLER mupdf_make) - add_subdirectory(test) diff --git a/cmake/add_mupdf_library.cmake b/cmake/add_mupdf_library.cmake index 09c53df..c7c248b 100644 --- a/cmake/add_mupdf_library.cmake +++ b/cmake/add_mupdf_library.cmake @@ -233,43 +233,37 @@ if(NOT "${CURRENT_CONFIG_STR}" STREQUAL "${OLD_CONFIG_STR}") file(WRITE "${MUPDF_CONFIG_FILE}" "${CURRENT_CONFIG_STR}") endif() -# ============================================================ -# 3.6. Ensure Initial Build of MuPDF on Configure (Fixes MinGW Makefiles) -# ============================================================ - -if(NOT EXISTS "${LIB_MUPDF}" OR NOT EXISTS "${LIB_THIRD}") - message(STATUS "Initial MuPDF build starting...") - execute_process( - COMMAND ${BUILD_CMD} - WORKING_DIRECTORY ${MUPDF_ROOT} - RESULT_VARIABLE MUPDF_INIT_RESULT - ) - if(NOT MUPDF_INIT_RESULT EQUAL 0) - message(FATAL_ERROR "Initial MuPDF build failed with exit code ${MUPDF_INIT_RESULT}") - endif() -endif() - # ============================================================ # 4. Build Target # ============================================================ -add_custom_command( - OUTPUT ${LIB_MUPDF} ${LIB_THIRD} +add_custom_target(mupdf_make COMMAND ${BUILD_CMD} WORKING_DIRECTORY ${MUPDF_ROOT} COMMENT "Building MuPDF using native make..." + BYPRODUCTS ${LIB_MUPDF} ${LIB_THIRD} + VERBATIM ) -add_custom_target(mupdf_make ALL DEPENDS ${LIB_MUPDF} ${LIB_THIRD}) - # ============================================================ -# 5. Export Interface Library +# 5. Import Library # ============================================================ -add_library(mupdf INTERFACE) +# Helper to import the thirdparty lib +add_library(mupdf_third STATIC IMPORTED GLOBAL) +add_dependencies(mupdf_third mupdf_make) +set_target_properties(mupdf_third PROPERTIES + IMPORTED_LOCATION "${LIB_THIRD}" +) + +# Main mupdf library +add_library(mupdf STATIC IMPORTED GLOBAL) add_library(mupdf::mupdf ALIAS mupdf) add_dependencies(mupdf mupdf_make) -target_link_libraries(mupdf INTERFACE "${LIB_MUPDF}" "${LIB_THIRD}") -target_include_directories(mupdf INTERFACE "${MUPDF_ROOT}/include") -target_compile_definitions(mupdf INTERFACE ${MUPDF_EXPORT_DEFINITIONS}) +set_target_properties(mupdf PROPERTIES + IMPORTED_LOCATION "${LIB_MUPDF}" + INTERFACE_INCLUDE_DIRECTORIES "${MUPDF_ROOT}/include" + INTERFACE_LINK_LIBRARIES mupdf_third + INTERFACE_COMPILE_DEFINITIONS "${MUPDF_EXPORT_DEFINITIONS}" +) From 60ba69176bde21abc427ccab14cb56c1bdc4eb4f Mon Sep 17 00:00:00 2001 From: Ismael Casaban Date: Sat, 25 Jul 2026 01:34:07 +0200 Subject: [PATCH 12/15] ci fixes --- .../file_handler/CMakeLists.txt | 2 + cmake/add_mupdf_library.cmake | 49 ++++++------------- 2 files changed, 17 insertions(+), 34 deletions(-) diff --git a/CantaTema/components/infrastructure/file_handler/CMakeLists.txt b/CantaTema/components/infrastructure/file_handler/CMakeLists.txt index c129812..2a798ff 100644 --- a/CantaTema/components/infrastructure/file_handler/CMakeLists.txt +++ b/CantaTema/components/infrastructure/file_handler/CMakeLists.txt @@ -30,4 +30,6 @@ target_include_directories(_infra_FILE_HANDLER PRIVATE $ ) +add_dependencies(_infra_FILE_HANDLER mupdf_ext) + add_subdirectory(test) diff --git a/cmake/add_mupdf_library.cmake b/cmake/add_mupdf_library.cmake index c7c248b..f5875e8 100644 --- a/cmake/add_mupdf_library.cmake +++ b/cmake/add_mupdf_library.cmake @@ -1,4 +1,5 @@ include(FetchContent) +include(ExternalProject) if(POLICY CMP0169) cmake_policy(SET CMP0169 OLD) @@ -209,49 +210,29 @@ else() endif() # ============================================================ -# 3.5. Handle Reconfiguration (Clean if flags changed) +# 4. External Build Target using ExternalProject # ============================================================ -# MuPDF's makefiles don't detect changes in environment variables/flags. -# We track the build command and force a clean if it changes. -set(MUPDF_CONFIG_FILE "${CMAKE_BINARY_DIR}/mupdf_build_config.txt") -string(REPLACE ";" " " CURRENT_CONFIG_STR "${BUILD_CMD}") - -if(EXISTS "${MUPDF_CONFIG_FILE}") - file(READ "${MUPDF_CONFIG_FILE}" OLD_CONFIG_STR) -else() - set(OLD_CONFIG_STR "") -endif() - -if(NOT "${CURRENT_CONFIG_STR}" STREQUAL "${OLD_CONFIG_STR}") - message(STATUS "MuPDF build options changed. Cleaning to ensure correct rebuild...") - if(MSVC) - execute_process(COMMAND ${NMAKE_EXE} /f platform/win32/NMakefile clean WORKING_DIRECTORY ${MUPDF_ROOT} OUTPUT_QUIET ERROR_QUIET) - else() - execute_process(COMMAND ${MAKE_EXE} clean OUT=build/release WORKING_DIRECTORY ${MUPDF_ROOT} OUTPUT_QUIET ERROR_QUIET) - endif() - file(WRITE "${MUPDF_CONFIG_FILE}" "${CURRENT_CONFIG_STR}") -endif() - -# ============================================================ -# 4. Build Target -# ============================================================ - -add_custom_target(mupdf_make - COMMAND ${BUILD_CMD} - WORKING_DIRECTORY ${MUPDF_ROOT} - COMMENT "Building MuPDF using native make..." - BYPRODUCTS ${LIB_MUPDF} ${LIB_THIRD} - VERBATIM +ExternalProject_Add( + mupdf_ext + SOURCE_DIR "${MUPDF_ROOT}" + CONFIGURE_COMMAND "" + BUILD_COMMAND ${BUILD_CMD} + BUILD_IN_SOURCE 1 + INSTALL_COMMAND "" + BUILD_BYPRODUCTS "${LIB_MUPDF}" "${LIB_THIRD}" ) +# Maintain alias compatibility +add_custom_target(mupdf_make DEPENDS mupdf_ext) + # ============================================================ # 5. Import Library # ============================================================ # Helper to import the thirdparty lib add_library(mupdf_third STATIC IMPORTED GLOBAL) -add_dependencies(mupdf_third mupdf_make) +add_dependencies(mupdf_third mupdf_ext) set_target_properties(mupdf_third PROPERTIES IMPORTED_LOCATION "${LIB_THIRD}" ) @@ -259,7 +240,7 @@ set_target_properties(mupdf_third PROPERTIES # Main mupdf library add_library(mupdf STATIC IMPORTED GLOBAL) add_library(mupdf::mupdf ALIAS mupdf) -add_dependencies(mupdf mupdf_make) +add_dependencies(mupdf mupdf_ext) set_target_properties(mupdf PROPERTIES IMPORTED_LOCATION "${LIB_MUPDF}" From d0ad771c1dc376670a44ee3f98f0e5a2046b9e67 Mon Sep 17 00:00:00 2001 From: Ismael Casaban Date: Sat, 25 Jul 2026 01:51:22 +0200 Subject: [PATCH 13/15] ci fixes --- cmake/add_mupdf_library.cmake | 16 ++++++++++++++++ cmake/library_install_test.cmake | 7 +++++++ 2 files changed, 23 insertions(+) diff --git a/cmake/add_mupdf_library.cmake b/cmake/add_mupdf_library.cmake index f5875e8..1659521 100644 --- a/cmake/add_mupdf_library.cmake +++ b/cmake/add_mupdf_library.cmake @@ -209,6 +209,22 @@ else() set(LIB_THIRD "${MUPDF_ROOT}/build/release/libmupdf-third.a") endif() +# ============================================================ +# 3.6. Ensure Initial Build of MuPDF on Configure (Fixes MinGW Makefiles) +# ============================================================ + +if(NOT EXISTS "${LIB_MUPDF}" OR NOT EXISTS "${LIB_THIRD}") + message(STATUS "Initial MuPDF build starting at configure time...") + execute_process( + COMMAND ${BUILD_CMD} + WORKING_DIRECTORY ${MUPDF_ROOT} + RESULT_VARIABLE MUPDF_INIT_RESULT + ) + if(NOT MUPDF_INIT_RESULT EQUAL 0) + message(FATAL_ERROR "Initial MuPDF build failed with exit code ${MUPDF_INIT_RESULT}") + endif() +endif() + # ============================================================ # 4. External Build Target using ExternalProject # ============================================================ 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) From faa8334148c9161cb31f686c5fd3fecee09ce0db Mon Sep 17 00:00:00 2001 From: Ismael Casaban Date: Sat, 25 Jul 2026 02:07:29 +0200 Subject: [PATCH 14/15] ci fixes --- .../file_handler/CMakeLists.txt | 2 +- cmake/add_mupdf_library.cmake | 43 ++++++++----------- 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/CantaTema/components/infrastructure/file_handler/CMakeLists.txt b/CantaTema/components/infrastructure/file_handler/CMakeLists.txt index 2a798ff..2a45765 100644 --- a/CantaTema/components/infrastructure/file_handler/CMakeLists.txt +++ b/CantaTema/components/infrastructure/file_handler/CMakeLists.txt @@ -30,6 +30,6 @@ target_include_directories(_infra_FILE_HANDLER PRIVATE $ ) -add_dependencies(_infra_FILE_HANDLER mupdf_ext) +add_dependencies(_infra_FILE_HANDLER mupdf_make) add_subdirectory(test) diff --git a/cmake/add_mupdf_library.cmake b/cmake/add_mupdf_library.cmake index 1659521..24d1c33 100644 --- a/cmake/add_mupdf_library.cmake +++ b/cmake/add_mupdf_library.cmake @@ -1,5 +1,4 @@ include(FetchContent) -include(ExternalProject) if(POLICY CMP0169) cmake_policy(SET CMP0169 OLD) @@ -210,45 +209,37 @@ else() endif() # ============================================================ -# 3.6. Ensure Initial Build of MuPDF on Configure (Fixes MinGW Makefiles) +# 3.5. Ensure Target File Directory and Placeholder Files Exist at Configure Time # ============================================================ -if(NOT EXISTS "${LIB_MUPDF}" OR NOT EXISTS "${LIB_THIRD}") - message(STATUS "Initial MuPDF build starting at configure time...") - execute_process( - COMMAND ${BUILD_CMD} - WORKING_DIRECTORY ${MUPDF_ROOT} - RESULT_VARIABLE MUPDF_INIT_RESULT - ) - if(NOT MUPDF_INIT_RESULT EQUAL 0) - message(FATAL_ERROR "Initial MuPDF build failed with exit code ${MUPDF_INIT_RESULT}") - endif() +get_filename_component(MUPDF_BUILD_DIR "${LIB_MUPDF}" DIRECTORY) +file(MAKE_DIRECTORY "${MUPDF_BUILD_DIR}") +if(NOT EXISTS "${LIB_MUPDF}") + file(TOUCH "${LIB_MUPDF}") +endif() +if(NOT EXISTS "${LIB_THIRD}") + file(TOUCH "${LIB_THIRD}") endif() # ============================================================ -# 4. External Build Target using ExternalProject +# 4. Build Target # ============================================================ -ExternalProject_Add( - mupdf_ext - SOURCE_DIR "${MUPDF_ROOT}" - CONFIGURE_COMMAND "" - BUILD_COMMAND ${BUILD_CMD} - BUILD_IN_SOURCE 1 - INSTALL_COMMAND "" - BUILD_BYPRODUCTS "${LIB_MUPDF}" "${LIB_THIRD}" +add_custom_target(mupdf_make ALL + COMMAND ${BUILD_CMD} + WORKING_DIRECTORY ${MUPDF_ROOT} + COMMENT "Building MuPDF using native make..." + BYPRODUCTS ${LIB_MUPDF} ${LIB_THIRD} + VERBATIM ) -# Maintain alias compatibility -add_custom_target(mupdf_make DEPENDS mupdf_ext) - # ============================================================ # 5. Import Library # ============================================================ # Helper to import the thirdparty lib add_library(mupdf_third STATIC IMPORTED GLOBAL) -add_dependencies(mupdf_third mupdf_ext) +add_dependencies(mupdf_third mupdf_make) set_target_properties(mupdf_third PROPERTIES IMPORTED_LOCATION "${LIB_THIRD}" ) @@ -256,7 +247,7 @@ set_target_properties(mupdf_third PROPERTIES # Main mupdf library add_library(mupdf STATIC IMPORTED GLOBAL) add_library(mupdf::mupdf ALIAS mupdf) -add_dependencies(mupdf mupdf_ext) +add_dependencies(mupdf mupdf_make) set_target_properties(mupdf PROPERTIES IMPORTED_LOCATION "${LIB_MUPDF}" From 4896ec0740bf9fb060d87a5c1b8359c2af86b345 Mon Sep 17 00:00:00 2001 From: Ismael Casaban Date: Sat, 25 Jul 2026 02:33:45 +0200 Subject: [PATCH 15/15] ci fixes --- .../file_handler/CMakeLists.txt | 2 - cmake/add_mupdf_library.cmake | 63 ++++++++----------- 2 files changed, 25 insertions(+), 40 deletions(-) diff --git a/CantaTema/components/infrastructure/file_handler/CMakeLists.txt b/CantaTema/components/infrastructure/file_handler/CMakeLists.txt index 2a45765..c129812 100644 --- a/CantaTema/components/infrastructure/file_handler/CMakeLists.txt +++ b/CantaTema/components/infrastructure/file_handler/CMakeLists.txt @@ -30,6 +30,4 @@ target_include_directories(_infra_FILE_HANDLER PRIVATE $ ) -add_dependencies(_infra_FILE_HANDLER mupdf_make) - add_subdirectory(test) diff --git a/cmake/add_mupdf_library.cmake b/cmake/add_mupdf_library.cmake index 24d1c33..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) # ============================================================ @@ -35,7 +31,6 @@ if(NOT mupdf_src_POPULATED) thirdparty/jbig2dec thirdparty/mujs thirdparty/lcms2 - thirdparty/gumbo-parser ) execute_process( @@ -101,8 +96,6 @@ foreach(DEF IN LISTS MUPDF_DEFINITIONS) endforeach() set(MUPDF_MAKE_OPTIONS - "CC=${CMAKE_C_COMPILER}" - "CXX=${CMAKE_CXX_COMPILER}" HAVE_CURL=no HAVE_FREETYPE=no HAVE_GLFW=no @@ -133,17 +126,9 @@ set(MUPDF_MAKE_OPTIONS HAVE_TIFF=no HAVE_X11=no HAVE_ZXINGCPP=no - HAVE_CJK=no - HAVE_CJK_FULL=no - HAVE_CJK_SINGLE=no - "FONT_FLAGS=" - "TOFU_FLAGS=" - FONT_CJK=no - FONT_SMALL=yes - TOFU_CJK_LANG=no - TOFU_CJK_EXT=no USE_BROTLI=no USE_EXTRACT=no + USE_GUMBO=no USE_LEPTONICA=no USE_LIBARCHIVE=no USE_MUJS=no @@ -191,41 +176,43 @@ else() set(MUPDF_ARCH_FLAGS "-msse4.1") endif() - if(WIN32) - find_program(SH_EXE sh PATHS C:/msys64/usr/bin C:/msys64/ucrt64/bin "C:/Program Files/Git/bin") - if(SH_EXE) - string(REPLACE ";" " " MUPDF_MAKE_OPTIONS_STR "${MUPDF_MAKE_OPTIONS}") - set(BUILD_CMD ${SH_EXE} -c "export PATH=/usr/bin:/ucrt64/bin:C:/msys64/usr/bin:C:/msys64/ucrt64/bin:\$PATH; ${MAKE_EXE} -j${N_CORES} XCFLAGS=\"${MUPDF_ARCH_FLAGS} ${MUPDF_DEFINITIONS_STR}\" ${MUPDF_MAKE_OPTIONS_STR} extract=no build=release OUT=build/release libs") - else() - set(BUILD_CMD ${MAKE_EXE} -j${N_CORES} "XCFLAGS=${MUPDF_ARCH_FLAGS} ${MUPDF_DEFINITIONS_STR}" ${MUPDF_MAKE_OPTIONS} extract=no build=release OUT=build/release libs) - endif() - else() - set(BUILD_CMD ${MAKE_EXE} -j${N_CORES} "XCFLAGS=${MUPDF_ARCH_FLAGS} ${MUPDF_DEFINITIONS_STR}" ${MUPDF_MAKE_OPTIONS} extract=no build=release OUT=build/release libs) - endif() + set(BUILD_CMD ${MAKE_EXE} -j${N_CORES} "XCFLAGS=${MUPDF_ARCH_FLAGS} ${MUPDF_DEFINITIONS_STR}" ${MUPDF_MAKE_OPTIONS} extract=no OUT=build/release-cmake) # Standard Makefile builds into build/release/ - set(LIB_MUPDF "${MUPDF_ROOT}/build/release/libmupdf.a") - set(LIB_THIRD "${MUPDF_ROOT}/build/release/libmupdf-third.a") + set(LIB_MUPDF "${MUPDF_ROOT}/build/release-cmake/libmupdf.a") + set(LIB_THIRD "${MUPDF_ROOT}/build/release-cmake/libmupdf-third.a") endif() # ============================================================ -# 3.5. Ensure Target File Directory and Placeholder Files Exist at Configure Time +# 3.5. Handle Reconfiguration (Clean if flags changed) # ============================================================ -get_filename_component(MUPDF_BUILD_DIR "${LIB_MUPDF}" DIRECTORY) -file(MAKE_DIRECTORY "${MUPDF_BUILD_DIR}") -if(NOT EXISTS "${LIB_MUPDF}") - file(TOUCH "${LIB_MUPDF}") +# MuPDF's makefiles don't detect changes in environment variables/flags. +# We track the build command and force a clean if it changes. +set(MUPDF_CONFIG_FILE "${CMAKE_BINARY_DIR}/mupdf_build_config.txt") +string(REPLACE ";" " " CURRENT_CONFIG_STR "${BUILD_CMD}") + +if(EXISTS "${MUPDF_CONFIG_FILE}") + file(READ "${MUPDF_CONFIG_FILE}" OLD_CONFIG_STR) +else() + set(OLD_CONFIG_STR "") endif() -if(NOT EXISTS "${LIB_THIRD}") - file(TOUCH "${LIB_THIRD}") + +if(NOT "${CURRENT_CONFIG_STR}" STREQUAL "${OLD_CONFIG_STR}") + message(STATUS "MuPDF build options changed. Cleaning to ensure correct rebuild...") + if(MSVC) + execute_process(COMMAND ${NMAKE_EXE} /f platform/win32/NMakefile clean WORKING_DIRECTORY ${MUPDF_ROOT} OUTPUT_QUIET ERROR_QUIET) + else() + execute_process(COMMAND ${MAKE_EXE} clean OUT=build/release-cmake WORKING_DIRECTORY ${MUPDF_ROOT} OUTPUT_QUIET ERROR_QUIET) + endif() + file(WRITE "${MUPDF_CONFIG_FILE}" "${CURRENT_CONFIG_STR}") endif() # ============================================================ # 4. Build Target # ============================================================ -add_custom_target(mupdf_make ALL +add_custom_target(mupdf_make COMMAND ${BUILD_CMD} WORKING_DIRECTORY ${MUPDF_ROOT} COMMENT "Building MuPDF using native make..." @@ -254,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