mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-10-30 08:42:00 +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) | ||||
|  | ||||
|     message(STATUS "Metal framework found") | ||||
|  | ||||
|     set(GGML_SOURCES_METAL ggml-metal.m ggml-metal.h) | ||||
|     set(GGML_HEADERS_METAL ggml-metal.h) | ||||
|     set(GGML_SOURCES_METAL ggml-metal.m) | ||||
|  | ||||
|     add_compile_definitions(GGML_USE_METAL) | ||||
|     if (LLAMA_METAL_NDEBUG) | ||||
| @@ -192,7 +192,6 @@ if (LLAMA_METAL) | ||||
|         ${METALKIT_FRAMEWORK} | ||||
|         ) | ||||
| endif() | ||||
|  | ||||
| if (LLAMA_BLAS) | ||||
|     if (LLAMA_STATIC) | ||||
|         set(BLA_STATIC ON) | ||||
| @@ -269,7 +268,8 @@ if (LLAMA_BLAS) | ||||
| endif() | ||||
|  | ||||
| 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) | ||||
|     if (LLAMA_QKK_64) | ||||
|         add_compile_definitions(GGML_QKK_64) | ||||
| @@ -285,7 +285,8 @@ if (LLAMA_CUBLAS) | ||||
|  | ||||
|         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) | ||||
| #        if (LLAMA_CUDA_CUBLAS) | ||||
| @@ -333,6 +334,7 @@ if (LLAMA_MPI) | ||||
|     find_package(MPI) | ||||
|     if (MPI_C_FOUND) | ||||
|         message(STATUS "MPI found") | ||||
|         set(GGML_HEADERS_MPI ggml-mpi.h) | ||||
|         set(GGML_SOURCES_MPI ggml-mpi.c ggml-mpi.h) | ||||
|         add_compile_definitions(GGML_USE_MPI) | ||||
|         add_compile_definitions(${MPI_C_COMPILE_DEFINITIONS}) | ||||
| @@ -355,7 +357,8 @@ if (LLAMA_CLBLAST) | ||||
|     if (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) | ||||
|  | ||||
| @@ -631,11 +634,11 @@ add_library(ggml OBJECT | ||||
|             ggml.h | ||||
|             ggml-alloc.c | ||||
|             ggml-alloc.h | ||||
|             ${GGML_SOURCES_CUDA} | ||||
|             ${GGML_SOURCES_OPENCL} | ||||
|             ${GGML_SOURCES_METAL} | ||||
|             ${GGML_SOURCES_MPI} | ||||
|             ${GGML_SOURCES_EXTRA} | ||||
|             ${GGML_SOURCES_CUDA} ${GGML_HEADERS_CUDA} | ||||
|             ${GGML_SOURCES_OPENCL} ${GGML_HEADERS_OPENCL} | ||||
|             ${GGML_SOURCES_METAL} ${GGML_HEADERS_METAL} | ||||
|             ${GGML_SOURCES_MPI} ${GGML_HEADERS_MPI} | ||||
|             ${GGML_SOURCES_EXTRA} ${GGML_HEADERS_EXTRA} | ||||
|             ) | ||||
|  | ||||
| target_include_directories(ggml PUBLIC . ${LLAMA_EXTRA_INCLUDES}) | ||||
| @@ -673,14 +676,53 @@ if (BUILD_SHARED_LIBS) | ||||
|     if (LLAMA_METAL) | ||||
|         set_target_properties(llama PROPERTIES RESOURCE "${CMAKE_CURRENT_SOURCE_DIR}/ggml-metal.metal") | ||||
|     endif() | ||||
|     install(TARGETS llama LIBRARY) | ||||
| endif() | ||||
|  | ||||
|  | ||||
| # | ||||
| # install | ||||
| # | ||||
|  | ||||
| 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( | ||||
|     FILES convert.py | ||||
|     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