Repository navigation
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
95 lines (81 loc) · 3.15 KB
/
Copy pathCMakeLists.txt
File metadata and controls
95 lines (81 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
cmake_minimum_required(VERSION 3.12)
project(jllama CXX)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(BUILD_SHARED_LIBS ON)
# checkout llama.cpp
include(FetchContent)
FetchContent_Declare(
llama.cpp
GIT_REPOSITORY https://github.com/ggerganov/llama.cpp.git
GIT_TAG b1645
)
FetchContent_MakeAvailable(llama.cpp)
# todo: Is there a better way to build the library than copy & pasting the build argument cmake definition of llama.cpp?
include(build-args.cmake)
# find which OS we build for if not set (make sure to run mvn compile first)
if(NOT DEFINED OS_NAME)
find_package(Java REQUIRED)
find_program(JAVA_EXECUTABLE NAMES java)
execute_process(
COMMAND ${JAVA_EXECUTABLE} -cp ${CMAKE_SOURCE_DIR}/target/classes de.kherud.llama.OSInfo --os
OUTPUT_VARIABLE OS_NAME
OUTPUT_STRIP_TRAILING_WHITESPACE
)
endif()
if(NOT OS_NAME)
message(FATAL_ERROR "Could not determine OS name")
endif()
# find which architecture we build for if not set (make sure to run mvn compile first)
if(NOT DEFINED OS_ARCH)
find_package(Java REQUIRED)
find_program(JAVA_EXECUTABLE NAMES java)
execute_process(
COMMAND ${JAVA_EXECUTABLE} -cp ${CMAKE_SOURCE_DIR}/target/classes de.kherud.llama.OSInfo --arch
OUTPUT_VARIABLE OS_ARCH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
endif()
if(NOT OS_ARCH)
message(FATAL_ERROR "Could not determine CPU architecture")
endif()
set(JLLAMA_DIR ${CMAKE_SOURCE_DIR}/src/main/resources/de/kherud/llama/${OS_NAME}/${OS_ARCH})
message(STATUS "Installing files to ${JLLAMA_DIR}")
add_library(jllama SHARED src/main/cpp/jllama.cpp)
# include jni.h and jni_md.h
if(NOT DEFINED JNI_INCLUDE_DIRS)
if(OS_NAME STREQUAL "Linux" OR OS_NAME STREQUAL "Mac")
set(JNI_INCLUDE_DIRS .github/include/unix)
elseif(OS_NAME STREQUAL "Windows")
set(JNI_INCLUDE_DIRS .github/include/windows)
# if we don't have provided headers, try to find them via Java
else()
find_package(Java REQUIRED)
find_program(JAVA_EXECUTABLE NAMES java)
find_path(JNI_INCLUDE_DIRS NAMES jni.h HINTS ENV JAVA_HOME PATH_SUFFIXES include)
# find "jni_md.h" include directory if not set
file(GLOB_RECURSE JNI_MD_PATHS RELATIVE "${JNI_INCLUDE_DIRS}" "${JNI_INCLUDE_DIRS}/**/jni_md.h")
foreach(PATH IN LISTS JNI_MD_PATHS)
get_filename_component(DIR ${PATH} DIRECTORY)
list(APPEND JNI_INCLUDE_DIRS "${JNI_INCLUDE_DIRS}/${DIR}")
endforeach()
endif()
endif()
if(NOT JNI_INCLUDE_DIRS)
message(FATAL_ERROR "Could not determine JNI include directories")
endif()
target_include_directories(jllama PRIVATE src/main/cpp ${JNI_INCLUDE_DIRS})
target_link_libraries(jllama PRIVATE common llama ${LLAMA_EXTRA_LIBS})
target_compile_features(jllama PRIVATE cxx_std_11)
if(OS_NAME STREQUAL "Windows")
set_target_properties(jllama llama PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${JLLAMA_DIR}
)
else()
set_target_properties(jllama llama PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${JLLAMA_DIR}
)
endif()
if (LLAMA_METAL)
# copy ggml-metal.metal to bin directory
configure_file(${llama.cpp_SOURCE_DIR}/ggml-metal.metal ${JLLAMA_DIR}/ggml-metal.metal COPYONLY)
endif()