|
cmake_minimum_required(VERSION 3.12) # Don't bump this version for no reason |
|
# If CUDA toolkit is not found using msvc compiler switch to Community Edition (same compiler, just other kit..) |
|
project("ggllm.cpp" C CXX) |
|
add_definitions(-DGGML_PERF=1) # use "--debug-timings 1-3" to enable timing output |
|
include_directories("C:/program files/NVIDIA GPU Computing Toolkit/CUDA/v12.0/include") |
|
include_directories("C:/program files/NVIDIA GPU Computing Toolkit/CUDA/v12.0/lib/x64") |
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) |
|
|
|
if (NOT XCODE AND NOT MSVC AND NOT CMAKE_BUILD_TYPE) |
|
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) |
|
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") |
|
endif() |
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) |
|
|
|
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) |
|
set(LLAMA_STANDALONE ON) |
|
|
|
# configure project version |
|
# TODO |
|
else() |
|
set(LLAMA_STANDALONE OFF) |
|
endif() |
|
|
|
if (EMSCRIPTEN) |
|
set(BUILD_SHARED_LIBS_DEFAULT OFF) |
|
|
|
option(LLAMA_WASM_SINGLE_FILE "llama: embed WASM inside the generated llama.js" ON) |
|
else() |
|
if (MINGW) |
|
set(BUILD_SHARED_LIBS_DEFAULT OFF) |
|
else() |
|
set(BUILD_SHARED_LIBS_DEFAULT ON) |
|
endif() |
|
endif() |
|
|
|
|
|
# |
|
# Option list |
|
# |
|
|
|
# general |
|
option(LLAMA_STATIC "llama: static link libraries" OFF) |
|
option(LLAMA_NATIVE "llama: enable -march=native flag" OFF) |
|
option(LLAMA_LTO "llama: enable link time optimization" OFF) |
|
|
|
# debug |
|
option(LLAMA_ALL_WARNINGS "llama: enable all compiler warnings" ON) |
|
option(LLAMA_ALL_WARNINGS_3RD_PARTY "llama: enable all compiler warnings in 3rd party libs" OFF) |
|
option(LLAMA_GPROF "llama: enable gprof" OFF) |
|
|
|
# sanitizers |
|
option(LLAMA_SANITIZE_THREAD "llama: enable thread sanitizer" OFF) |
|
option(LLAMA_SANITIZE_ADDRESS "llama: enable address sanitizer" OFF) |
|
option(LLAMA_SANITIZE_UNDEFINED "llama: enable undefined sanitizer" OFF) |
|
|
|
# instruction set specific |
|
option(LLAMA_AVX "llama: enable AVX" ON) |
|
option(LLAMA_AVX2 "llama: enable AVX2" ON) |
|
option(LLAMA_AVX512 "llama: enable AVX512" OFF) |
|
option(LLAMA_AVX512_VBMI "llama: enable AVX512-VBMI" OFF) |
|
option(LLAMA_AVX512_VNNI "llama: enable AVX512-VNNI" OFF) |
|
option(LLAMA_FMA "llama: enable FMA" ON) |
|
# in MSVC F16C is implied with AVX2/AVX512 |
|
if (NOT MSVC) |
|
option(LLAMA_F16C "llama: enable F16C" ON) |
|
endif() |
|
|
|
# 3rd party libs |
|
option(LLAMA_ACCELERATE "llama: enable Accelerate framework" ON) |
|
option(LLAMA_BLAS "llama: use BLAS" OFF) |
|
set(LLAMA_BLAS_VENDOR "Generic" CACHE STRING "llama: BLAS library vendor") |
|
option(LLAMA_CUBLAS "llama: use cuBLAS" ON) |
|
set(LLAMA_CUDA_DMMV_X "32" CACHE STRING "llama: x stride for dmmv CUDA kernels") |
|
set(LLAMA_CUDA_DMMV_Y "1" CACHE STRING "llama: y block size for dmmv CUDA kernels") |
|
set(LLAMA_CUDA_KQUANTS_ITER "2" CACHE STRING "llama: iters./thread per block for Q2_K/Q6_K") |
|
option(LLAMA_CLBLAST "llama: use CLBlast" OFF) |
|
option(LLAMA_METAL "llama: use Metal" OFF) |
|
option(LLAMA_K_QUANTS "llama: use k-quants" ON) |
|
|
|
option(LLAMA_BUILD_TESTS "llama: build tests" ${LLAMA_STANDALONE}) |
|
option(LLAMA_BUILD_EXAMPLES "llama: build examples" ${LLAMA_STANDALONE}) |
|
option(LLAMA_BUILD_SERVER "llama: build server example" OFF) |
|
|
|
# |
|
# Build info header |
|
# |
|
|
|
# Generate initial build-info.h |
|
include(${CMAKE_CURRENT_SOURCE_DIR}/scripts/build-info.cmake) |
|
|
|
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git") |
|
set(GIT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/.git") |
|
|
|
# Is git submodule |
|
if(NOT IS_DIRECTORY "${GIT_DIR}") |
|
file(READ ${GIT_DIR} REAL_GIT_DIR_LINK) |
|
string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" REAL_GIT_DIR ${REAL_GIT_DIR_LINK}) |
|
set(GIT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${REAL_GIT_DIR}") |
|
endif() |
|
|
|
# Add a custom target for build-info.h |
|
add_custom_target(BUILD_INFO ALL DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/build-info.h") |
|
|
|
# Add a custom command to rebuild build-info.h when .git/index changes |
|
add_custom_command( |
|
OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/build-info.h" |
|
COMMENT "Generating build details from Git" |
|
COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_SOURCE_DIR}/scripts/build-info.cmake" |
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} |
|
DEPENDS "${GIT_DIR}/index" |
|
VERBATIM |
|
) |
|
else() |
|
message(WARNING "Git repository not found; to enable automatic generation of build info, make sure Git is installed and the project is a Git repository.") |
|
endif() |
|
|
|
# |
|
# Compile flags |
|
# |
|
|
|
set(CMAKE_CXX_STANDARD 11) |
|
set(CMAKE_CXX_STANDARD_REQUIRED true) |
|
set(CMAKE_C_STANDARD 11) |
|
set(CMAKE_C_STANDARD_REQUIRED true) |
|
set(THREADS_PREFER_PTHREAD_FLAG ON) |
|
find_package(Threads REQUIRED) |
|
|
|
if (NOT MSVC) |
|
if (LLAMA_SANITIZE_THREAD) |
|
add_compile_options(-fsanitize=thread) |
|
link_libraries(-fsanitize=thread) |
|
endif() |
|
|
|
if (LLAMA_SANITIZE_ADDRESS) |
|
add_compile_options(-fsanitize=address -fno-omit-frame-pointer) |
|
link_libraries(-fsanitize=address) |
|
endif() |
|
|
|
if (LLAMA_SANITIZE_UNDEFINED) |
|
add_compile_options(-fsanitize=undefined) |
|
link_libraries(-fsanitize=undefined) |
|
endif() |
|
endif() |
|
|
|
if (APPLE AND LLAMA_ACCELERATE) |
|
find_library(ACCELERATE_FRAMEWORK Accelerate) |
|
if (ACCELERATE_FRAMEWORK) |
|
message(STATUS "Accelerate framework found") |
|
|
|
add_compile_definitions(GGML_USE_ACCELERATE) |
|
set(LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS} ${ACCELERATE_FRAMEWORK}) |
|
else() |
|
message(WARNING "Accelerate framework not found") |
|
endif() |
|
endif() |
|
|
|
if (LLAMA_BLAS) |
|
if (LLAMA_STATIC) |
|
set(BLA_STATIC ON) |
|
endif() |
|
if ($(CMAKE_VERSION) VERSION_GREATER_EQUAL 3.22) |
|
set(BLA_SIZEOF_INTEGER 8) |
|
endif() |
|
|
|
set(BLA_VENDOR ${LLAMA_BLAS_VENDOR}) |
|
find_package(BLAS) |
|
|
|
if (BLAS_FOUND) |
|
message(STATUS "BLAS found, Libraries: ${BLAS_LIBRARIES}") |
|
|
|
if ("${BLAS_INCLUDE_DIRS}" STREQUAL "") |
|
# BLAS_INCLUDE_DIRS is missing in FindBLAS.cmake. |
|
# see https://gitlab.kitware.com/cmake/cmake/-/issues/20268 |
|
find_package(PkgConfig REQUIRED) |
|
if (${LLAMA_BLAS_VENDOR} MATCHES "Generic") |
|
pkg_check_modules(DepBLAS REQUIRED blas) |
|
elseif (${LLAMA_BLAS_VENDOR} MATCHES "OpenBLAS") |
|
pkg_check_modules(DepBLAS REQUIRED openblas) |
|
elseif (${LLAMA_BLAS_VENDOR} MATCHES "FLAME") |
|
pkg_check_modules(DepBLAS REQUIRED blis) |
|
elseif (${LLAMA_BLAS_VENDOR} MATCHES "ATLAS") |
|
pkg_check_modules(DepBLAS REQUIRED blas-atlas) |
|
elseif (${LLAMA_BLAS_VENDOR} MATCHES "FlexiBLAS") |
|
pkg_check_modules(DepBLAS REQUIRED flexiblas_api) |
|
elseif (${LLAMA_BLAS_VENDOR} MATCHES "Intel") |
|
# all Intel* libraries share the same include path |
|
pkg_check_modules(DepBLAS REQUIRED mkl-sdl) |
|
elseif (${LLAMA_BLAS_VENDOR} MATCHES "NVHPC") |
|
# this doesn't provide pkg-config |
|
# suggest to assign BLAS_INCLUDE_DIRS on your own |
|
if ("${NVHPC_VERSION}" STREQUAL "") |
|
message(WARNING "Better to set NVHPC_VERSION") |
|
else() |
|
set(DepBLAS_FOUND ON) |
|
set(DepBLAS_INCLUDE_DIRS "/opt/nvidia/hpc_sdk/${CMAKE_SYSTEM_NAME}_${CMAKE_SYSTEM_PROCESSOR}/${NVHPC_VERSION}/math_libs/include") |
|
endif() |
|
endif() |
|
if (DepBLAS_FOUND) |
|
set(BLAS_INCLUDE_DIRS ${DepBLAS_INCLUDE_DIRS}) |
|
else() |
|
message(WARNING "BLAS_INCLUDE_DIRS neither been provided nor been automatically" |
|
" detected by pkgconfig, trying to find cblas.h from possible paths...") |
|
find_path(BLAS_INCLUDE_DIRS |
|
NAMES cblas.h |
|
HINTS |
|
/usr/include |
|
/usr/local/include |
|
/usr/include/openblas |
|
/opt/homebrew/opt/openblas/include |
|
/usr/local/opt/openblas/include |
|
/usr/include/x86_64-linux-gnu/openblas/include |
|
) |
|
endif() |
|
endif() |
|
|
|
message(STATUS "BLAS found, Includes: ${BLAS_INCLUDE_DIRS}") |
|
add_compile_options(${BLAS_LINKER_FLAGS}) |
|
add_compile_definitions(GGML_USE_OPENBLAS) |
|
set(LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS} ${BLAS_LIBRARIES}) |
|
set(LLAMA_EXTRA_INCLUDES ${LLAMA_EXTRA_INCLUDES} ${BLAS_INCLUDE_DIRS}) |
|
|
|
else() |
|
message(WARNING "BLAS not found, please refer to " |
|
"https://cmake.org/cmake/help/latest/module/FindBLAS.html#blas-lapack-vendors" |
|
" to set correct LLAMA_BLAS_VENDOR") |
|
endif() |
|
endif() |
|
|
|
if (LLAMA_CUBLAS) |
|
cmake_minimum_required(VERSION 3.17) |
|
|
|
find_package(CUDAToolkit) |
|
if (CUDAToolkit_FOUND) |
|
message(STATUS "cuBLAS found") |
|
|
|
enable_language(CUDA) |
|
message(STATUS "CUDA found, version: ${CUDAToolkit_VERSION}") |
|
|
|
set(GGML_SOURCES_CUDA ggml-cuda.cu ggml-cuda.h) |
|
|
|
add_compile_definitions(GGML_USE_CUBLAS) |
|
add_compile_definitions(GGML_CUDA_DMMV_X=${LLAMA_CUDA_DMMV_X}) |
|
add_compile_definitions(GGML_CUDA_DMMV_Y=${LLAMA_CUDA_DMMV_Y}) |
|
add_compile_definitions(K_QUANTS_PER_ITERATION=${LLAMA_CUDA_KQUANTS_ITER}) |
|
|
|
if (LLAMA_STATIC) |
|
set(LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS} CUDA::cudart_static CUDA::cublas_static CUDA::cublasLt_static) |
|
else() |
|
set(LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS} CUDA::cudart CUDA::cublas CUDA::cublasLt) |
|
endif() |
|
|
|
else() |
|
message(WARNING "cuBLAS not found") |
|
endif() |
|
endif() |
|
|
|
if (LLAMA_METAL) |
|
find_library(FOUNDATION_LIBRARY Foundation REQUIRED) |
|
find_library(METAL_FRAMEWORK Metal REQUIRED) |
|
find_library(METALKIT_FRAMEWORK MetalKit REQUIRED) |
|
find_library(METALPERFORMANCE_FRAMEWORK MetalPerformanceShaders REQUIRED) |
|
|
|
set(GGML_SOURCES_METAL ggml-metal.m ggml-metal.h) |
|
|
|
add_compile_definitions(GGML_USE_METAL) |
|
add_compile_definitions(GGML_METAL_NDEBUG) |
|
|
|
# get full path to the file |
|
#add_compile_definitions(GGML_METAL_DIR_KERNELS="${CMAKE_CURRENT_SOURCE_DIR}/") |
|
|
|
# copy ggml-metal.metal to bin directory |
|
configure_file(ggml-metal.metal bin/ggml-metal.metal COPYONLY) |
|
|
|
set(LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS} |
|
${FOUNDATION_LIBRARY} |
|
${METAL_FRAMEWORK} |
|
${METALKIT_FRAMEWORK} |
|
${METALPERFORMANCE_FRAMEWORK} |
|
) |
|
endif() |
|
|
|
if (LLAMA_K_QUANTS) |
|
set(GGML_SOURCES_EXTRA ${GGML_SOURCES_EXTRA} k_quants.c k_quants.h) |
|
add_compile_definitions(GGML_USE_K_QUANTS) |
|
endif() |
|
|
|
if (LLAMA_CLBLAST) |
|
find_package(CLBlast) |
|
if (CLBlast_FOUND) |
|
message(STATUS "CLBlast found") |
|
|
|
set(GGML_SOURCES_OPENCL ggml-opencl.cpp ggml-opencl.h) |
|
|
|
add_compile_definitions(GGML_USE_CLBLAST) |
|
|
|
set(LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS} clblast) |
|
else() |
|
message(WARNING "CLBlast not found") |
|
endif() |
|
endif() |
|
|
|
if (LLAMA_ALL_WARNINGS) |
|
if (NOT MSVC) |
|
set(c_flags |
|
-Wall |
|
-Wextra |
|
-Wpedantic |
|
-Wcast-qual |
|
-Wdouble-promotion |
|
-Wshadow |
|
-Wstrict-prototypes |
|
-Wpointer-arith |
|
) |
|
set(cxx_flags |
|
-Wall |
|
-Wextra |
|
-Wpedantic |
|
-Wcast-qual |
|
-Wno-unused-function |
|
-Wno-multichar |
|
) |
|
else() |
|
# todo : msvc |
|
endif() |
|
|
|
add_compile_options( |
|
"$<$<COMPILE_LANGUAGE:C>:${c_flags}>" |
|
"$<$<COMPILE_LANGUAGE:CXX>:${cxx_flags}>" |
|
) |
|
|
|
endif() |
|
|
|
if (MSVC) |
|
add_compile_definitions(_CRT_SECURE_NO_WARNINGS) |
|
|
|
if (BUILD_SHARED_LIBS) |
|
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) |
|
endif() |
|
endif() |
|
|
|
if (LLAMA_LTO) |
|
include(CheckIPOSupported) |
|
check_ipo_supported(RESULT result OUTPUT output) |
|
if (result) |
|
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) |
|
else() |
|
message(WARNING "IPO is not supported: ${output}") |
|
endif() |
|
endif() |
|
|
|
# Architecture specific |
|
# TODO: probably these flags need to be tweaked on some architectures |
|
# feel free to update the Makefile for your architecture and send a pull request or issue |
|
message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") |
|
if (NOT MSVC) |
|
if (LLAMA_STATIC) |
|
add_link_options(-static) |
|
if (MINGW) |
|
add_link_options(-static-libgcc -static-libstdc++) |
|
endif() |
|
endif() |
|
if (LLAMA_GPROF) |
|
add_compile_options(-pg) |
|
endif() |
|
if (LLAMA_NATIVE) |
|
add_compile_options(-march=native) |
|
endif() |
|
endif() |
|
|
|
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64") |
|
message(STATUS "ARM detected") |
|
if (MSVC) |
|
# TODO: arm msvc? |
|
else() |
|
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64") |
|
# Apple M1, M2, etc. |
|
# Raspberry Pi 3, 4, Zero 2 (64-bit) |
|
add_compile_options(-mcpu=native) |
|
endif() |
|
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "armv6") |
|
# Raspberry Pi 1, Zero |
|
add_compile_options(-mfpu=neon-fp-armv8 -mfp16-format=ieee -mno-unaligned-access) |
|
endif() |
|
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "armv7") |
|
# Raspberry Pi 2 |
|
add_compile_options(-mfpu=neon-fp-armv8 -mfp16-format=ieee -mno-unaligned-access -funsafe-math-optimizations) |
|
endif() |
|
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "armv8") |
|
# Raspberry Pi 3, 4, Zero 2 (32-bit) |
|
add_compile_options(-mfp16-format=ieee -mno-unaligned-access) |
|
endif() |
|
endif() |
|
elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(x86_64|i686|AMD64)$") |
|
message(STATUS "x86 detected") |
|
if (MSVC) |
|
if (LLAMA_AVX512) |
|
add_compile_options($<$<COMPILE_LANGUAGE:C>:/arch:AVX512>) |
|
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:/arch:AVX512>) |
|
# MSVC has no compile-time flags enabling specific |
|
# AVX512 extensions, neither it defines the |
|
# macros corresponding to the extensions. |
|
# Do it manually. |
|
if (LLAMA_AVX512_VBMI) |
|
add_compile_definitions($<$<COMPILE_LANGUAGE:C>:__AVX512VBMI__>) |
|
add_compile_definitions($<$<COMPILE_LANGUAGE:CXX>:__AVX512VBMI__>) |
|
endif() |
|
if (LLAMA_AVX512_VNNI) |
|
add_compile_definitions($<$<COMPILE_LANGUAGE:C>:__AVX512VNNI__>) |
|
add_compile_definitions($<$<COMPILE_LANGUAGE:CXX>:__AVX512VNNI__>) |
|
endif() |
|
elseif (LLAMA_AVX2) |
|
add_compile_options($<$<COMPILE_LANGUAGE:C>:/arch:AVX2>) |
|
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:/arch:AVX2>) |
|
elseif (LLAMA_AVX) |
|
add_compile_options($<$<COMPILE_LANGUAGE:C>:/arch:AVX>) |
|
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:/arch:AVX>) |
|
endif() |
|
else() |
|
if (LLAMA_F16C) |
|
add_compile_options(-mf16c) |
|
endif() |
|
if (LLAMA_FMA) |
|
add_compile_options(-mfma) |
|
endif() |
|
if (LLAMA_AVX) |
|
add_compile_options(-mavx) |
|
endif() |
|
if (LLAMA_AVX2) |
|
add_compile_options(-mavx2) |
|
endif() |
|
if (LLAMA_AVX512) |
|
add_compile_options(-mavx512f) |
|
add_compile_options(-mavx512bw) |
|
endif() |
|
if (LLAMA_AVX512_VBMI) |
|
add_compile_options(-mavx512vbmi) |
|
endif() |
|
if (LLAMA_AVX512_VNNI) |
|
add_compile_options(-mavx512vnni) |
|
endif() |
|
endif() |
|
elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "ppc64") |
|
message(STATUS "PowerPC detected") |
|
add_compile_options(-mcpu=native -mtune=native) |
|
#TODO: Add targets for Power8/Power9 (Altivec/VSX) and Power10(MMA) and query for big endian systems (ppc64/le/be) |
|
else() |
|
message(STATUS "Unknown architecture") |
|
endif() |
|
|
|
# |
|
# Build libraries |
|
# |
|
|
|
add_library(ggml OBJECT |
|
ggml.c |
|
ggml.h |
|
${GGML_SOURCES_CUDA} |
|
${GGML_SOURCES_OPENCL} |
|
${GGML_SOURCES_METAL} |
|
${GGML_SOURCES_EXTRA} |
|
) |
|
|
|
target_include_directories(ggml PUBLIC . ${LLAMA_EXTRA_INCLUDES}) |
|
target_compile_features(ggml PUBLIC c_std_11) # don't bump |
|
target_link_libraries(ggml PUBLIC Threads::Threads ${LLAMA_EXTRA_LIBS}) |
|
|
|
add_library(ggml_static STATIC $<TARGET_OBJECTS:ggml>) |
|
if (BUILD_SHARED_LIBS) |
|
set_target_properties(ggml PROPERTIES POSITION_INDEPENDENT_CODE ON) |
|
add_library(ggml_shared SHARED $<TARGET_OBJECTS:ggml>) |
|
endif() |
|
|
|
add_library(llama |
|
llama.cpp |
|
llama.h |
|
llama-util.h |
|
) |
|
|
|
target_include_directories(llama PUBLIC .) |
|
target_compile_features(llama PUBLIC cxx_std_11) # don't bump |
|
target_link_libraries(llama PRIVATE |
|
ggml |
|
${LLAMA_EXTRA_LIBS} |
|
) |
|
|
|
# falcon |
|
add_library(libfalcon |
|
libfalcon.cpp |
|
libfalcon.h |
|
llama-util.h |
|
) |
|
target_include_directories(libfalcon PUBLIC .) |
|
target_compile_features(libfalcon PUBLIC cxx_std_11) # don't bump |
|
target_link_libraries(libfalcon PRIVATE |
|
ggml |
|
${LLAMA_EXTRA_LIBS} |
|
) |
|
# |
|
|
|
if (BUILD_SHARED_LIBS) |
|
set_target_properties(llama PROPERTIES POSITION_INDEPENDENT_CODE ON) |
|
target_compile_definitions(llama PRIVATE LLAMA_SHARED LLAMA_BUILD) |
|
if (LLAMA_METAL) |
|
set_target_properties(llama PROPERTIES RESOURCE "${CMAKE_CURRENT_SOURCE_DIR}/ggml-metal.metal") |
|
endif() |
|
|
|
# falcon |
|
set_target_properties(libfalcon PROPERTIES POSITION_INDEPENDENT_CODE ON) |
|
target_compile_definitions(libfalcon PRIVATE LLAMA_SHARED LLAMA_BUILD) |
|
if (LLAMA_METAL) |
|
set_target_properties(libfalcon PROPERTIES RESOURCE "${CMAKE_CURRENT_SOURCE_DIR}/ggml-metal.metal") |
|
endif() |
|
# |
|
endif() |
|
|
|
if (GGML_SOURCES_CUDA) |
|
message(STATUS "GGML CUDA sources found, configuring CUDA architecture") |
|
set_property(TARGET ggml PROPERTY CUDA_ARCHITECTURES OFF) |
|
set_property(TARGET ggml PROPERTY CUDA_SELECT_NVCC_ARCH_FLAGS "Auto") |
|
set_property(TARGET llama PROPERTY CUDA_ARCHITECTURES OFF) |
|
# falcon |
|
set_property(TARGET libfalcon PROPERTY CUDA_ARCHITECTURES OFF) |
|
|
|
endif() |
|
|
|
|
|
# |
|
# programs, examples and tests |
|
# |
|
|
|
if (LLAMA_BUILD_TESTS AND NOT CMAKE_JS_VERSION) |
|
include(CTest) |
|
add_subdirectory(tests) |
|
endif () |
|
|
|
if (LLAMA_BUILD_EXAMPLES) |
|
add_subdirectory(examples) |
|
add_subdirectory(pocs) |
|
endif() |
|
|