File: cmake-Add-GGML_BACKEND_DIR-option.patch

package info (click to toggle)
ggml 0.0~git20250712.d62df60-4
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 15,396 kB
  • sloc: cpp: 88,695; ansic: 36,758; objc: 6,050; lisp: 5,741; python: 1,465; sh: 626; makefile: 52
file content (89 lines) | stat: -rw-r--r-- 3,668 bytes parent folder | download | duplicates (2)
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());