1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
From: Christian Kastner <ckk@debian.org>
Date: Mon, 4 Aug 2025 10:00:53 +0200
Subject: cmake: Add GGML_BACKEND_DIR option
This can be used by distributions to specify where to look for backends
when ggml is built with GGML_BACKEND_DL=ON.
Forwarded: https://github.com/ggml-org/llama.cpp/pull/15074
---
CMakeLists.txt | 5 +++--
cmake/ggml-config.cmake.in | 2 +-
src/CMakeLists.txt | 13 ++++++++++++-
src/ggml-backend-reg.cpp | 3 +++
4 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1e6660b..cdba8c7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -39,8 +39,9 @@ if (WIN32)
set(CMAKE_SHARED_MODULE_PREFIX "")
endif()
-option(BUILD_SHARED_LIBS "ggml: build shared libraries" ${BUILD_SHARED_LIBS_DEFAULT})
-option(GGML_BACKEND_DL "ggml: build backends as dynamic libraries (requires BUILD_SHARED_LIBS)" OFF)
+option(BUILD_SHARED_LIBS "ggml: build shared libraries" ${BUILD_SHARED_LIBS_DEFAULT})
+option(GGML_BACKEND_DL "ggml: build backends as dynamic libraries (requires BUILD_SHARED_LIBS)" OFF)
+set(GGML_BACKEND_DIR "" CACHE PATH "ggml: target directory for dynamic libraries (requires GGML_BACKEND_DL")
#
# option list
diff --git a/cmake/ggml-config.cmake.in b/cmake/ggml-config.cmake.in
index 9820c6e..6ccba60 100644
--- a/cmake/ggml-config.cmake.in
+++ b/cmake/ggml-config.cmake.in
@@ -98,7 +98,7 @@ foreach(_ggml_backend ${GGML_AVAILABLE_BACKENDS})
find_library(${_ggml_backend_pfx}_LIBRARY ${_ggml_backend}
REQUIRED
- HINTS ${GGML_LIB_DIR}
+ HINTS ${GGML_LIB_DIR} ${GGML_BACKEND_DIR}
NO_CMAKE_FIND_ROOT_PATH)
message(STATUS "Found ${${_ggml_backend_pfx}_LIBRARY}")
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index b4f2fa6..51078f1 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -215,6 +215,13 @@ add_library(ggml
ggml-backend-reg.cpp)
add_library(ggml::ggml ALIAS ggml)
+if (GGML_BACKEND_DIR)
+ if (NOT GGML_BACKEND_DL)
+ message(FATAL_ERROR "GGML_BACKEND_DIR requires BUILD_BACKEND_DL")
+ endif()
+ target_compile_definitions(ggml PUBLIC GGML_BACKEND_DIR="${GGML_BACKEND_DIR}")
+endif()
+
target_link_libraries(ggml PUBLIC ggml-base)
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
@@ -229,7 +236,11 @@ function(ggml_add_backend_library backend)
set_target_properties(${backend} PROPERTIES VERSION ${GGML_INSTALL_VERSION} SOVERSION 0)
target_compile_definitions(${backend} PRIVATE GGML_BACKEND_DL)
add_dependencies(ggml ${backend})
- install(TARGETS ${backend} LIBRARY DESTINATION ${CMAKE_INSTALL_BINDIR})
+ if (GGML_BACKEND_DIR)
+ install(TARGETS ${backend} LIBRARY DESTINATION ${GGML_BACKEND_DIR})
+ else()
+ install(TARGETS ${backend} LIBRARY DESTINATION ${CMAKE_INSTALL_BINDIR})
+ endif()
else()
add_library(${backend} ${ARGN})
set_target_properties(${backend} PROPERTIES VERSION ${GGML_INSTALL_VERSION} SOVERSION 0)
diff --git a/src/ggml-backend-reg.cpp b/src/ggml-backend-reg.cpp
index 042ea77..1028599 100644
--- a/src/ggml-backend-reg.cpp
+++ b/src/ggml-backend-reg.cpp
@@ -491,6 +491,9 @@ static ggml_backend_reg_t ggml_backend_load_best(const char * name, bool silent,
std::vector<fs::path> search_paths;
if (user_search_path == nullptr) {
+#ifdef GGML_BACKEND_DIR
+ search_paths.push_back(fs::u8path(GGML_BACKEND_DIR));
+#endif
// default search paths: executable directory, current directory
search_paths.push_back(get_executable_path());
search_paths.push_back(fs::current_path());
|