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()