Packages
hackney
3.0.1
4.7.2
4.7.1
4.7.0
4.6.1
4.6.0
4.5.2
4.5.1
4.5.0
4.4.5
4.4.3
4.4.2
4.4.1
4.4.0
4.3.0
4.2.3
4.2.2
4.2.1
4.2.0
4.1.0
4.0.3
4.0.2
4.0.1
4.0.0
3.2.1
3.2.0
3.1.2
3.1.1
3.1.0
3.0.3
3.0.2
3.0.1
3.0.0
retired
2.0.1
2.0.0
2.0.0-beta.1
1.25.0
1.24.1
1.24.0
1.23.0
1.22.0
1.21.0
1.20.1
1.20.0
1.19.1
1.19.0
1.18.2
1.18.1
1.18.0
1.17.4
1.17.3
1.17.2
1.17.1
1.17.0
1.16.0
1.15.2
1.15.1
1.15.0
1.14.3
1.14.2
1.14.0
1.13.0
1.12.1
1.12.0
1.11.0
1.10.1
1.10.0
1.9.0
1.8.6
1.8.5
1.8.4
1.8.3
1.8.2
1.8.0
1.7.1
1.7.0
1.6.6
retired
1.6.5
1.6.4
retired
1.6.3
1.6.2
1.6.1
1.6.0
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.0
1.1.0
1.0.6
1.0.5
1.0.2
1.0.1
0.15.2
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.1
Simple HTTP client with HTTP/1.1, HTTP/2, and HTTP/3 support
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
c_src/CMakeLists.txt
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
project(HackneyQuicNIF C CXX)
# CMake policies
if(POLICY CMP0028)
cmake_policy(SET CMP0028 NEW)
endif()
if(POLICY CMP0054)
cmake_policy(SET CMP0054 NEW)
endif()
if(POLICY CMP0075)
cmake_policy(SET CMP0075 NEW)
endif()
if(POLICY CMP0077)
cmake_policy(SET CMP0077 NEW)
endif()
# CMake module path
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/CMake")
# Architecture detection
message(STATUS "Building for: ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_PROCESSOR}")
# Standard package manager paths by platform
if(APPLE)
if(EXISTS "/opt/homebrew")
list(APPEND CMAKE_PREFIX_PATH "/opt/homebrew")
list(APPEND CMAKE_INCLUDE_PATH "/opt/homebrew/include")
list(APPEND CMAKE_LIBRARY_PATH "/opt/homebrew/lib")
endif()
if(EXISTS "/opt/local")
list(APPEND CMAKE_PREFIX_PATH "/opt/local")
list(APPEND CMAKE_INCLUDE_PATH "/opt/local/include")
list(APPEND CMAKE_LIBRARY_PATH "/opt/local/lib")
endif()
if(EXISTS "/usr/local/include")
list(APPEND CMAKE_PREFIX_PATH "/usr/local")
list(APPEND CMAKE_INCLUDE_PATH "/usr/local/include")
list(APPEND CMAKE_LIBRARY_PATH "/usr/local/lib")
endif()
elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
if(EXISTS "/usr/local")
list(APPEND CMAKE_PREFIX_PATH "/usr/local")
list(APPEND CMAKE_INCLUDE_PATH "/usr/local/include")
list(APPEND CMAKE_LIBRARY_PATH "/usr/local/lib")
endif()
elseif(CMAKE_SYSTEM_NAME STREQUAL "NetBSD")
if(EXISTS "/usr/pkg")
list(APPEND CMAKE_PREFIX_PATH "/usr/pkg")
list(APPEND CMAKE_INCLUDE_PATH "/usr/pkg/include")
list(APPEND CMAKE_LIBRARY_PATH "/usr/pkg/lib")
endif()
elseif(CMAKE_SYSTEM_NAME STREQUAL "OpenBSD")
if(EXISTS "/usr/local")
list(APPEND CMAKE_PREFIX_PATH "/usr/local")
list(APPEND CMAKE_INCLUDE_PATH "/usr/local/include")
list(APPEND CMAKE_LIBRARY_PATH "/usr/local/lib")
endif()
endif()
# Output directory
set(priv_dir "${PROJECT_SOURCE_DIR}/../priv")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${priv_dir})
if(MSVC)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
endif()
# C/C++ standards (BoringSSL needs C++)
set(CMAKE_C_STANDARD 17)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Enable position independent code for all targets (required for shared library NIF)
# Must be set before adding any subdirectories
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Build type
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
# Threading
set(CMAKE_THREAD_PREFER_PTHREAD ON)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
# Find zlib (required by lsquic)
find_package(ZLIB REQUIRED)
message(STATUS "Found zlib: ${ZLIB_LIBRARIES}")
#--------------------------------------------------------------------------------
# Find Erlang
#--------------------------------------------------------------------------------
include(FindErlang)
#--------------------------------------------------------------------------------
# Build BoringSSL
#--------------------------------------------------------------------------------
set(BORINGSSL_DIR "${PROJECT_SOURCE_DIR}/boringssl")
message(STATUS "Building BoringSSL from: ${BORINGSSL_DIR}")
# BoringSSL build options
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
set(OPENSSL_NO_ASM OFF CACHE BOOL "" FORCE)
set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
# Add BoringSSL subdirectory
add_subdirectory(${BORINGSSL_DIR} ${CMAKE_BINARY_DIR}/boringssl EXCLUDE_FROM_ALL)
# BoringSSL include directory
set(BORINGSSL_INCLUDE "${BORINGSSL_DIR}/include")
message(STATUS "BoringSSL include: ${BORINGSSL_INCLUDE}")
#--------------------------------------------------------------------------------
# Build lsquic
#--------------------------------------------------------------------------------
set(LSQUIC_DIR "${PROJECT_SOURCE_DIR}/lsquic")
message(STATUS "Building lsquic from: ${LSQUIC_DIR}")
# lsquic build options - tell it where BoringSSL is
set(BORINGSSL_INCLUDE ${BORINGSSL_INCLUDE} CACHE PATH "" FORCE)
set(BORINGSSL_LIB_ssl ssl CACHE STRING "" FORCE)
set(BORINGSSL_LIB_crypto crypto CACHE STRING "" FORCE)
set(ZLIB_LIB ${ZLIB_LIBRARIES} CACHE STRING "" FORCE)
# Disable tests and examples
set(LSQUIC_BIN OFF CACHE BOOL "" FORCE)
set(LSQUIC_TESTS OFF CACHE BOOL "" FORCE)
set(LSQUIC_SHARED_LIB OFF CACHE BOOL "" FORCE)
# Add lsquic subdirectory
add_subdirectory(${LSQUIC_DIR} ${CMAKE_BINARY_DIR}/lsquic EXCLUDE_FROM_ALL)
#--------------------------------------------------------------------------------
# NIF target
#--------------------------------------------------------------------------------
set(NIF_TARGET hackney_quic)
add_library(${NIF_TARGET} MODULE
${CMAKE_CURRENT_SOURCE_DIR}/hackney_quic_nif.c
${CMAKE_CURRENT_SOURCE_DIR}/quic_conn.c
)
# Include directories
target_include_directories(${NIF_TARGET}
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${ERLANG_ERTS_INCLUDE_PATH}
${BORINGSSL_INCLUDE}
${LSQUIC_DIR}/include
)
# Compiler flags
if(MSVC)
target_compile_options(${NIF_TARGET} PRIVATE /W4)
else()
target_compile_options(${NIF_TARGET} PRIVATE
-Wall -Wextra
-Wno-unused-parameter
-fPIC
-fvisibility=hidden
)
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
target_compile_options(${NIF_TARGET} PRIVATE -O2)
endif()
endif()
# Linker flags
if(APPLE)
set_target_properties(${NIF_TARGET} PROPERTIES
LINK_FLAGS "-undefined dynamic_lookup"
)
elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
set_target_properties(${NIF_TARGET} PROPERTIES
LINK_FLAGS "-L/usr/local/lib"
)
endif()
# Link libraries
target_link_libraries(${NIF_TARGET}
PRIVATE
lsquic
ssl
crypto
${ZLIB_LIBRARIES}
Threads::Threads
)
if(MSVC)
target_link_libraries(${NIF_TARGET} PRIVATE ws2_32)
endif()
# Output name and linker settings
# Use C++ linker since BoringSSL is C++ (prevents C++ runtime initialization issues)
set_target_properties(${NIF_TARGET} PROPERTIES
PREFIX ""
OUTPUT_NAME "${NIF_TARGET}"
LINKER_LANGUAGE CXX
)