summaryrefslogtreecommitdiffstats
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--CMakeLists.txt431
1 files changed, 431 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..287e212
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,431 @@
+# ngtcp2
+#
+# Copyright (c) 2016 ngtcp2 contributors
+# Copyright (c) 2012 nghttp2 contributors
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+cmake_minimum_required(VERSION 3.1)
+
+# Allow setting VISIBILITY_PRESET on static library targets without warning.
+cmake_policy(SET CMP0063 NEW)
+
+# XXX using 0.1.90 instead of 0.2.0-DEV
+project(ngtcp2 VERSION 0.12.1)
+
+# See versioning rule:
+# https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
+set(LT_CURRENT 9)
+set(LT_REVISION 1)
+set(LT_AGE 0)
+
+set(CRYPTO_OPENSSL_LT_CURRENT 3)
+set(CRYPTO_OPENSSL_LT_REVISION 0)
+set(CRYPTO_OPENSSL_LT_AGE 1)
+
+set(CRYPTO_GNUTLS_LT_CURRENT 3)
+set(CRYPTO_GNUTLS_LT_REVISION 0)
+set(CRYPTO_GNUTLS_LT_AGE 1)
+
+set(CRYPTO_WOLFSSL_LT_CURRENT 0)
+set(CRYPTO_WOLFSSL_LT_REVISION 1)
+set(CRYPTO_WOLFSSL_LT_AGE 0)
+
+set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" "${CMAKE_MODULE_PATH}")
+include(Version)
+
+math(EXPR LT_SOVERSION "${LT_CURRENT} - ${LT_AGE}")
+set(LT_VERSION "${LT_SOVERSION}.${LT_AGE}.${LT_REVISION}")
+
+math(EXPR CRYPTO_OPENSSL_LT_SOVERSION
+ "${CRYPTO_OPENSSL_LT_CURRENT} - ${CRYPTO_OPENSSL_LT_AGE}")
+set(CRYPTO_OPENSSL_LT_VERSION
+ "${CRYPTO_OPENSSL_LT_SOVERSION}.${CRYPTO_OPENSSL_LT_AGE}.${CRYPTO_OPENSSL_LT_REVISION}")
+
+math(EXPR CRYPTO_GNUTLS_LT_SOVERSION
+ "${CRYPTO_GNUTLS_LT_CURRENT} - ${CRYPTO_GNUTLS_LT_AGE}")
+set(CRYPTO_GNUTLS_LT_VERSION
+ "${CRYPTO_GNUTLS_LT_SOVERSION}.${CRYPTO_GNUTLS_LT_AGE}.${CRYPTO_GNUTLS_LT_REVISION}")
+
+math(EXPR CRYPTO_WOLFSSL_LT_SOVERSION
+ "${CRYPTO_WOLFSSL_LT_CURRENT} - ${CRYPTO_WOLFSSL_LT_AGE}")
+set(CRYPTO_WOLFSSL_LT_VERSION
+ "${CRYPTO_WOLFSSL_LT_SOVERSION}.${CRYPTO_WOLFSSL_LT_AGE}.${CRYPTO_WOLFSSL_LT_REVISION}")
+
+set(PACKAGE_VERSION "${PROJECT_VERSION}")
+HexVersion(PACKAGE_VERSION_NUM ${PROJECT_VERSION_MAJOR} ${PROJECT_VERSION_MINOR} ${PROJECT_VERSION_PATCH})
+
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+ set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the build type" FORCE)
+
+ # Include "None" as option to disable any additional (optimization) flags,
+ # relying on just CMAKE_C_FLAGS and CMAKE_CXX_FLAGS (which are empty by
+ # default). These strings are presented in cmake-gui.
+ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
+ "None" "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
+endif()
+
+include(GNUInstallDirs)
+
+include(CMakeOptions.txt)
+
+# Do not disable assertions based on CMAKE_BUILD_TYPE.
+foreach(_build_type "Release" "MinSizeRel" "RelWithDebInfo")
+ foreach(_lang C CXX)
+ string(TOUPPER "CMAKE_${_lang}_FLAGS_${_build_type}" _var)
+ string(REGEX REPLACE "(^| )[/-]D *NDEBUG($| )" " " ${_var} "${${_var}}")
+ endforeach()
+endforeach()
+
+include(CMakePushCheckState)
+include(ExtractValidFlags)
+
+if(NOT CMAKE_C_COMPILER_ID MATCHES "MSVC")
+ if(ENABLE_ASAN)
+ cmake_push_check_state()
+ set(CMAKE_REQUIRED_LIBRARIES "-fsanitize=address")
+ check_c_compiler_flag(-fsanitize=address C__fsanitize_address_VALID)
+ check_cxx_compiler_flag(-fsanitize=address CXX__fsanitize_address_VALID)
+ cmake_pop_check_state()
+ if(NOT C__fsanitize_address_VALID OR NOT CXX__fsanitize_address_VALID)
+ message(WARNING "ENABLE_ASAN was requested, but not supported!")
+ else()
+ set(CMAKE_C_FLAGS "-fsanitize=address ${CMAKE_C_FLAGS}")
+ set(CMAKE_CXX_FLAGS "-fsanitize=address ${CMAKE_CXX_FLAGS}")
+ endif()
+ endif()
+endif()
+
+if(ENABLE_GNUTLS)
+ find_package(GnuTLS 3.7.2)
+endif()
+if(ENABLE_OPENSSL)
+ find_package(OpenSSL 1.1.1)
+endif()
+if(ENABLE_WOLFSSL)
+ find_package(wolfssl 5.5.0)
+endif()
+if(ENABLE_JEMALLOC)
+ find_package(Jemalloc)
+endif()
+find_package(Libev 4.11)
+find_package(Libnghttp3 0.0.0)
+find_package(CUnit 2.1)
+enable_testing()
+set(HAVE_CUNIT ${CUNIT_FOUND})
+if(HAVE_CUNIT)
+ add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
+endif()
+
+# OpenSSL (required for libngtcp2_crypto_openssl,
+# libngtcp2_crypto_picotls and examples)
+include(CheckSymbolExists)
+if(ENABLE_OPENSSL AND OPENSSL_FOUND)
+ set(VANILLA_OPENSSL_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR})
+ set(VANILLA_OPENSSL_LIBRARIES ${OPENSSL_LIBRARIES})
+ set(HAVE_VANILLA_OPENSSL TRUE)
+
+ # Until OpenSSL gains mainline support for QUIC, check for a patched version.
+ cmake_push_check_state()
+ set(CMAKE_REQUIRED_INCLUDES "${OPENSSL_INCLUDE_DIR}")
+ set(CMAKE_REQUIRED_LIBRARIES "${OPENSSL_LIBRARIES}")
+ if(WIN32)
+ set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}" "ws2_32" "bcrypt")
+ endif()
+ check_symbol_exists(SSL_is_quic "openssl/ssl.h" HAVE_SSL_IS_QUIC)
+ if(NOT HAVE_SSL_IS_QUIC)
+ message(WARNING "Disabling OpenSSL due to lack of QUIC support in ${OPENSSL_LIBRARIES}")
+ endif()
+ cmake_pop_check_state()
+endif()
+if(ENABLE_OPENSSL AND HAVE_SSL_IS_QUIC)
+ set(OPENSSL_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR})
+ set(HAVE_OPENSSL TRUE)
+ set(HAVE_CRYPTO TRUE)
+else()
+ set(HAVE_OPENSSL FALSE)
+ set(OPENSSL_INCLUDE_DIRS "")
+ set(OPENSSL_LIBRARIES "")
+endif()
+
+# BoringSSL (required for libngtcp2_crypto_boringssl)
+if(ENABLE_BORINGSSL)
+ cmake_push_check_state()
+ set(CMAKE_REQUIRED_INCLUDES "${BORINGSSL_INCLUDE_DIR}")
+ set(CMAKE_REQUIRED_LIBRARIES "${BORINGSSL_LIBRARIES}")
+ check_symbol_exists(SSL_set_quic_early_data_context "openssl/ssl.h" HAVE_SSL_SET_QUIC_EARLY_DATA_CONTEXT)
+ if(NOT HAVE_SSL_SET_QUIC_EARLY_DATA_CONTEXT)
+ message(WARNING "Disabling BoringSSL due to lack of QUIC support in ${BORINGSSL_LIBRARIES}")
+ endif()
+ cmake_pop_check_state()
+endif()
+if(ENABLE_BORINGSSL AND HAVE_SSL_SET_QUIC_EARLY_DATA_CONTEXT)
+ set(BORINGSSL_INCLUDE_DIRS ${BORINGSSL_INCLUDE_DIR})
+ set(HAVE_BORINGSSL TRUE)
+ set(HAVE_CRYPTO TRUE)
+else()
+ set(HAVE_BORINGSSL FALSE)
+ set(BORINGSSL_INCLUDE_DIRS "")
+ set(BORINGSSL_LIBRARIES "")
+endif()
+
+# jemalloc
+set(HAVE_JEMALLOC ${JEMALLOC_FOUND})
+# libev (required for examples)
+set(HAVE_LIBEV ${LIBEV_FOUND})
+# libnghttp3 (required for examples)
+set(HAVE_LIBNGHTTP3 ${LIBNGHTTP3_FOUND})
+
+# GnuTLS (required for libngtcp2_crypto_gnutls)
+if(ENABLE_GNUTLS AND GNUTLS_FOUND)
+ set(GNUTLS_INCLUDE_DIRS ${GNUTLS_INCLUDE_DIR})
+ set(HAVE_GNUTLS TRUE)
+ set(HAVE_CRYPTO TRUE)
+else()
+ set(HAVE_GNUTLS FALSE)
+ set(GNUTLS_INCLUDE_DIRS "")
+ set(GNUTLS_LIBRARIES "")
+endif()
+
+# Picotls (required for libngtcp2_crypto_picotls)
+if(ENABLE_PICOTLS)
+ cmake_push_check_state()
+ set(CMAKE_REQUIRED_INCLUDES "${PICOTLS_INCLUDE_DIR}" "${VANILLA_OPENSSL_INCLUDE_DIRS}")
+ set(CMAKE_REQUIRED_LIBRARIES "${PICOTLS_LIBRARIES}" "${VANILLA_OPENSSL_LIBRARIES}")
+ check_symbol_exists(ptls_openssl_random_bytes "picotls.h;picotls/openssl.h"
+ HAVE_PTLS_OPENSSL_RANDOM_BYTES)
+ if(NOT HAVE_PTLS_OPENSSL_RANDOM_BYTES)
+ message(WARNING "Disabling Picotls because ptls_openssl_random_bytes not found in ${CMAKE_REQUIRED_LIBRARIES}")
+ endif()
+ cmake_pop_check_state()
+endif()
+if(ENABLE_PICOTLS AND HAVE_PTLS_OPENSSL_RANDOM_BYTES)
+ set(PICOTLS_INCLUDE_DIRS ${PICOTLS_INCLUDE_DIR})
+ set(HAVE_PICOTLS TRUE)
+ set(HAVE_CRYPTO TRUE)
+else()
+ set(HAVE_PICOTLS FALSE)
+ set(PICOTLS_INCLUDE_DIRS "")
+ set(PICOTLS_LIBRARIES "")
+endif()
+
+# wolfSSL (required for libngtcp2_crypto_wolfssl)
+if(ENABLE_WOLFSSL AND WOLFSSL_FOUND)
+ set(WOLFSSL_INCLUDE_DIRS ${WOLFSSL_INCLUDE_DIR})
+ set(HAVE_WOLFSSL TRUE)
+ set(HAVE_CRYPTO TRUE)
+else()
+ set(HAVE_WOLFSSL FALSE)
+ set(WOLFSSL_INCLUDE_DIRS "")
+ set(WOLFSSL_LIBRARIES "")
+endif()
+
+# Checks for header files.
+include(CheckIncludeFile)
+check_include_file("arpa/inet.h" HAVE_ARPA_INET_H)
+check_include_file("netinet/in.h" HAVE_NETINET_IN_H)
+check_include_file("stddef.h" HAVE_STDDEF_H)
+check_include_file("stdint.h" HAVE_STDINT_H)
+check_include_file("stdlib.h" HAVE_STDLIB_H)
+check_include_file("string.h" HAVE_STRING_H)
+check_include_file("unistd.h" HAVE_UNISTD_H)
+check_include_file("sys/endian.h" HAVE_SYS_ENDIAN_H)
+check_include_file("endian.h" HAVE_ENDIAN_H)
+check_include_file("byteswap.h" HAVE_BYTESWAP_H)
+check_include_file("asm/types.h" HAVE_ASM_TYPES_H)
+check_include_file("linux/netlink.h" HAVE_LINUX_NETLINK_H)
+check_include_file("linux/rtnetlink.h" HAVE_LINUX_RTNETLINK_H)
+
+include(CheckTypeSize)
+# Checks for typedefs, structures, and compiler characteristics.
+# AC_TYPE_SIZE_T
+check_type_size("ssize_t" SIZEOF_SSIZE_T)
+if(SIZEOF_SSIZE_T STREQUAL "")
+ # ssize_t is a signed type in POSIX storing at least -1.
+ # Set it to a pointer-size int.
+ set(ssize_t ptrdiff_t)
+endif()
+
+# Checks for symbols.
+if(HAVE_ENDIAN_H)
+ check_symbol_exists(be64toh "endian.h" HAVE_BE64TOH)
+endif()
+if(HAVE_SYS_ENDIAN_H)
+ check_symbol_exists(be64toh "sys/endian.h" HAVE_BE64TOH)
+endif()
+
+check_symbol_exists(bswap_64 "byteswap.h" HAVE_BSWAP_64)
+
+set(WARNCFLAGS)
+set(WARNCXXFLAGS)
+if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
+ if(ENABLE_WERROR)
+ set(WARNCFLAGS /WX)
+ set(WARNCXXFLAGS /WX)
+ endif()
+else()
+ if(ENABLE_WERROR)
+ extract_valid_c_flags(WARNCFLAGS -Werror)
+ extract_valid_c_flags(WARNCXXFLAGS -Werror)
+ endif()
+
+ # For C compiler
+ extract_valid_c_flags(WARNCFLAGS
+ -Wall
+ -Wextra
+ -Wmissing-prototypes
+ -Wstrict-prototypes
+ -Wmissing-declarations
+ -Wpointer-arith
+ -Wdeclaration-after-statement
+ -Wformat-security
+ -Wwrite-strings
+ -Wshadow
+ -Winline
+ -Wnested-externs
+ -Wfloat-equal
+ -Wundef
+ -Wendif-labels
+ -Wempty-body
+ -Wcast-align
+ -Wclobbered
+ -Wvla
+ -Wpragmas
+ -Wunreachable-code
+ -Waddress
+ -Wattributes
+ -Wdiv-by-zero
+ -Wshorten-64-to-32
+
+ -Wconversion
+ -Wextended-offsetof
+ -Wformat-nonliteral
+ -Wlanguage-extension-token
+ -Wmissing-field-initializers
+ -Wmissing-noreturn
+ -Wmissing-variable-declarations
+ # Not used because we cannot change public structs
+ # -Wpadded
+ -Wsign-conversion
+ # Not used because this basically disallows default case
+ # -Wswitch-enum
+ -Wunreachable-code-break
+ -Wunused-macros
+ -Wunused-parameter
+ -Wredundant-decls
+ # Only work with Clang for the moment
+ -Wheader-guard
+ -Wsometimes-uninitialized
+
+ # Only work with gcc7 for the moment
+ -Wduplicated-branches
+ # This is required because we pass format string as "const char*.
+ -Wno-format-nonliteral
+ )
+
+ extract_valid_cxx_flags(WARNCXXFLAGS
+ # For C++ compiler
+ -Wall
+ -Wformat-security
+ -Wsometimes-uninitialized
+ # Disable noexcept-type warning of g++-7. This is not harmful as
+ # long as all source files are compiled with the same compiler.
+ -Wno-noexcept-type
+ )
+endif()
+
+if(ENABLE_DEBUG)
+ set(DEBUGBUILD 1)
+endif()
+
+add_definitions(-DHAVE_CONFIG_H)
+configure_file(cmakeconfig.h.in config.h)
+# autotools-compatible names
+# Sphinx expects relative paths in the .rst files. Use the fact that the files
+# below are all one directory level deep.
+file(RELATIVE_PATH top_srcdir "${CMAKE_CURRENT_BINARY_DIR}/dir" "${CMAKE_CURRENT_SOURCE_DIR}")
+file(RELATIVE_PATH top_builddir "${CMAKE_CURRENT_BINARY_DIR}/dir" "${CMAKE_CURRENT_BINARY_DIR}")
+set(abs_top_srcdir "${CMAKE_CURRENT_SOURCE_DIR}")
+set(abs_top_builddir "${CMAKE_CURRENT_BINARY_DIR}")
+# libngtcp2.pc (pkg-config file)
+set(prefix "${CMAKE_INSTALL_PREFIX}")
+set(exec_prefix "${CMAKE_INSTALL_PREFIX}")
+set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
+set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
+set(VERSION "${PACKAGE_VERSION}")
+# For init scripts and systemd service file (in contrib/)
+set(bindir "${CMAKE_INSTALL_FULL_BINDIR}")
+set(sbindir "${CMAKE_INSTALL_FULL_SBINDIR}")
+foreach(name
+ lib/libngtcp2.pc
+ lib/includes/ngtcp2/version.h
+)
+ configure_file("${name}.in" "${name}" @ONLY)
+endforeach()
+
+if(APPLE)
+ add_definitions(-D__APPLE_USE_RFC_3542)
+endif()
+
+include_directories(
+ "${CMAKE_CURRENT_BINARY_DIR}" # for config.h
+)
+# For use in src/CMakeLists.txt
+set(PKGDATADIR "${CMAKE_INSTALL_FULL_DATADIR}/${CMAKE_PROJECT_NAME}")
+
+install(FILES README.rst DESTINATION "${CMAKE_INSTALL_DOCDIR}")
+
+add_subdirectory(lib)
+add_subdirectory(tests)
+add_subdirectory(crypto)
+add_subdirectory(third-party)
+add_subdirectory(examples)
+
+
+string(TOUPPER "${CMAKE_BUILD_TYPE}" _build_type)
+message(STATUS "summary of build options:
+
+ Package version: ${VERSION}
+ Library version: ${LT_CURRENT}:${LT_REVISION}:${LT_AGE}
+ Install prefix: ${CMAKE_INSTALL_PREFIX}
+ Target system: ${CMAKE_SYSTEM_NAME}
+ Compiler:
+ Build type: ${CMAKE_BUILD_TYPE}
+ C compiler: ${CMAKE_C_COMPILER}
+ CFLAGS: ${CMAKE_C_FLAGS_${_build_type}} ${CMAKE_C_FLAGS}
+ C++ compiler: ${CMAKE_CXX_COMPILER}
+ CXXFLAGS: ${CMAKE_CXX_FLAGS_${_build_type}} ${CMAKE_CXX_FLAGS}
+ WARNCFLAGS: ${WARNCFLAGS}
+ WARNCXXFLAGS: ${WARNCXXFLAGS}
+ Library:
+ Shared: ${ENABLE_SHARED_LIB}
+ Static: ${ENABLE_STATIC_LIB}
+ Test:
+ CUnit: ${HAVE_CUNIT} (LIBS='${CUNIT_LIBRARIES}')
+ Libs:
+ OpenSSL: ${HAVE_OPENSSL} (LIBS='${OPENSSL_LIBRARIES}')
+ Libev: ${HAVE_LIBEV} (LIBS='${LIBEV_LIBRARIES}')
+ Libnghttp3: ${HAVE_LIBNGHTTP3} (LIBS='${LIBNGHTTP3_LIBRARIES}')
+ GnuTLS: ${HAVE_GNUTLS} (LIBS='${GNUTLS_LIBRARIES}')
+ BoringSSL: ${HAVE_BORINGSSL} (LIBS='${BORINGSSL_LIBRARIES}')
+ Picotls: ${HAVE_PICOTLS} (LIBS='${PICOTLS_LIBRARIES}')
+ wolfSSL: ${HAVE_WOLFSSL} (LIBS='${WOLFSSL_LIBRARIES}')
+ Jemalloc: ${HAVE_JEMALLOC} (LIBS='${JEMALLOC_LIBRARIES}')
+")