Skip to content

Commit d5d831d

Browse files
bandotiggerganov
andcommitted
cmake: add ggml find package (llama/11369)
* Add initial ggml cmake package * Add build numbers to ggml find-package * Expand variables with GGML_ prefix * Guard against adding to cache variable twice * Add git to msys2 workflow * Handle ggml-cpu-* variants * Link ggml/ggml-base libraries to their targets * Replace main-cmake-pkg with simple-cmake-pkg * Interface features require c_std_90 * Fix typo * Removed unnecessary bracket from status message * Update examples/simple-cmake-pkg/README.md Co-authored-by: Georgi Gerganov <[email protected]> * Update examples/simple-cmake-pkg/README.md Co-authored-by: Georgi Gerganov <[email protected]> --------- Co-authored-by: Georgi Gerganov <[email protected]>
1 parent 7230a6e commit d5d831d

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

ggml/CMakeLists.txt

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,3 +267,74 @@ if (GGML_STANDALONE)
267267
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ggml.pc
268268
DESTINATION share/pkgconfig)
269269
endif()
270+
271+
#
272+
# Create CMake package
273+
#
274+
275+
# Generate version info based on git commit.
276+
277+
find_program(GIT_EXE NAMES git git.exe REQUIRED NO_CMAKE_FIND_ROOT_PATH)
278+
execute_process(COMMAND ${GIT_EXE} rev-list --count HEAD
279+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
280+
OUTPUT_VARIABLE GGML_BUILD_NUMBER
281+
OUTPUT_STRIP_TRAILING_WHITESPACE
282+
)
283+
284+
if(GGML_BUILD_NUMBER EQUAL 1)
285+
message(WARNING "GGML build version fixed at 1 likely due to a shallow clone.")
286+
endif()
287+
288+
execute_process(COMMAND ${GIT_EXE} rev-parse --short HEAD
289+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
290+
OUTPUT_VARIABLE GGML_BUILD_COMMIT
291+
OUTPUT_STRIP_TRAILING_WHITESPACE
292+
)
293+
294+
# Capture variables prefixed with GGML_.
295+
296+
set(variable_set_statements
297+
"
298+
####### Expanded from @GGML_VARIABLES_EXPANED@ by configure_package_config_file() #######
299+
####### Any changes to this file will be overwritten by the next CMake run #######
300+
301+
")
302+
303+
set(GGML_SHARED_LIB ${BUILD_SHARED_LIBS})
304+
305+
get_cmake_property(all_variables VARIABLES)
306+
foreach(variable_name IN LISTS all_variables)
307+
if(variable_name MATCHES "^GGML_")
308+
string(REPLACE ";" "\\;"
309+
variable_value "${${variable_name}}")
310+
311+
set(variable_set_statements
312+
"${variable_set_statements}set(${variable_name} \"${variable_value}\")\n")
313+
endif()
314+
endforeach()
315+
316+
set(GGML_VARIABLES_EXPANDED ${variable_set_statements})
317+
318+
# Create the CMake package and set install location.
319+
320+
set(GGML_INSTALL_VERSION 0.0.${GGML_BUILD_NUMBER})
321+
set(GGML_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Location of header files")
322+
set(GGML_LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Location of library files")
323+
set(GGML_BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Location of binary files")
324+
325+
configure_package_config_file(
326+
${CMAKE_CURRENT_SOURCE_DIR}/cmake/ggml-config.cmake.in
327+
${CMAKE_CURRENT_BINARY_DIR}/ggml-config.cmake
328+
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ggml
329+
PATH_VARS GGML_INCLUDE_INSTALL_DIR
330+
GGML_LIB_INSTALL_DIR
331+
GGML_BIN_INSTALL_DIR)
332+
333+
write_basic_package_version_file(
334+
${CMAKE_CURRENT_BINARY_DIR}/ggml-version.cmake
335+
VERSION ${GGML_INSTALL_VERSION}
336+
COMPATIBILITY SameMajorVersion)
337+
338+
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ggml-config.cmake
339+
${CMAKE_CURRENT_BINARY_DIR}/ggml-version.cmake
340+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ggml)

ggml/src/CMakeLists.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,17 @@ function(ggml_add_backend_library backend)
250250
target_compile_definitions(${backend} PRIVATE GGML_BACKEND_BUILD)
251251
target_compile_definitions(${backend} PUBLIC GGML_BACKEND_SHARED)
252252
endif()
253+
254+
if(NOT GGML_AVAILABLE_BACKENDS)
255+
set(GGML_AVAILABLE_BACKENDS "${backend}"
256+
CACHE INTERNAL "List of backends for cmake package")
257+
else()
258+
list(FIND GGML_AVAILABLE_BACKENDS "${backend}" has_backend)
259+
if(has_backend EQUAL -1)
260+
set(GGML_AVAILABLE_BACKENDS "${GGML_AVAILABLE_BACKENDS};${backend}"
261+
CACHE INTERNAL "List of backends for cmake package")
262+
endif()
263+
endif()
253264
endfunction()
254265

255266
function(ggml_add_backend backend)

0 commit comments

Comments
 (0)