2021-04-15 17:39:45 +00:00
option ( SUBMODULE_CHECK "Enables checking that vendored library submodules are up to date" ON )
if ( SUBMODULE_CHECK )
find_package ( Git )
if ( GIT_FOUND )
function ( check_submodule relative_path )
execute_process ( COMMAND git rev-parse "HEAD" WORKING_DIRECTORY ${ CMAKE_CURRENT_SOURCE_DIR } / ${ relative_path } OUTPUT_VARIABLE localHead )
execute_process ( COMMAND git rev-parse "HEAD:external/${relative_path}" WORKING_DIRECTORY ${ CMAKE_CURRENT_SOURCE_DIR } OUTPUT_VARIABLE checkedHead )
string ( COMPARE EQUAL "${localHead}" "${checkedHead}" upToDate )
if ( upToDate )
message ( STATUS "Submodule 'external/${relative_path}' is up-to-date" )
else ( )
message ( FATAL_ERROR "Submodule 'external/${relative_path}' is not up-to-date. Please update with\ngit submodule update --init --recursive\nor run cmake with -DSUBMODULE_CHECK=OFF" )
endif ( )
2022-07-16 00:41:14 +00:00
# Extra arguments check nested submodules
foreach ( submod ${ ARGN } )
execute_process ( COMMAND git rev-parse "HEAD" WORKING_DIRECTORY ${ CMAKE_CURRENT_SOURCE_DIR } / ${ relative_path } / ${ submod } OUTPUT_VARIABLE localHead )
execute_process ( COMMAND git rev-parse "HEAD:${submod}" WORKING_DIRECTORY ${ CMAKE_CURRENT_SOURCE_DIR } / ${ relative_path } OUTPUT_VARIABLE checkedHead )
string ( COMPARE EQUAL "${localHead}" "${checkedHead}" upToDate )
if ( NOT upToDate )
message ( FATAL_ERROR "Nested submodule '${relative_path}/${submod}' is not up-to-date. Please update with\ngit submodule update --init --recursive\nor run cmake with -DSUBMODULE_CHECK=OFF" )
endif ( )
endforeach ( )
2021-04-15 17:39:45 +00:00
endfunction ( )
message ( STATUS "Checking submodules" )
check_submodule ( nlohmann )
check_submodule ( cxxopts )
check_submodule ( ghc-filesystem )
2022-07-16 00:41:14 +00:00
check_submodule ( oxen-logging fmt spdlog )
2021-04-15 17:39:45 +00:00
check_submodule ( pybind11 )
check_submodule ( sqlite_orm )
check_submodule ( oxen-mq )
2022-02-17 18:44:31 +00:00
check_submodule ( oxen-encoding )
2021-04-15 17:39:45 +00:00
check_submodule ( uvw )
check_submodule ( cpr )
2021-03-08 17:25:22 +00:00
check_submodule ( ngtcp2 )
2021-04-15 17:39:45 +00:00
endif ( )
endif ( )
2022-05-31 01:01:03 +00:00
macro ( system_or_submodule BIGNAME smallname pkgconf subdir )
option ( FORCE_ ${ BIGNAME } _SUBMODULE "force using ${smallname} submodule" OFF )
2022-06-22 21:56:35 +00:00
if ( NOT BUILD_STATIC_DEPS AND NOT FORCE_ ${ BIGNAME } _SUBMODULE AND NOT FORCE_ALL_SUBMODULES )
2022-05-31 01:01:03 +00:00
pkg_check_modules ( ${ BIGNAME } ${ pkgconf } IMPORTED_TARGET )
endif ( )
if ( ${ BIGNAME } _FOUND )
add_library ( ${ smallname } INTERFACE )
if ( NOT TARGET PkgConfig:: ${ BIGNAME } AND CMAKE_VERSION VERSION_LESS "3.21" )
# Work around cmake bug 22180 (PkgConfig::THING not set if no flags needed)
else ( )
target_link_libraries ( ${ smallname } INTERFACE PkgConfig:: ${ BIGNAME } )
endif ( )
message ( STATUS "Found system ${smallname} ${${BIGNAME}_VERSION}" )
else ( )
message ( STATUS "using ${smallname} submodule" )
add_subdirectory ( ${ subdir } )
endif ( )
if ( NOT TARGET ${ smallname } :: ${ smallname } )
add_library ( ${ smallname } :: ${ smallname } ALIAS ${ smallname } )
endif ( )
endmacro ( )
2022-10-05 19:48:59 +00:00
system_or_submodule ( OXENC oxenc liboxenc>=1.0.4 oxen-encoding )
2022-09-28 16:37:19 +00:00
system_or_submodule ( OXENMQ oxenmq liboxenmq>=1.2.14 oxen-mq )
2022-05-31 01:01:03 +00:00
set ( JSON_BuildTests OFF CACHE INTERNAL "" )
2022-06-22 21:56:35 +00:00
set ( JSON_Install OFF CACHE INTERNAL "" )
2022-05-31 01:01:03 +00:00
system_or_submodule ( NLOHMANN nlohmann_json nlohmann_json>=3.7.0 nlohmann )
2022-07-16 00:41:14 +00:00
if ( STATIC OR FORCE_SPDLOG_SUBMODULE OR FORCE_FMT_SUBMODULE )
set ( OXEN_LOGGING_FORCE_SUBMODULES ON CACHE INTERNAL "" )
endif ( )
set ( OXEN_LOGGING_SOURCE_ROOT "${PROJECT_SOURCE_DIR}" CACHE INTERNAL "" )
add_subdirectory ( oxen-logging )
2022-05-31 01:01:03 +00:00
2021-04-15 17:39:45 +00:00
if ( WITH_HIVE )
add_subdirectory ( pybind11 EXCLUDE_FROM_ALL )
endif ( )
add_subdirectory ( cxxopts EXCLUDE_FROM_ALL )
2022-08-30 20:25:28 +00:00
if ( WITH_PEERSTATS )
add_library ( sqlite_orm INTERFACE )
target_include_directories ( sqlite_orm SYSTEM INTERFACE sqlite_orm/include )
if ( NOT TARGET sqlite3 )
add_library ( sqlite3 INTERFACE )
pkg_check_modules ( SQLITE3 REQUIRED IMPORTED_TARGET sqlite3 )
target_link_libraries ( sqlite3 INTERFACE PkgConfig::SQLITE3 )
endif ( )
target_link_libraries ( sqlite_orm INTERFACE sqlite3 )
2021-04-15 17:39:45 +00:00
endif ( )
add_library ( uvw INTERFACE )
target_include_directories ( uvw INTERFACE uvw/src )
target_link_libraries ( uvw INTERFACE libuv )
2021-09-10 18:09:55 +00:00
# ngtcp2 needs some massaging to build nicely:
include ( ngtcp2_lib )
add_ngtcp2_lib ( )
2021-05-14 17:07:44 +00:00
2021-04-15 17:39:45 +00:00
# cpr configuration. Ideally we'd just do this via add_subdirectory, but cpr's cmake requires
# 3.15+, and we target lower than that (and this is fairly simple to build).
2021-09-20 20:16:46 +00:00
if ( WITH_BOOTSTRAP )
2021-09-30 14:43:06 +00:00
if ( NOT BUILD_STATIC_DEPS )
find_package ( CURL REQUIRED COMPONENTS HTTP HTTPS SSL )
2021-04-15 17:39:45 +00:00
2021-09-30 14:43:06 +00:00
# CURL::libcurl wasn't added to FindCURL until cmake 3.12, so add it if necessary
if ( CMAKE_VERSION VERSION_LESS 3.12 AND NOT TARGET CURL::libcurl )
add_library ( libcurl UNKNOWN IMPORTED GLOBAL )
set_target_properties ( libcurl PROPERTIES
I M P O R T E D _ L O C A T I O N $ { C U R L _ L I B R A R I E S }
I N T E R F A C E _ I N C L U D E _ D I R E C T O R I E S " $ { C U R L _ I N C L U D E _ D I R S } " )
add_library ( CURL_libcurl INTERFACE )
target_link_libraries ( CURL_libcurl INTERFACE libcurl )
add_library ( CURL::libcurl ALIAS CURL_libcurl )
endif ( )
2021-04-15 17:39:45 +00:00
endif ( )
2021-09-30 14:43:06 +00:00
file ( GLOB cpr_sources ${ conf_depends } cpr/cpr/*.cpp )
2021-04-15 17:39:45 +00:00
2021-09-30 14:43:06 +00:00
add_library ( cpr STATIC EXCLUDE_FROM_ALL ${ cpr_sources } )
target_link_libraries ( cpr PUBLIC CURL::libcurl )
target_include_directories ( cpr PUBLIC cpr/include )
target_compile_definitions ( cpr PUBLIC CPR_CURL_NOSIGNAL )
add_library ( cpr::cpr ALIAS cpr )
2022-10-20 15:04:46 +00:00
file ( READ cpr/CMakeLists.txt cpr_cmake_head LIMIT 1000 )
if ( cpr_cmake_head MATCHES "project\\(cpr VERSION ([0-9]+)\.([0-9]+)\.([0-9]+) LANGUAGES CXX\\)" )
set ( cpr_VERSION_MAJOR ${ CMAKE_MATCH_1 } )
set ( cpr_VERSION_MINOR ${ CMAKE_MATCH_2 } )
set ( cpr_VERSION_PATCH ${ CMAKE_MATCH_3 } )
set ( cpr_VERSION "${cpr_VERSION_MAJOR}.${cpr_VERSION_MINOR}.${cpr_VERSION_PATCH}" )
set ( cpr_VERSION_NUM "(${cpr_VERSION_MAJOR} * 0x10000 + ${cpr_VERSION_MINOR} * 0x100 + ${cpr_VERSION_PATCH})" )
configure_file ( cpr/cmake/cprver.h.in "${CMAKE_CURRENT_BINARY_DIR}/cpr_generated_includes/cpr/cprver.h" )
target_include_directories ( cpr PUBLIC "${CMAKE_CURRENT_BINARY_DIR}/cpr_generated_includes" )
else ( )
message ( FATAL_ERROR "Could not identify cpr submodule version!" )
endif ( )
2021-09-20 20:16:46 +00:00
endif ( )