mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-10-28 08:31:25 +00:00 
			
		
		
		
	cmake : add relocatable Llama package (#2960)
* Keep static libs and headers with install * Add logic to generate Config package * Use proper build info * Add llama as import library * Prefix target with package name * Add example project using CMake package * Update README * Update README * Remove trailing whitespace
This commit is contained in:
		| @@ -172,8 +172,8 @@ if (LLAMA_METAL) | |||||||
|     find_library(METALKIT_FRAMEWORK         MetalKit                REQUIRED) |     find_library(METALKIT_FRAMEWORK         MetalKit                REQUIRED) | ||||||
|  |  | ||||||
|     message(STATUS "Metal framework found") |     message(STATUS "Metal framework found") | ||||||
|  |     set(GGML_HEADERS_METAL ggml-metal.h) | ||||||
|     set(GGML_SOURCES_METAL ggml-metal.m ggml-metal.h) |     set(GGML_SOURCES_METAL ggml-metal.m) | ||||||
|  |  | ||||||
|     add_compile_definitions(GGML_USE_METAL) |     add_compile_definitions(GGML_USE_METAL) | ||||||
|     if (LLAMA_METAL_NDEBUG) |     if (LLAMA_METAL_NDEBUG) | ||||||
| @@ -192,7 +192,6 @@ if (LLAMA_METAL) | |||||||
|         ${METALKIT_FRAMEWORK} |         ${METALKIT_FRAMEWORK} | ||||||
|         ) |         ) | ||||||
| endif() | endif() | ||||||
|  |  | ||||||
| if (LLAMA_BLAS) | if (LLAMA_BLAS) | ||||||
|     if (LLAMA_STATIC) |     if (LLAMA_STATIC) | ||||||
|         set(BLA_STATIC ON) |         set(BLA_STATIC ON) | ||||||
| @@ -269,7 +268,8 @@ if (LLAMA_BLAS) | |||||||
| endif() | endif() | ||||||
|  |  | ||||||
| if (LLAMA_K_QUANTS) | if (LLAMA_K_QUANTS) | ||||||
|     set(GGML_SOURCES_EXTRA ${GGML_SOURCES_EXTRA} k_quants.c k_quants.h) |     set(GGML_HEADERS_EXTRA k_quants.h) | ||||||
|  |     set(GGML_SOURCES_EXTRA k_quants.c) | ||||||
|     add_compile_definitions(GGML_USE_K_QUANTS) |     add_compile_definitions(GGML_USE_K_QUANTS) | ||||||
|     if (LLAMA_QKK_64) |     if (LLAMA_QKK_64) | ||||||
|         add_compile_definitions(GGML_QKK_64) |         add_compile_definitions(GGML_QKK_64) | ||||||
| @@ -285,7 +285,8 @@ if (LLAMA_CUBLAS) | |||||||
|  |  | ||||||
|         enable_language(CUDA) |         enable_language(CUDA) | ||||||
|  |  | ||||||
|         set(GGML_SOURCES_CUDA ggml-cuda.cu ggml-cuda.h) |         set(GGML_HEADERS_CUDA ggml-cuda.h) | ||||||
|  |         set(GGML_SOURCES_CUDA ggml-cuda.cu) | ||||||
|  |  | ||||||
|         add_compile_definitions(GGML_USE_CUBLAS) |         add_compile_definitions(GGML_USE_CUBLAS) | ||||||
| #        if (LLAMA_CUDA_CUBLAS) | #        if (LLAMA_CUDA_CUBLAS) | ||||||
| @@ -333,6 +334,7 @@ if (LLAMA_MPI) | |||||||
|     find_package(MPI) |     find_package(MPI) | ||||||
|     if (MPI_C_FOUND) |     if (MPI_C_FOUND) | ||||||
|         message(STATUS "MPI found") |         message(STATUS "MPI found") | ||||||
|  |         set(GGML_HEADERS_MPI ggml-mpi.h) | ||||||
|         set(GGML_SOURCES_MPI ggml-mpi.c ggml-mpi.h) |         set(GGML_SOURCES_MPI ggml-mpi.c ggml-mpi.h) | ||||||
|         add_compile_definitions(GGML_USE_MPI) |         add_compile_definitions(GGML_USE_MPI) | ||||||
|         add_compile_definitions(${MPI_C_COMPILE_DEFINITIONS}) |         add_compile_definitions(${MPI_C_COMPILE_DEFINITIONS}) | ||||||
| @@ -355,7 +357,8 @@ if (LLAMA_CLBLAST) | |||||||
|     if (CLBlast_FOUND) |     if (CLBlast_FOUND) | ||||||
|         message(STATUS "CLBlast found") |         message(STATUS "CLBlast found") | ||||||
|  |  | ||||||
|         set(GGML_SOURCES_OPENCL ggml-opencl.cpp ggml-opencl.h) |         set(GGML_HEADERS_OPENCL ggml-opencl.h) | ||||||
|  |         set(GGML_SOURCES_OPENCL ggml-opencl.cpp) | ||||||
|  |  | ||||||
|         add_compile_definitions(GGML_USE_CLBLAST) |         add_compile_definitions(GGML_USE_CLBLAST) | ||||||
|  |  | ||||||
| @@ -631,11 +634,11 @@ add_library(ggml OBJECT | |||||||
|             ggml.h |             ggml.h | ||||||
|             ggml-alloc.c |             ggml-alloc.c | ||||||
|             ggml-alloc.h |             ggml-alloc.h | ||||||
|             ${GGML_SOURCES_CUDA} |             ${GGML_SOURCES_CUDA} ${GGML_HEADERS_CUDA} | ||||||
|             ${GGML_SOURCES_OPENCL} |             ${GGML_SOURCES_OPENCL} ${GGML_HEADERS_OPENCL} | ||||||
|             ${GGML_SOURCES_METAL} |             ${GGML_SOURCES_METAL} ${GGML_HEADERS_METAL} | ||||||
|             ${GGML_SOURCES_MPI} |             ${GGML_SOURCES_MPI} ${GGML_HEADERS_MPI} | ||||||
|             ${GGML_SOURCES_EXTRA} |             ${GGML_SOURCES_EXTRA} ${GGML_HEADERS_EXTRA} | ||||||
|             ) |             ) | ||||||
|  |  | ||||||
| target_include_directories(ggml PUBLIC . ${LLAMA_EXTRA_INCLUDES}) | target_include_directories(ggml PUBLIC . ${LLAMA_EXTRA_INCLUDES}) | ||||||
| @@ -673,14 +676,53 @@ if (BUILD_SHARED_LIBS) | |||||||
|     if (LLAMA_METAL) |     if (LLAMA_METAL) | ||||||
|         set_target_properties(llama PROPERTIES RESOURCE "${CMAKE_CURRENT_SOURCE_DIR}/ggml-metal.metal") |         set_target_properties(llama PROPERTIES RESOURCE "${CMAKE_CURRENT_SOURCE_DIR}/ggml-metal.metal") | ||||||
|     endif() |     endif() | ||||||
|     install(TARGETS llama LIBRARY) |  | ||||||
| endif() | endif() | ||||||
|  |  | ||||||
|  |  | ||||||
| # | # | ||||||
| # install | # install | ||||||
| # | # | ||||||
|  |  | ||||||
| include(GNUInstallDirs) | include(GNUInstallDirs) | ||||||
|  | include(CMakePackageConfigHelpers) | ||||||
|  |  | ||||||
|  | set(LLAMA_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} | ||||||
|  |     CACHE PATH "Location of header files") | ||||||
|  | set(LLAMA_LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR} | ||||||
|  |     CACHE PATH "Location of library files") | ||||||
|  | set(LLAMA_BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR} | ||||||
|  |     CACHE PATH "Location of binary files") | ||||||
|  | set(LLAMA_BUILD_NUMBER ${BUILD_NUMBER}) | ||||||
|  | set(LLAMA_BUILD_COMMIT ${BUILD_COMMIT}) | ||||||
|  | set(LLAMA_INSTALL_VERSION 0.0.${BUILD_NUMBER}) | ||||||
|  |  | ||||||
|  | configure_package_config_file( | ||||||
|  |         ${CMAKE_CURRENT_SOURCE_DIR}/scripts/LlamaConfig.cmake.in | ||||||
|  |         ${CMAKE_CURRENT_BINARY_DIR}/LlamaConfig.cmake | ||||||
|  |     INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Llama | ||||||
|  |     PATH_VARS LLAMA_INCLUDE_INSTALL_DIR | ||||||
|  |               LLAMA_LIB_INSTALL_DIR | ||||||
|  |               LLAMA_BIN_INSTALL_DIR ) | ||||||
|  |  | ||||||
|  | write_basic_package_version_file( | ||||||
|  |         ${CMAKE_CURRENT_BINARY_DIR}/LlamaConfigVersion.cmake | ||||||
|  |     VERSION ${LLAMA_INSTALL_VERSION} | ||||||
|  |     COMPATIBILITY SameMajorVersion) | ||||||
|  |  | ||||||
|  | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/LlamaConfig.cmake | ||||||
|  |               ${CMAKE_CURRENT_BINARY_DIR}/LlamaConfigVersion.cmake | ||||||
|  |         DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Llama) | ||||||
|  |  | ||||||
|  | set(GGML_PUBLIC_HEADERS "ggml.h" | ||||||
|  |         "${GGML_HEADERS_CUDA}" "${GGML_HEADERS_OPENCL}" | ||||||
|  |         "${GGML_HEADERS_METAL}" "${GGML_HEADERS_MPI}" "${GGML_HEADERS_EXTRA}") | ||||||
|  |  | ||||||
|  | set_target_properties(ggml PROPERTIES PUBLIC_HEADER "${GGML_PUBLIC_HEADERS}") | ||||||
|  | install(TARGETS ggml PUBLIC_HEADER) | ||||||
|  |  | ||||||
|  | set_target_properties(llama PROPERTIES PUBLIC_HEADER llama.h) | ||||||
|  | install(TARGETS llama LIBRARY PUBLIC_HEADER) | ||||||
|  |  | ||||||
| install( | install( | ||||||
|     FILES convert.py |     FILES convert.py | ||||||
|     PERMISSIONS |     PERMISSIONS | ||||||
|   | |||||||
							
								
								
									
										51
									
								
								examples/main-cmake-pkg/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								examples/main-cmake-pkg/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | |||||||
|  | # Prerequisites | ||||||
|  | *.d | ||||||
|  |  | ||||||
|  | # Compiled Object files | ||||||
|  | *.slo | ||||||
|  | *.lo | ||||||
|  | *.o | ||||||
|  | *.obj | ||||||
|  |  | ||||||
|  | # Precompiled Headers | ||||||
|  | *.gch | ||||||
|  | *.pch | ||||||
|  |  | ||||||
|  | # Compiled Dynamic libraries | ||||||
|  | *.so | ||||||
|  | *.dylib | ||||||
|  | *.dll | ||||||
|  |  | ||||||
|  | # Fortran module files | ||||||
|  | *.mod | ||||||
|  | *.smod | ||||||
|  |  | ||||||
|  | # Compiled Static libraries | ||||||
|  | *.lai | ||||||
|  | *.la | ||||||
|  | *.a | ||||||
|  | *.lib | ||||||
|  |  | ||||||
|  | # Executables | ||||||
|  | *.exe | ||||||
|  | *.out | ||||||
|  | *.app | ||||||
|  |  | ||||||
|  | *.gguf | ||||||
|  |  | ||||||
|  | *.log | ||||||
|  | .DS_Store | ||||||
|  | .build/ | ||||||
|  | .cache/ | ||||||
|  | .direnv/ | ||||||
|  | .envrc | ||||||
|  | .swiftpm | ||||||
|  | .venv | ||||||
|  | .clang-tidy | ||||||
|  | .vs/ | ||||||
|  | .vscode/ | ||||||
|  |  | ||||||
|  | build*/ | ||||||
|  | out/ | ||||||
|  | tmp/ | ||||||
|  |  | ||||||
							
								
								
									
										36
									
								
								examples/main-cmake-pkg/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								examples/main-cmake-pkg/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | |||||||
|  | cmake_minimum_required(VERSION 3.12) | ||||||
|  | project("main-cmake-pkg" C CXX) | ||||||
|  | set(TARGET main-cmake-pkg) | ||||||
|  |  | ||||||
|  | find_package(Llama 0.0.1 REQUIRED) | ||||||
|  |  | ||||||
|  | # Bake common functionality in with target. Because applications | ||||||
|  | # using the relocatable Llama package should be outside of the | ||||||
|  | # source tree, main-cmake-pkg pretends the dependencies are built-in. | ||||||
|  |  | ||||||
|  | set(_common_path "${CMAKE_CURRENT_LIST_DIR}/../../common") | ||||||
|  | add_library(common OBJECT | ||||||
|  |     ${_common_path}/common.h | ||||||
|  |     ${_common_path}/common.cpp | ||||||
|  |     ${_common_path}/console.h | ||||||
|  |     ${_common_path}/console.cpp | ||||||
|  |     ${_common_path}/grammar-parser.h | ||||||
|  |     ${_common_path}/grammar-parser.cpp | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  | # WARNING: because build-info.h is auto-generated, it will only | ||||||
|  | # be available after the user has built the llama.cpp sources. | ||||||
|  | # | ||||||
|  | configure_file(${_common_path}/../build-info.h | ||||||
|  |     ${CMAKE_CURRENT_BINARY_DIR}/build-info.h | ||||||
|  |     COPYONLY) | ||||||
|  |  | ||||||
|  | target_include_directories(common PUBLIC ${LLAMA_INCLUDE_DIR} | ||||||
|  |     ${CMAKE_CURRENT_BINARY_DIR}) | ||||||
|  |  | ||||||
|  | add_executable(${TARGET} ${CMAKE_CURRENT_LIST_DIR}/../main/main.cpp) | ||||||
|  | target_include_directories(${TARGET} PRIVATE ${_common_path}) | ||||||
|  | install(TARGETS ${TARGET} RUNTIME) | ||||||
|  | target_link_libraries(${TARGET} PRIVATE common llama ${CMAKE_THREAD_LIBS_INIT}) | ||||||
|  | target_compile_features(${TARGET} PRIVATE cxx_std_11) | ||||||
|  |  | ||||||
							
								
								
									
										37
									
								
								examples/main-cmake-pkg/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								examples/main-cmake-pkg/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | # llama.cpp/example/main-cmake-pkg | ||||||
|  |  | ||||||
|  | This program builds the [main](../main) application using a relocatable CMake package. It serves as an example of using the `find_package()` CMake command to conveniently include [llama.cpp](https://github.com/ggerganov/llama.cpp) in projects which live outside of the source tree. | ||||||
|  |  | ||||||
|  | ## Building | ||||||
|  |  | ||||||
|  | Because this example is "outside of the source tree", it is important to first build/install llama.cpp using CMake. An example is provided here, but please see the [llama.cpp build instructions](../..) for more detailed build instructions. | ||||||
|  |  | ||||||
|  | ### Considerations | ||||||
|  |  | ||||||
|  | When hardware acceleration libraries are used (e.g. CUBlas, Metal, CLBlast, etc.), CMake must be able to locate the associated CMake package. In the example below, when building _main-cmake-pkg_ notice the `CMAKE_PREFIX_PATH` includes the Llama CMake package location _in addition to_ the CLBlast package—which was used when compiling _llama.cpp_. | ||||||
|  |  | ||||||
|  | ### Build llama.cpp and install to C:\LlamaCPP directory | ||||||
|  |  | ||||||
|  | In this case, CLBlast was already installed so the CMake package is referenced in `CMAKE_PREFIX_PATH`. | ||||||
|  |  | ||||||
|  | ```cmd | ||||||
|  | git clone https://github.com/ggerganov/llama.cpp | ||||||
|  | cd llama.cpp | ||||||
|  | mkdir build | ||||||
|  | cd build | ||||||
|  | cmake .. -DBUILD_SHARED_LIBS=OFF -DLLAMA_CLBLAST=ON -DCMAKE_PREFIX_PATH=C:/CLBlast/lib/cmake/CLBlast -G "Visual Studio 17 2022" -A x64 | ||||||
|  | cmake --build . --config Release | ||||||
|  | cmake --install . --prefix C:/LlamaCPP | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Build main-cmake-pkg | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ```cmd | ||||||
|  | cd ..\examples\main-cmake-pkg | ||||||
|  | mkdir build | ||||||
|  | cd build | ||||||
|  | cmake .. -DBUILD_SHARED_LIBS=OFF -DCMAKE_PREFIX_PATH="C:/CLBlast/lib/cmake/CLBlast;C:/LlamaCPP/lib/cmake/Llama" -G "Visual Studio 17 2022" -A x64 | ||||||
|  | cmake --build . --config Release | ||||||
|  | cmake --install . --prefix C:/MyLlamaApp | ||||||
|  | ``` | ||||||
							
								
								
									
										69
									
								
								scripts/LlamaConfig.cmake.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								scripts/LlamaConfig.cmake.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | |||||||
|  | set(LLAMA_VERSION @LLAMA_INSTALL_VERSION@) | ||||||
|  | set(LLAMA_BUILD_COMMIT @LLAMA_BUILD_COMMIT@) | ||||||
|  | set(LLAMA_BUILD_NUMBER @LLAMA_BUILD_NUMBER@) | ||||||
|  | set(LLAMA_SHARED_LIB @BUILD_SHARED_LIBS@) | ||||||
|  | set(LLAMA_BLAS @LLAMA_BLAS@) | ||||||
|  | set(LLAMA_CUBLAS @LLAMA_CUBLAS@) | ||||||
|  | set(LLAMA_METAL @LLAMA_METAL@) | ||||||
|  | set(LLAMA_MPI @LLAMA_MPI@) | ||||||
|  | set(LLAMA_CLBLAST @LLAMA_CLBLAST@) | ||||||
|  | set(LLAMA_HIPBLAS @LLAMA_HIPBLAS@) | ||||||
|  | set(LLAMA_ACCELERATE @LLAMA_ACCELERATE@) | ||||||
|  |  | ||||||
|  | @PACKAGE_INIT@ | ||||||
|  |  | ||||||
|  | set_and_check(LLAMA_INCLUDE_DIR "@PACKAGE_LLAMA_INCLUDE_INSTALL_DIR@") | ||||||
|  | set_and_check(LLAMA_LIB_DIR "@PACKAGE_LLAMA_LIB_INSTALL_DIR@") | ||||||
|  | set_and_check(LLAMA_BIN_DIR "@PACKAGE_LLAMA_BIN_INSTALL_DIR@") | ||||||
|  |  | ||||||
|  | # Ensure transient dependencies satisfied | ||||||
|  |  | ||||||
|  | find_package(Threads REQUIRED) | ||||||
|  | if (APPLE AND LLAMA_ACCELERATE) | ||||||
|  |     find_library(ACCELERATE_FRAMEWORK Accelerate REQUIRED) | ||||||
|  | endif() | ||||||
|  |  | ||||||
|  | if (LLAMA_BLAS) | ||||||
|  |     find_package(BLAS REQUIRED) | ||||||
|  | endif() | ||||||
|  |  | ||||||
|  | if (LLAMA_CUBLAS) | ||||||
|  |     find_package(CUDAToolkit REQUIRED) | ||||||
|  | endif() | ||||||
|  |  | ||||||
|  | if (LLAMA_METAL) | ||||||
|  |     find_library(FOUNDATION_LIBRARY Foundation REQUIRED) | ||||||
|  |     find_library(METAL_FRAMEWORK Metal REQUIRED) | ||||||
|  |     find_library(METALKIT_FRAMEWORK MetalKit REQUIRED) | ||||||
|  | endif() | ||||||
|  |  | ||||||
|  | if (LLAMA_MPI) | ||||||
|  |     find_package(MPI REQUIRED) | ||||||
|  | endif() | ||||||
|  |  | ||||||
|  | if (LLAMA_CLBLAST) | ||||||
|  |     find_package(CLBlast REQUIRED) | ||||||
|  | endif() | ||||||
|  |  | ||||||
|  | if (LLAMA_HIPBLAS) | ||||||
|  |     find_package(hip REQUIRED) | ||||||
|  |     find_package(hipblas REQUIRED) | ||||||
|  |     find_package(rocblas REQUIRED) | ||||||
|  | endif() | ||||||
|  |  | ||||||
|  | find_library(llama_LIBRARY llama | ||||||
|  |     REQUIRED | ||||||
|  |     HINTS ${LLAMA_LIB_DIR}) | ||||||
|  |  | ||||||
|  | set(_llama_link_deps "Threads::Threads" "@LLAMA_EXTRA_LIBS@") | ||||||
|  | add_library(llama UNKNOWN IMPORTED) | ||||||
|  | set_target_properties(llama | ||||||
|  |     PROPERTIES | ||||||
|  |         INTERFACE_INCLUDE_DIRECTORIES "${LLAMA_INCLUDE_DIR}" | ||||||
|  |         INTERFACE_LINK_LIBRARIES "${_llama_link_deps}" | ||||||
|  |         IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" | ||||||
|  |         IMPORTED_LOCATION "${llama_LIBRARY}" | ||||||
|  |         INTERFACE_COMPILE_FEATURES cxx_std_11 | ||||||
|  |         POSITION_INDEPENDENT_CODE ON ) | ||||||
|  |  | ||||||
|  | check_required_components(Llama) | ||||||
		Reference in New Issue
	
	Block a user
	 bandoti
					bandoti