blob: c1f102e7ed6d570cd15a946d555ce0d499ccc276 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
cmake_minimum_required(VERSION 3.14)
project(iggy-cpp-client)
option(BUILD_TESTS "Build and run unit tests" OFF)
option(BUILD_DOCS "Build documentation" OFF)
option(ENABLE_CODE_COVERAGE "Enable coverage reporting" OFF)
# avoid warning about DOWNLOAD_EXTRACT_TIMESTAMP in CMake 3.24
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0")
cmake_policy(SET CMP0135 NEW)
endif()
# global settings
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# set up library dependencies
find_package(ada CONFIG REQUIRED)
find_package(libuv CONFIG REQUIRED)
find_package(nlohmann_json CONFIG REQUIRED)
find_package(spdlog CONFIG REQUIRED)
find_package(unofficial-sodium CONFIG REQUIRED)
# these do not correctly support CMake
find_path(ADA_INCLUDE_DIR ada.h REQUIRED)
find_path(JSON_INCLUDE_DIR nlohmann/json.hpp REQUIRED)
find_path(SODIUM_INCLUDE_DIR sodium.h REQUIRED)
find_path(UTF8H_INCLUDE_DIRS "utf8h/utf8.h" REQUIRED)
# customize the builds of key networking components; WolfSSL is not
# well supported in vcpkg and we want to have more control here
include(ExternalProject)
execute_process(COMMAND nproc OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE NPROC)
externalproject_add(wolfssl
GIT_REPOSITORY https://github.com/wolfSSL/wolfssl
GIT_TAG v5.7.0-stable
PREFIX ${CMAKE_BINARY_DIR}/wolfssl
BUILD_IN_SOURCE 1
CONFIGURE_COMMAND autoreconf -i COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR> --enable-tls13 --enable-tls12 --enable-tlsx --enable-quic --enable-harden --enable-keylog-export --enable-static --enable-sys-ca-certs --enable-libwebsockets --disable-ech --disable-psk --disable-dtls --disable-anonymous --disable-nullcipher --disable-oldtls --disable-sslv3 --disable-webserver --disable-crypttests
BUILD_COMMAND make -j ${NPROC}
BUILD_BYPRODUCTS ${CMAKE_BINARY_DIR}/wolfssl/lib/libwolfssl.a
INSTALL_COMMAND make install
UPDATE_COMMAND ""
)
externalproject_get_property(wolfssl INSTALL_DIR)
set(WOLFSSL_INSTALL_DIR ${INSTALL_DIR})
# customize lws to link to our local wolfSSL library
externalproject_add(lws
GIT_REPOSITORY https://github.com/warmcat/libwebsockets.git
GIT_TAG v4.3.3
PREFIX ${CMAKE_BINARY_DIR}/lws
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DLWS_WITH_SHARED=OFF -DLWS_WITH_WOLFSSL=1 -DLWS_WOLFSSL_INCLUDE_DIRS=${WOLFSSL_INSTALL_DIR}/include -DLWS_WOLFSSL_LIBRARIES=${WOLFSSL_INSTALL_DIR}/lib/libwolfssl.a ..
BUILD_BYPRODUCTS ${CMAKE_BINARY_DIR}/lws/lib/libwebsockets.a
DEPENDS wolfssl
)
externalproject_get_property(lws INSTALL_DIR)
set(LWS_INSTALL_DIR ${INSTALL_DIR})
set(WOLFSSL_INCLUDE_DIR ${CMAKE_BINARY_DIR}/wolfssl/include)
set(WOLFSSL_LIB_DIR ${CMAKE_BINARY_DIR}/wolfssl/lib)
set(LWS_INCLUDE_DIR ${CMAKE_BINARY_DIR}/lws/include)
set(LWS_LIB_DIR ${CMAKE_BINARY_DIR}/lws/lib)
set(IGGY_INCLUDE_DIRS
${ADA_INCLUDE_DIR}
${JSON_INCLUDE_DIR}
${LWS_INCLUDE_DIR}
${SODIUM_INCLUDE_DIR}
${UTF8H_INCLUDE_DIRS}
${WOLFSSL_INCLUDE_DIR}
)
file(GLOB_RECURSE IGGY_SOURCES "sdk/*.cc")
add_library(
iggy
${IGGY_SOURCES}
)
target_include_directories(iggy PRIVATE ${IGGY_INCLUDE_DIRS})
add_dependencies(iggy lws)
target_link_libraries(
iggy PRIVATE
ada::ada
fmt::fmt
libuv::uv_a
nlohmann_json::nlohmann_json
unofficial-sodium::sodium
${WOLFSSL_LIB_DIR}/libwolfssl.a
${LWS_LIB_DIR}/libwebsockets.a
)
# even though this is related to unit tests, to get a full report we need to ensure that
# all library files are compiled with --coverage so gcno is generated properly
if(ENABLE_CODE_COVERAGE)
include(cmake/modules/CodeCoverage.cmake)
append_coverage_compiler_flags()
endif()
if(BUILD_TESTS)
add_subdirectory(tests)
endif()
if(BUILD_DOCS)
add_subdirectory(docs)
endif()