From 515bd7c9a5343bac171e18dc10d1f4687ce5cb12 Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Fri, 20 Feb 2026 08:53:19 +0100 Subject: [PATCH] cmake : respect GGML_LIB_INSTALL_DIR and LLAMA_LIB_INSTALL_DIR This commit addresses an issue where the CMake options `GGML_LIB_INSTALL_DIR` and `LLAMA_LIB_INSTALL_DIR` currently only affect the generated cmake config files and not the actual installation of the libraries. The motivation for this change is that if these options are set, a project that uses cmake find_package to find ggml will fail to configure: ```console $ cmake -S . -B build CMake Error at /work/ai/llama.cpp/install/lib/cmake/ggml/ggml-config.cmake:11 (message): File or directory /work/ai/llama.cpp/install/llama.cpp referenced by variable GGML_LIB_DIR does not exist ! Call Stack (most recent call first): /work/ai/llama.cpp/install/lib/cmake/ggml/ggml-config.cmake:259 (set_and_check) CMakeLists.txt:7 (find_package) ``` Resolves: https://github.com/ggml-org/llama.cpp/issues/19748 --- CMakeLists.txt | 4 +++- ggml/CMakeLists.txt | 13 ++++++++----- ggml/cmake/ggml-config.cmake.in | 3 ++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 32542ecd27..82e24b5b25 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -246,7 +246,9 @@ set_target_properties(llama PROPERTIES PUBLIC_HEADER "${LLAMA_PUBLIC_HEADERS}") -install(TARGETS llama LIBRARY PUBLIC_HEADER) +install(TARGETS llama + LIBRARY DESTINATION ${LLAMA_LIB_INSTALL_DIR} + PUBLIC_HEADER DESTINATION ${LLAMA_INCLUDE_INSTALL_DIR}) configure_package_config_file( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/llama-config.cmake.in diff --git a/ggml/CMakeLists.txt b/ggml/CMakeLists.txt index 4323afe57b..c53d64d73d 100644 --- a/ggml/CMakeLists.txt +++ b/ggml/CMakeLists.txt @@ -309,6 +309,10 @@ endif () include(CMakePackageConfigHelpers) +set(GGML_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Location of header files") +set(GGML_LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Location of library files") +set(GGML_BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Location of binary files") + # all public headers set(GGML_PUBLIC_HEADERS include/ggml.h @@ -333,8 +337,10 @@ set_target_properties(ggml PROPERTIES PUBLIC_HEADER "${GGML_PUBLIC_HEADERS}") #if (GGML_METAL) # set_target_properties(ggml PROPERTIES RESOURCE "${CMAKE_CURRENT_SOURCE_DIR}/src/ggml-metal.metal") #endif() -install(TARGETS ggml LIBRARY PUBLIC_HEADER) -install(TARGETS ggml-base LIBRARY) +install(TARGETS ggml + LIBRARY DESTINATION ${GGML_LIB_INSTALL_DIR} + PUBLIC_HEADER DESTINATION ${GGML_INCLUDE_INSTALL_DIR}) +install(TARGETS ggml-base LIBRARY DESTINATION ${GGML_LIB_INSTALL_DIR}) if (GGML_STANDALONE) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ggml.pc.in @@ -378,9 +384,6 @@ set(GGML_VARIABLES_EXPANDED ${variable_set_statements}) # Create the CMake package and set install location. set(GGML_INSTALL_VERSION ${GGML_VERSION}) -set(GGML_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Location of header files") -set(GGML_LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Location of library files") -set(GGML_BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Location of binary files") configure_package_config_file( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/ggml-config.cmake.in diff --git a/ggml/cmake/ggml-config.cmake.in b/ggml/cmake/ggml-config.cmake.in index 91c9d5cd34..e83850c1d9 100644 --- a/ggml/cmake/ggml-config.cmake.in +++ b/ggml/cmake/ggml-config.cmake.in @@ -112,7 +112,8 @@ if(NOT TARGET ggml::ggml) add_library(ggml::ggml UNKNOWN IMPORTED) set_target_properties(ggml::ggml PROPERTIES - IMPORTED_LOCATION "${GGML_LIBRARY}") + IMPORTED_LOCATION "${GGML_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${GGML_INCLUDE_DIR}") find_library(GGML_BASE_LIBRARY ggml-base REQUIRED