-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
237 lines (201 loc) · 6.48 KB
/
CMakeLists.txt
File metadata and controls
237 lines (201 loc) · 6.48 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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
cmake_minimum_required(VERSION 3.22)
project(llmcpp VERSION 1.5.0)
# Set version variables for easier access
set(LLMCPP_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
set(LLMCPP_VERSION_MINOR ${PROJECT_VERSION_MINOR})
set(LLMCPP_VERSION_PATCH ${PROJECT_VERSION_PATCH})
set(LLMCPP_VERSION ${PROJECT_VERSION})
# Generate version header
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/include/llmcpp_version.h.in"
"${CMAKE_CURRENT_BINARY_DIR}/include/llmcpp_version.h"
@ONLY
)
# C++ Standard
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Build options
option(LLMCPP_BUILD_TESTS "Build tests" OFF)
option(LLMCPP_BUILD_EXAMPLES "Build examples" OFF)
# Compiler-specific options
if(MSVC)
add_compile_options(/W4)
else()
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# Optional OpenSSL dependency (prefer native SSL if available)
option(LLMCPP_USE_OPENSSL "Use OpenSSL instead of native SSL" OFF)
if(LLMCPP_USE_OPENSSL)
find_package(OpenSSL QUIET)
if(OpenSSL_FOUND)
message(STATUS "llmcpp: Using OpenSSL for HTTPS")
else()
message(WARNING "llmcpp: OpenSSL requested but not found, falling back to native SSL")
set(LLMCPP_USE_OPENSSL OFF)
endif()
else()
message(STATUS "llmcpp: Using native SSL (SecureTransport on macOS, WinSSL on Windows)")
endif()
# Use FetchContent for dependencies
include(FetchContent)
# nlohmann-json
FetchContent_Declare(
nlohmann_json
GIT_REPOSITORY https://github.com/nlohmann/json.git
GIT_TAG v3.11.3
)
# cpp-httplib
FetchContent_Declare(
httplib
GIT_REPOSITORY https://github.com/yhirose/cpp-httplib.git
GIT_TAG v0.15.3
)
# Configure httplib SSL and disable unnecessary features
set(HTTPLIB_USE_ZLIB OFF CACHE BOOL "Use zlib" FORCE)
set(HTTPLIB_USE_BROTLI OFF CACHE BOOL "Use Brotli" FORCE)
if(LLMCPP_USE_OPENSSL AND OpenSSL_FOUND)
# Use OpenSSL
set(HTTPLIB_USE_OPENSSL ON CACHE BOOL "Use OpenSSL" FORCE)
set(HTTPLIB_USE_SECURE_TRANSPORT OFF CACHE BOOL "Use SecureTransport" FORCE)
set(HTTPLIB_USE_WINSSL OFF CACHE BOOL "Use WinSSL" FORCE)
else()
# Use native SSL
set(HTTPLIB_USE_OPENSSL OFF CACHE BOOL "Use OpenSSL" FORCE)
if(APPLE)
set(HTTPLIB_USE_SECURE_TRANSPORT ON CACHE BOOL "Use SecureTransport on macOS" FORCE)
elseif(WIN32)
set(HTTPLIB_USE_WINSSL ON CACHE BOOL "Use WinSSL on Windows" FORCE)
endif()
endif()
# Make dependencies available
FetchContent_MakeAvailable(nlohmann_json httplib)
# Source files
set(LLMCPP_SOURCES
src/core/LLMTypes.cpp
src/core/LLMClient.cpp
src/core/JsonSchemaBuilder.cpp
src/core/ClientFactory.cpp
src/core/ResponseParser.cpp
src/providers/ClientManager.cpp
src/providers/ClientFactory.cpp
src/openai/OpenAIClient.cpp
src/openai/OpenAIHttpClient.cpp
src/openai/OpenAIResponsesApi.cpp
src/openai/OpenAISchemaBuilder.cpp
src/openai/OpenAIModels.cpp
src/openai/OpenAITypes.cpp
src/openai/OpenAIMcpUtils.cpp
src/openai/OpenAIUtils.cpp
src/anthropic/AnthropicClient.cpp
src/anthropic/AnthropicHttpClient.cpp
src/anthropic/AnthropicSchemaBuilder.cpp
)
# Create library
add_library(llmcpp ${LLMCPP_SOURCES})
# Add include directories
target_include_directories(llmcpp
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# Link libraries
target_link_libraries(llmcpp
PUBLIC
nlohmann_json
PRIVATE
httplib::httplib
)
# Platform-specific libraries
if(WIN32)
target_link_libraries(llmcpp PRIVATE ws2_32 wsock32 crypt32)
elseif(APPLE)
target_link_libraries(llmcpp PRIVATE
"-framework CoreFoundation"
"-framework Security"
)
endif()
# Add examples if requested
if(LLMCPP_BUILD_EXAMPLES)
add_subdirectory(examples)
endif()
# Add tests if requested
if(LLMCPP_BUILD_TESTS)
add_subdirectory(tests)
endif()
# Installation
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
# Install the library and its dependencies
install(TARGETS llmcpp nlohmann_json
EXPORT llmcppTargets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
# Install headers
install(DIRECTORY include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp"
)
# Install generated version header
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/include/llmcpp_version.h"
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
# Export the targets to a script
install(EXPORT llmcppTargets
FILE llmcppTargets.cmake
NAMESPACE llmcpp::
DESTINATION lib/cmake/llmcpp
)
# Generate and install the config and version files
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/llmcppConfigVersion.cmake"
VERSION ${PROJECT_VERSION}
COMPATIBILITY AnyNewerVersion
)
configure_package_config_file(
"${CMAKE_CURRENT_LIST_DIR}/cmake/llmcppConfig.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/llmcppConfig.cmake"
INSTALL_DESTINATION lib/cmake/llmcpp
)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/llmcppConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/llmcppConfigVersion.cmake"
DESTINATION lib/cmake/llmcpp
)
# CPack configuration for releases
include(CPack)
set(CPACK_PACKAGE_NAME "llmcpp")
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Modern C++20 library for Large Language Model APIs")
set(CPACK_PACKAGE_DESCRIPTION "A unified interface for Large Language Model APIs with support for multiple providers, async operations, and modern C++20 features.")
set(CPACK_PACKAGE_VENDOR "llmcpp")
set(CPACK_PACKAGE_CONTACT "https://github.com/lucaromagnoli/llmcpp")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
# Package file names
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
# Source package
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-source")
set(CPACK_SOURCE_IGNORE_FILES
/.git/
/build/
/\.DS_Store
/\.env
/\.vscode/
/\.idea/
/cmake-build-*/
/\.clion/
)
# Platform-specific settings
if(WIN32)
set(CPACK_GENERATOR "ZIP")
set(CPACK_SOURCE_GENERATOR "ZIP")
elseif(APPLE)
set(CPACK_GENERATOR "TGZ")
set(CPACK_SOURCE_GENERATOR "TGZ")
else()
set(CPACK_GENERATOR "TGZ")
set(CPACK_SOURCE_GENERATOR "TGZ")
endif()