Skip to content

Commit ed6849c

Browse files
authored
Initial support for CMake (#75)
1 parent 41be0a3 commit ed6849c

File tree

1 file changed

+123
-0
lines changed

1 file changed

+123
-0
lines changed

CMakeLists.txt

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
cmake_minimum_required(VERSION 3.8)
2+
project("llama.cpp")
3+
4+
set(CMAKE_CXX_STANDARD 20)
5+
set(CMAKE_CXX_STANDARD_REQUIRED true)
6+
set(CMAKE_C_STANDARD 11)
7+
8+
option(LLAMA_ALL_WARNINGS "llama: enable all compiler warnings" ON)
9+
option(LLAMA_ALL_WARNINGS_3RD_PARTY "llama: enable all compiler warnings in 3rd party libs" OFF)
10+
11+
option(LLAMA_SANITIZE_THREAD "llama: enable thread sanitizer" OFF)
12+
option(LLAMA_SANITIZE_ADDRESS "llama: enable address sanitizer" OFF)
13+
option(LLAMA_SANITIZE_UNDEFINED "llama: enable undefined sanitizer" OFF)
14+
15+
if (APPLE)
16+
option(LLAMA_NO_ACCELERATE "llama: disable Accelerate framework" OFF)
17+
option(LLAMA_NO_AVX "llama: disable AVX" OFF)
18+
option(LLAMA_NO_AVX2 "llama: disable AVX2" OFF)
19+
option(LLAMA_NO_FMA "llama: disable FMA" OFF)
20+
endif()
21+
22+
if (NOT MSVC)
23+
if (LLAMA_SANITIZE_THREAD)
24+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread")
25+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread")
26+
endif()
27+
28+
if (LLAMA_SANITIZE_ADDRESS)
29+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
30+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
31+
endif()
32+
33+
if (LLAMA_SANITIZE_UNDEFINED)
34+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined")
35+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined")
36+
endif()
37+
endif()
38+
39+
if (APPLE AND NOT LLAMA_NO_ACCELERATE)
40+
find_library(ACCELERATE_FRAMEWORK Accelerate)
41+
if (ACCELERATE_FRAMEWORK)
42+
message(STATUS "Accelerate framework found")
43+
44+
set(LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS} ${ACCELERATE_FRAMEWORK})
45+
set(LLAMA_EXTRA_FLAGS ${LLAMA_EXTRA_FLAGS} -DGGML_USE_ACCELERATE)
46+
else()
47+
message(WARNING "Accelerate framework not found")
48+
endif()
49+
endif()
50+
51+
if (LLAMA_ALL_WARNINGS)
52+
if (NOT MSVC)
53+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \
54+
-Wall \
55+
-Wextra \
56+
-Wpedantic \
57+
-Wshadow \
58+
-Wcast-qual \
59+
-Wstrict-prototypes \
60+
-Wpointer-arith \
61+
-Wno-unused-function \
62+
")
63+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
64+
-Wall \
65+
-Wextra \
66+
-Wpedantic \
67+
-Wcast-qual \
68+
")
69+
else()
70+
# todo : msvc
71+
endif()
72+
endif()
73+
74+
message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
75+
76+
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64")
77+
message(STATUS "ARM detected")
78+
else()
79+
message(STATUS "x86 detected")
80+
if (MSVC)
81+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
82+
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /arch:AVX2")
83+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /arch:AVX2")
84+
else()
85+
if(NOT LLAMA_NO_AVX)
86+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx")
87+
endif()
88+
if(NOT LLAMA_NO_AVX2)
89+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx2")
90+
endif()
91+
if(NOT LLAMA_NO_FMA)
92+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfma")
93+
endif()
94+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mf16c")
95+
endif()
96+
endif()
97+
98+
# if (LLAMA_PERF)
99+
# set(LLAMA_EXTRA_FLAGS ${LLAMA_EXTRA_FLAGS} -DGGML_PERF)
100+
# endif()
101+
102+
add_executable(llama
103+
main.cpp
104+
utils.cpp
105+
utils.h)
106+
107+
add_executable(quantize
108+
quantize.cpp
109+
utils.cpp
110+
utils.h)
111+
112+
add_library(ggml
113+
ggml.c
114+
ggml.h)
115+
116+
target_compile_definitions(ggml PUBLIC ${LLAMA_EXTRA_FLAGS})
117+
target_compile_definitions(llama PUBLIC ${LLAMA_EXTRA_FLAGS})
118+
target_compile_definitions(quantize PUBLIC ${LLAMA_EXTRA_FLAGS})
119+
120+
target_link_libraries(ggml PRIVATE ${LLAMA_EXTRA_LIBS})
121+
target_include_directories(ggml PUBLIC .)
122+
target_link_libraries(quantize PRIVATE ggml)
123+
target_link_libraries(llama PRIVATE ggml)

0 commit comments

Comments
 (0)