1set(TARGET cpp-httplib)
2license_add_file("cpp-httplib" "LICENSE")
3
4find_package(Threads REQUIRED)
5
6llama_add_compile_flags()
7
8add_library(${TARGET} STATIC httplib.cpp httplib.h)
9
10# disable warnings in 3rd party code
11if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
12 target_compile_options(${TARGET} PRIVATE /w)
13else()
14 target_compile_options(${TARGET} PRIVATE -w)
15endif()
16
17target_link_libraries(${TARGET} PRIVATE Threads::Threads)
18
19if (WIN32 AND NOT MSVC)
20 target_link_libraries(${TARGET} PRIVATE ws2_32)
21endif()
22
23target_compile_features(${TARGET} PRIVATE cxx_std_17)
24
25target_compile_definitions(${TARGET} PRIVATE
26 # increase max payload length to allow use of larger context size
27 CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH=1048576
28 # increase backlog size to avoid connection resets for >> 1 slots
29 CPPHTTPLIB_LISTEN_BACKLOG=512
30 # increase max URI length to handle longer prompts in query string
31 CPPHTTPLIB_REQUEST_URI_MAX_LENGTH=32768
32 # disable Nagle's algorithm
33 CPPHTTPLIB_TCP_NODELAY=1
34)
35
36set(OPENSSL_NO_ASM ON CACHE BOOL "Disable OpenSSL ASM code when building BoringSSL or LibreSSL")
37
38if (LLAMA_BUILD_BORINGSSL)
39 set(FIPS OFF CACHE BOOL "Enable FIPS (BoringSSL)")
40
41 set(BORINGSSL_GIT "https://boringssl.googlesource.com/boringssl" CACHE STRING "BoringSSL git repository")
42 set(BORINGSSL_VERSION "0.20260204.0" CACHE STRING "BoringSSL version")
43
44 message(STATUS "Fetching BoringSSL version ${BORINGSSL_VERSION}")
45
46 set(BORINGSSL_ARGS
47 GIT_REPOSITORY ${BORINGSSL_GIT}
48 GIT_TAG ${BORINGSSL_VERSION}
49 )
50 if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28)
51 list(APPEND BORINGSSL_ARGS EXCLUDE_FROM_ALL)
52 endif()
53
54 include(FetchContent)
55 FetchContent_Declare(boringssl ${BORINGSSL_ARGS})
56
57 set(SAVED_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
58 set(SAVED_BUILD_TESTING ${BUILD_TESTING})
59
60 set(BUILD_SHARED_LIBS OFF)
61 set(BUILD_TESTING OFF)
62
63 if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28)
64 FetchContent_MakeAvailable(boringssl)
65 else()
66 FetchContent_GetProperties(boringssl)
67 if(NOT boringssl_POPULATED)
68 FetchContent_Populate(boringssl)
69 add_subdirectory(${boringssl_SOURCE_DIR} ${boringssl_BINARY_DIR} EXCLUDE_FROM_ALL)
70 endif()
71 endif()
72
73 set(BUILD_SHARED_LIBS ${SAVED_BUILD_SHARED_LIBS})
74 set(BUILD_TESTING ${SAVED_BUILD_TESTING})
75
76 license_add_file("BoringSSL" "${boringssl_SOURCE_DIR}/LICENSE")
77
78 set(CPPHTTPLIB_OPENSSL_SUPPORT TRUE)
79 target_link_libraries(${TARGET} PUBLIC ssl crypto)
80
81elseif (LLAMA_BUILD_LIBRESSL)
82 set(LIBRESSL_VERSION "4.2.1" CACHE STRING "LibreSSL version")
83
84 message(STATUS "Fetching LibreSSL version ${LIBRESSL_VERSION}")
85
86 set(LIBRESSL_ARGS
87 URL "https://cdn.openbsd.org/pub/OpenBSD/LibreSSL/libressl-${LIBRESSL_VERSION}.tar.gz"
88 )
89 if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.24)
90 list(APPEND LIBRESSL_ARGS DOWNLOAD_EXTRACT_TIMESTAMP TRUE)
91 endif()
92
93 if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28)
94 list(APPEND LIBRESSL_ARGS EXCLUDE_FROM_ALL)
95 endif()
96
97 include(FetchContent)
98 FetchContent_Declare(libressl ${LIBRESSL_ARGS})
99
100 set(SAVED_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
101 set(SAVED_BUILD_TESTING ${BUILD_TESTING})
102
103 set(BUILD_SHARED_LIBS OFF)
104 set(BUILD_TESTING OFF)
105
106 if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28)
107 FetchContent_MakeAvailable(libressl)
108 else()
109 FetchContent_GetProperties(libressl)
110 if(NOT libressl_POPULATED)
111 FetchContent_Populate(libressl)
112 add_subdirectory(${libressl_SOURCE_DIR} ${libressl_BINARY_DIR} EXCLUDE_FROM_ALL)
113 endif()
114 endif()
115
116 set(BUILD_SHARED_LIBS ${SAVED_BUILD_SHARED_LIBS})
117 set(BUILD_TESTING ${SAVED_BUILD_TESTING})
118
119 license_add_file("LibreSSL" "${libressl_SOURCE_DIR}/COPYING")
120
121 set(CPPHTTPLIB_OPENSSL_SUPPORT TRUE)
122 target_link_libraries(${TARGET} PUBLIC ssl crypto)
123
124elseif (LLAMA_OPENSSL)
125 find_package(OpenSSL)
126 if (OpenSSL_FOUND)
127 include(CheckCSourceCompiles)
128 set(SAVED_CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES})
129 set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
130 check_c_source_compiles("
131 #include <openssl/opensslv.h>
132 #if defined(OPENSSL_IS_BORINGSSL) || defined(LIBRESSL_VERSION_NUMBER)
133 # if OPENSSL_VERSION_NUMBER < 0x1010107f
134 # error bad version
135 # endif
136 #else
137 # if OPENSSL_VERSION_NUMBER < 0x30000000L
138 # error bad version
139 # endif
140 #endif
141 int main() { return 0; }
142 " OPENSSL_VERSION_SUPPORTED)
143 set(CMAKE_REQUIRED_INCLUDES ${SAVED_CMAKE_REQUIRED_INCLUDES})
144 if (OPENSSL_VERSION_SUPPORTED)
145 message(STATUS "OpenSSL found: ${OPENSSL_VERSION}")
146 set(CPPHTTPLIB_OPENSSL_SUPPORT TRUE)
147 target_link_libraries(${TARGET} PUBLIC OpenSSL::SSL OpenSSL::Crypto)
148 endif()
149 else()
150 message(WARNING "OpenSSL not found, HTTPS support disabled")
151 endif()
152endif()
153
154# disable warnings in 3rd party code
155if(LLAMA_BUILD_BORINGSSL OR LLAMA_BUILD_LIBRESSL)
156 if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
157 target_compile_options(ssl PRIVATE /w)
158 target_compile_options(crypto PRIVATE /w)
159 if(LLAMA_BUILD_BORINGSSL)
160 target_compile_options(fipsmodule PRIVATE /w)
161 endif()
162 else()
163 target_compile_options(ssl PRIVATE -w)
164 target_compile_options(crypto PRIVATE -w)
165 if(LLAMA_BUILD_BORINGSSL)
166 target_compile_options(fipsmodule PRIVATE -w)
167 endif()
168 endif()
169endif()
170
171if (CPPHTTPLIB_OPENSSL_SUPPORT)
172 target_compile_definitions(${TARGET} PUBLIC CPPHTTPLIB_OPENSSL_SUPPORT) # used in server.cpp
173 if (APPLE AND CMAKE_SYSTEM_NAME STREQUAL "Darwin")
174 target_compile_definitions(${TARGET} PRIVATE CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN)
175 find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation REQUIRED)
176 find_library(SECURITY_FRAMEWORK Security REQUIRED)
177 target_link_libraries(${TARGET} PUBLIC ${CORE_FOUNDATION_FRAMEWORK} ${SECURITY_FRAMEWORK})
178 endif()
179 if (WIN32 AND NOT MSVC)
180 target_link_libraries(${TARGET} PUBLIC crypt32)
181 endif()
182endif()