Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }}

Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down
127 changes: 42 additions & 85 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
################################
Expand Down Expand Up @@ -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()
Expand All @@ -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)
Expand All @@ -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 <algorithm>")
file(WRITE "${llama_SOURCE_DIR}/src/unicode.cpp" "#include <algorithm>\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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ std::vector<float> LlamaContextImpl::decode_and_get_embedding(const std::vector<

llama_batch batch = llama_batch_get_one(
const_cast<llama_token*>(reinterpret_cast<const llama_token*>(tokens.data())),
static_cast<int32_t>(tokens.size()), 0, 0);
static_cast<int32_t>(tokens.size()));

fn_llama_kv_cache_clear(m_ctx);

Expand Down
6 changes: 1 addition & 5 deletions cmake/add_mupdf_library.cmake
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
include(FetchContent)

if(POLICY CMP0169)
cmake_policy(SET CMP0169 OLD)
endif()

# ============================================================
# 1. Fetch MuPDF (Source only)
# ============================================================
Expand Down Expand Up @@ -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}"
)
)
7 changes: 7 additions & 0 deletions cmake/library_install_test.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading