1# nghttp2 - HTTP/2 C Library 2# 3# Copyright (c) 2012, 2013, 2014, 2015 Tatsuhiro Tsujikawa 4# Copyright (c) 2016 Peter Wu <peter@lekensteyn.nl> 5# 6# Permission is hereby granted, free of charge, to any person obtaining 7# a copy of this software and associated documentation files (the 8# "Software"), to deal in the Software without restriction, including 9# without limitation the rights to use, copy, modify, merge, publish, 10# distribute, sublicense, and/or sell copies of the Software, and to 11# permit persons to whom the Software is furnished to do so, subject to 12# the following conditions: 13# 14# The above copyright notice and this permission notice shall be 15# included in all copies or substantial portions of the Software. 16# 17# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 21# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 25cmake_minimum_required(VERSION 3.0) 26# XXX using 1.8.90 instead of 1.9.0-DEV 27project(nghttp2 VERSION 1.58.0) 28 29# See versioning rule: 30# https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html 31set(LT_CURRENT 39) 32set(LT_REVISION 1) 33set(LT_AGE 25) 34 35set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) 36include(Version) 37 38math(EXPR LT_SOVERSION "${LT_CURRENT} - ${LT_AGE}") 39set(LT_VERSION "${LT_SOVERSION}.${LT_AGE}.${LT_REVISION}") 40set(PACKAGE_VERSION "${PROJECT_VERSION}") 41HexVersion(PACKAGE_VERSION_NUM ${PROJECT_VERSION_MAJOR} ${PROJECT_VERSION_MINOR} ${PROJECT_VERSION_PATCH}) 42 43if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) 44 set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the build type" FORCE) 45 46 # Include "None" as option to disable any additional (optimization) flags, 47 # relying on just CMAKE_C_FLAGS and CMAKE_CXX_FLAGS (which are empty by 48 # default). These strings are presented in cmake-gui. 49 set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS 50 "None" "Debug" "Release" "MinSizeRel" "RelWithDebInfo") 51endif() 52 53include(GNUInstallDirs) 54 55# For documentation 56find_package(Python3 COMPONENTS Interpreter) 57 58# Auto-detection of features that can be toggled 59find_package(OpenSSL 1.0.1) 60find_package(Libev 4.11) 61find_package(Libcares 1.7.5) 62find_package(ZLIB 1.2.3) 63find_package(Libngtcp2 0.0.0) 64find_package(Libngtcp2_crypto_quictls 0.0.0) 65if(LIBNGTCP2_CRYPTO_QUICTLS_FOUND) 66 set(HAVE_LIBNGTCP2_CRYPTO_QUICTLS 1) 67endif() 68find_package(Libnghttp3 0.0.0) 69if(WITH_LIBBPF) 70 find_package(Libbpf 0.4.0) 71 if(NOT LIBBPF_FOUND) 72 message(FATAL_ERROR "libbpf was requested (WITH_LIBBPF=1) but not found.") 73 endif() 74endif() 75if(OPENSSL_FOUND AND LIBEV_FOUND AND ZLIB_FOUND) 76 set(ENABLE_APP_DEFAULT ON) 77else() 78 set(ENABLE_APP_DEFAULT OFF) 79endif() 80find_package(Systemd 209) 81find_package(Jansson 2.5) 82set(ENABLE_HPACK_TOOLS_DEFAULT ${JANSSON_FOUND}) 83# 2.0.8 is required because we use evconnlistener_set_error_cb() 84find_package(Libevent 2.0.8 COMPONENTS core extra openssl) 85set(ENABLE_EXAMPLES_DEFAULT ${LIBEVENT_OPENSSL_FOUND}) 86 87find_package(LibXml2 2.6.26) 88set(WITH_LIBXML2_DEFAULT ${LIBXML2_FOUND}) 89find_package(Jemalloc) 90set(WITH_JEMALLOC_DEFAULT ${JEMALLOC_FOUND}) 91 92include(CMakeOptions.txt) 93 94if(ENABLE_LIB_ONLY AND (ENABLE_APP OR ENABLE_HPACK_TOOLS OR ENABLE_EXAMPLES)) 95 # Remember when disabled options are disabled for later diagnostics. 96 set(ENABLE_LIB_ONLY_DISABLED_OTHERS 1) 97else() 98 set(ENABLE_LIB_ONLY_DISABLED_OTHERS 0) 99endif() 100if(ENABLE_LIB_ONLY) 101 set(ENABLE_APP OFF) 102 set(ENABLE_HPACK_TOOLS OFF) 103 set(ENABLE_EXAMPLES OFF) 104endif() 105 106# Do not disable assertions based on CMAKE_BUILD_TYPE. 107foreach(_build_type "Release" "MinSizeRel" "RelWithDebInfo") 108 foreach(_lang C CXX) 109 string(TOUPPER "CMAKE_${_lang}_FLAGS_${_build_type}" _var) 110 string(REGEX REPLACE "(^| )[/-]D *NDEBUG($| )" " " ${_var} "${${_var}}") 111 endforeach() 112endforeach() 113 114if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang") 115 set(HINT_NORETURN "__attribute__((noreturn))") 116else() 117 set(HINT_NORETURN) 118endif() 119 120include(ExtractValidFlags) 121foreach(_cxx1x_flag -std=c++14) 122 extract_valid_cxx_flags(_cxx1x_flag_supported ${_cxx1x_flag}) 123 if(_cxx1x_flag_supported) 124 set(CXX1XCXXFLAGS ${_cxx1x_flag}) 125 break() 126 endif() 127endforeach() 128 129include(CMakePushCheckState) 130include(CheckCXXSourceCompiles) 131cmake_push_check_state() 132set(CMAKE_REQUIRED_DEFINITIONS "${CXX1XCXXFLAGS}") 133# Check that std::future is available. 134check_cxx_source_compiles(" 135#include <vector> 136#include <future> 137int main() { std::vector<std::future<int>> v; }" HAVE_STD_FUTURE) 138# Check that std::map::emplace is available for g++-4.7. 139check_cxx_source_compiles(" 140#include <map> 141int main() { std::map<int, int>().emplace(1, 2); }" HAVE_STD_MAP_EMPLACE) 142cmake_pop_check_state() 143 144 145# Checks for libraries. 146# Additional libraries required for programs under src directory. 147set(APP_LIBRARIES) 148 149set(CMAKE_THREAD_PREFER_PTHREAD 1) 150find_package(Threads) 151if(CMAKE_USE_PTHREADS_INIT) 152 list(APPEND APP_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) 153endif() 154# XXX android and C++, is this still needed in cmake? 155# case "$host" in 156# *android*) 157# android_build=yes 158# # android does not need -pthread, but needs following 3 libs for C++ 159# APPLDFLAGS="$APPLDFLAGS -lstdc++ -latomic -lsupc++" 160 161# dl: openssl requires libdl when it is statically linked. 162# XXX shouldn't ${CMAKE_DL_LIBS} be appended to OPENSSL_LIBRARIES instead of 163# APP_LIBRARIES if it is really specific to OpenSSL? 164 165find_package(CUnit 2.1) 166enable_testing() 167set(HAVE_CUNIT ${CUNIT_FOUND}) 168if(HAVE_CUNIT) 169 add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}) 170endif() 171 172# openssl (for src) 173include(CheckSymbolExists) 174set(HAVE_OPENSSL ${OPENSSL_FOUND}) 175if(OPENSSL_FOUND) 176 set(OPENSSL_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR}) 177 cmake_push_check_state() 178 set(CMAKE_REQUIRED_INCLUDES "${OPENSSL_INCLUDE_DIR}") 179 set(CMAKE_REQUIRED_LIBRARIES "${OPENSSL_LIBRARIES}") 180 if(WIN32) 181 set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}" "ws2_32" "bcrypt") 182 endif() 183 check_symbol_exists(SSL_is_quic "openssl/ssl.h" HAVE_SSL_IS_QUIC) 184 if(NOT HAVE_SSL_IS_QUIC) 185 message(WARNING "OpenSSL in ${OPENSSL_LIBRARIES} does not have SSL_is_quic. HTTP/3 support cannot be enabled") 186 endif() 187 cmake_pop_check_state() 188else() 189 set(OPENSSL_INCLUDE_DIRS "") 190 set(OPENSSL_LIBRARIES "") 191endif() 192# libev (for src) 193set(HAVE_LIBEV ${LIBEV_FOUND}) 194set(HAVE_ZLIB ${ZLIB_FOUND}) 195set(HAVE_SYSTEMD ${SYSTEMD_FOUND}) 196set(HAVE_LIBEVENT_OPENSSL ${LIBEVENT_FOUND}) 197if(LIBEVENT_FOUND) 198 # Must both link the core and openssl libraries. 199 set(LIBEVENT_OPENSSL_LIBRARIES ${LIBEVENT_LIBRARIES}) 200endif() 201# libc-ares (for src) 202set(HAVE_LIBCARES ${LIBCARES_FOUND}) 203if(LIBCARES_FOUND) 204 set(LIBCARES_INCLUDE_DIRS ${LIBCARES_INCLUDE_DIR}) 205else() 206 set(LIBCARES_INCLUDE_DIRS "") 207 set(LIBCARES_LIBRARIES "") 208endif() 209# jansson (for src/nghttp, src/deflatehd and src/inflatehd) 210set(HAVE_JANSSON ${JANSSON_FOUND}) 211# libxml2 (for src/nghttp) 212set(HAVE_LIBXML2 ${LIBXML2_FOUND}) 213if(LIBXML2_FOUND) 214 set(LIBXML2_INCLUDE_DIRS ${LIBXML2_INCLUDE_DIR}) 215else() 216 set(LIBXML2_INCLUDE_DIRS "") 217 set(LIBXML2_LIBRARIES "") 218endif() 219# jemalloc 220set(HAVE_JEMALLOC ${JEMALLOC_FOUND}) 221 222# libbpf (for bpf) 223set(HAVE_LIBBPF ${LIBBPF_FOUND}) 224if(LIBBPF_FOUND) 225 set(BPFCFLAGS -Wall -O2 -g) 226 if(CMAKE_SYSTEM_NAME STREQUAL "Linux") 227 # For Debian/Ubuntu 228 set(EXTRABPFCFLAGS -I/usr/include/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu) 229 endif() 230 231 check_c_source_compiles(" 232#include <linux/bpf.h> 233int main() { enum bpf_stats_type foo; (void)foo; }" HAVE_BPF_STATS_TYPE) 234endif() 235 236# The nghttp, nghttpd and nghttpx under src depend on zlib, OpenSSL and libev 237if(ENABLE_APP AND NOT (ZLIB_FOUND AND OPENSSL_FOUND AND LIBEV_FOUND)) 238 message(FATAL_ERROR "Applications were requested (ENABLE_APP=1) but dependencies are not met.") 239endif() 240 241# HTTP/3 requires quictls/openssl, libngtcp2, libngtcp2_crypto_quictls 242# and libnghttp3. 243if(ENABLE_HTTP3 AND NOT (HAVE_SSL_IS_QUIC AND LIBNGTCP2_FOUND AND LIBNGTCP2_CRYPTO_QUICTLS_FOUND AND LIBNGHTTP3_FOUND)) 244 message(FATAL_ERROR "HTTP/3 was requested (ENABLE_HTTP3=1) but dependencies are not met.") 245endif() 246 247# HPACK tools requires jansson 248if(ENABLE_HPACK_TOOLS AND NOT HAVE_JANSSON) 249 message(FATAL_ERROR "HPACK tools were requested (ENABLE_HPACK_TOOLS=1) but dependencies are not met.") 250endif() 251 252# examples 253if(ENABLE_EXAMPLES AND NOT (OPENSSL_FOUND AND LIBEVENT_OPENSSL_FOUND)) 254 message(FATAL_ERROR "examples were requested (ENABLE_EXAMPLES=1) but dependencies are not met.") 255endif() 256 257# third-party http-parser only be built when needed 258if(ENABLE_EXAMPLES OR ENABLE_APP OR ENABLE_HPACK_TOOLS) 259 set(ENABLE_THIRD_PARTY 1) 260 # mruby (for src/nghttpx) 261 set(HAVE_MRUBY ${WITH_MRUBY}) 262 set(HAVE_NEVERBLEED ${WITH_NEVERBLEED}) 263else() 264 set(HAVE_MRUBY 0) 265 set(HAVE_NEVERBLEED 0) 266endif() 267 268# Checks for header files. 269include(CheckIncludeFile) 270check_include_file("arpa/inet.h" HAVE_ARPA_INET_H) 271check_include_file("fcntl.h" HAVE_FCNTL_H) 272check_include_file("inttypes.h" HAVE_INTTYPES_H) 273check_include_file("limits.h" HAVE_LIMITS_H) 274check_include_file("netdb.h" HAVE_NETDB_H) 275check_include_file("netinet/in.h" HAVE_NETINET_IN_H) 276check_include_file("netinet/ip.h" HAVE_NETINET_IP_H) 277check_include_file("pwd.h" HAVE_PWD_H) 278check_include_file("sys/socket.h" HAVE_SYS_SOCKET_H) 279check_include_file("sys/time.h" HAVE_SYS_TIME_H) 280check_include_file("sysinfoapi.h" HAVE_SYSINFOAPI_H) 281check_include_file("syslog.h" HAVE_SYSLOG_H) 282check_include_file("time.h" HAVE_TIME_H) 283check_include_file("unistd.h" HAVE_UNISTD_H) 284 285include(CheckTypeSize) 286# Checks for typedefs, structures, and compiler characteristics. 287# AC_TYPE_SIZE_T 288check_type_size("ssize_t" SIZEOF_SSIZE_T) 289if(SIZEOF_SSIZE_T STREQUAL "") 290 # ssize_t is a signed type in POSIX storing at least -1. 291 # Set it to "int" to match the behavior of AC_TYPE_SSIZE_T (autotools). 292 set(ssize_t int) 293endif() 294# AC_TYPE_UINT8_T 295# AC_TYPE_UINT16_T 296# AC_TYPE_UINT32_T 297# AC_TYPE_UINT64_T 298# AC_TYPE_INT8_T 299# AC_TYPE_INT16_T 300# AC_TYPE_INT32_T 301# AC_TYPE_INT64_T 302# AC_TYPE_OFF_T 303# AC_TYPE_PID_T 304# AC_TYPE_UID_T 305# XXX To support inline for crappy compilers, see https://cmake.org/Wiki/CMakeTestInline 306# AC_C_INLINE 307# XXX is AC_SYS_LARGEFILE still needed for modern systems? 308# add_definitions(-D_FILE_OFFSET_BITS=64) 309 310include(CheckStructHasMember) 311check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_STRUCT_TM_TM_GMTOFF) 312 313# Check size of pointer to decide we need 8 bytes alignment adjustment. 314check_type_size("int *" SIZEOF_INT_P) 315check_type_size("time_t" SIZEOF_TIME_T) 316 317# Checks for library functions. 318include(CheckFunctionExists) 319check_function_exists(_Exit HAVE__EXIT) 320check_function_exists(accept4 HAVE_ACCEPT4) 321check_function_exists(clock_gettime HAVE_CLOCK_GETTIME) 322check_function_exists(mkostemp HAVE_MKOSTEMP) 323 324check_symbol_exists(GetTickCount64 sysinfoapi.h HAVE_GETTICKCOUNT64) 325 326include(CheckSymbolExists) 327# XXX does this correctly detect initgroups (un)availability on cygwin? 328check_symbol_exists(initgroups grp.h HAVE_DECL_INITGROUPS) 329if(NOT HAVE_DECL_INITGROUPS AND HAVE_UNISTD_H) 330 # FreeBSD declares initgroups() in unistd.h 331 check_symbol_exists(initgroups unistd.h HAVE_DECL_INITGROUPS2) 332 if(HAVE_DECL_INITGROUPS2) 333 set(HAVE_DECL_INITGROUPS 1) 334 endif() 335endif() 336 337set(WARNCFLAGS) 338set(WARNCXXFLAGS) 339if(CMAKE_C_COMPILER_ID MATCHES "MSVC") 340 if(ENABLE_WERROR) 341 set(WARNCFLAGS /WX) 342 set(WARNCXXFLAGS /WX) 343 endif() 344else() 345 if(ENABLE_WERROR) 346 set(WARNCFLAGS "-Werror") 347 set(WARNCXXFLAGS "-Werror") 348 endif() 349 350 include(PickyWarningsC) 351 include(PickyWarningsCXX) 352endif() 353 354if(ENABLE_DEBUG) 355 set(DEBUGBUILD 1) 356endif() 357 358# Some platform does not have working std::future. We disable 359# threading for those platforms. 360if(NOT ENABLE_THREADS OR NOT HAVE_STD_FUTURE) 361 set(NOTHREADS 1) 362endif() 363 364add_definitions(-DHAVE_CONFIG_H) 365configure_file(cmakeconfig.h.in config.h) 366# autotools-compatible names 367# Sphinx expects relative paths in the .rst files. Use the fact that the files 368# below are all one directory level deep. 369file(RELATIVE_PATH top_srcdir "${CMAKE_CURRENT_BINARY_DIR}/dir" "${CMAKE_CURRENT_SOURCE_DIR}") 370file(RELATIVE_PATH top_builddir "${CMAKE_CURRENT_BINARY_DIR}/dir" "${CMAKE_CURRENT_BINARY_DIR}") 371set(abs_top_srcdir "${CMAKE_CURRENT_SOURCE_DIR}") 372set(abs_top_builddir "${CMAKE_CURRENT_BINARY_DIR}") 373# libnghttp2.pc (pkg-config file) 374set(prefix "${CMAKE_INSTALL_PREFIX}") 375set(exec_prefix "${CMAKE_INSTALL_PREFIX}") 376set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}") 377set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}") 378set(VERSION "${PACKAGE_VERSION}") 379# For init scripts and systemd service file (in contrib/) 380set(bindir "${CMAKE_INSTALL_FULL_BINDIR}") 381set(sbindir "${CMAKE_INSTALL_FULL_SBINDIR}") 382foreach(name 383 lib/libnghttp2.pc 384 lib/includes/nghttp2/nghttp2ver.h 385 integration-tests/config.go 386 integration-tests/setenv 387 doc/conf.py 388 doc/index.rst 389 doc/package_README.rst 390 doc/tutorial-client.rst 391 doc/tutorial-server.rst 392 doc/tutorial-hpack.rst 393 doc/nghttpx-howto.rst 394 doc/h2load-howto.rst 395 doc/building-android-binary.rst 396 doc/nghttp2.h.rst 397 doc/nghttp2ver.h.rst 398 doc/contribute.rst 399) 400 configure_file("${name}.in" "${name}" @ONLY) 401endforeach() 402 403if(APPLE) 404 add_definitions(-D__APPLE_USE_RFC_3542) 405endif() 406 407include_directories( 408 "${CMAKE_CURRENT_BINARY_DIR}" # for config.h 409) 410# For use in src/CMakeLists.txt 411set(PKGDATADIR "${CMAKE_INSTALL_FULL_DATADIR}/${CMAKE_PROJECT_NAME}") 412set(PKGLIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}/${CMAKE_PROJECT_NAME}") 413 414install(FILES README.rst DESTINATION "${CMAKE_INSTALL_DOCDIR}") 415 416add_subdirectory(lib) 417#add_subdirectory(lib/includes) 418add_subdirectory(third-party) 419add_subdirectory(src) 420add_subdirectory(examples) 421add_subdirectory(tests) 422#add_subdirectory(tests/testdata) 423add_subdirectory(integration-tests) 424if(ENABLE_DOC) 425 add_subdirectory(doc) 426endif() 427add_subdirectory(contrib) 428add_subdirectory(script) 429add_subdirectory(bpf) 430 431 432string(TOUPPER "${CMAKE_BUILD_TYPE}" _build_type) 433message(STATUS "summary of build options: 434 435 Package version: ${VERSION} 436 Library version: ${LT_CURRENT}:${LT_REVISION}:${LT_AGE} 437 Install prefix: ${CMAKE_INSTALL_PREFIX} 438 Target system: ${CMAKE_SYSTEM_NAME} 439 Compiler: 440 Build type: ${CMAKE_BUILD_TYPE} 441 C compiler: ${CMAKE_C_COMPILER} 442 CFLAGS: ${CMAKE_C_FLAGS_${_build_type}} ${CMAKE_C_FLAGS} 443 C++ compiler: ${CMAKE_CXX_COMPILER} 444 CXXFLAGS: ${CMAKE_CXX_FLAGS_${_build_type}} ${CMAKE_CXX_FLAGS} 445 WARNCFLAGS: ${WARNCFLAGS} 446 CXX1XCXXFLAGS: ${CXX1XCXXFLAGS} 447 WARNCXXFLAGS: ${WARNCXXFLAGS} 448 Python: 449 Python: ${Python3_EXECUTABLE} 450 Python3_VERSION: ${Python3_VERSION} 451 Test: 452 CUnit: ${HAVE_CUNIT} (LIBS='${CUNIT_LIBRARIES}') 453 Failmalloc: ${ENABLE_FAILMALLOC} 454 Libs: 455 OpenSSL: ${HAVE_OPENSSL} (LIBS='${OPENSSL_LIBRARIES}') 456 Libxml2: ${HAVE_LIBXML2} (LIBS='${LIBXML2_LIBRARIES}') 457 Libev: ${HAVE_LIBEV} (LIBS='${LIBEV_LIBRARIES}') 458 Libc-ares: ${HAVE_LIBCARES} (LIBS='${LIBCARES_LIBRARIES}') 459 Libngtcp2: ${HAVE_LIBNGTCP2} (LIBS='${LIBNGTCP2_LIBRARIES}') 460 Libngtcp2_crypto_quictls: ${HAVE_LIBNGTCP2_CRYPTO_QUICTLS} (LIBS='${LIBNGTCP2_CRYPTO_QUICTLS_LIBRARIES}') 461 Libnghttp3: ${HAVE_LIBNGHTTP3} (LIBS='${LIBNGHTTP3_LIBRARIES}') 462 Libbpf: ${HAVE_LIBBPF} (LIBS='${LIBBPF_LIBRARIES}') 463 Libevent(SSL): ${HAVE_LIBEVENT_OPENSSL} (LIBS='${LIBEVENT_OPENSSL_LIBRARIES}') 464 Jansson: ${HAVE_JANSSON} (LIBS='${JANSSON_LIBRARIES}') 465 Jemalloc: ${HAVE_JEMALLOC} (LIBS='${JEMALLOC_LIBRARIES}') 466 Zlib: ${HAVE_ZLIB} (LIBS='${ZLIB_LIBRARIES}') 467 Systemd: ${HAVE_SYSTEMD} (LIBS='${SYSTEMD_LIBRARIES}') 468 Third-party: 469 http-parser: ${ENABLE_THIRD_PARTY} 470 MRuby: ${HAVE_MRUBY} 471 Neverbleed: ${HAVE_NEVERBLEED} 472 Features: 473 Applications: ${ENABLE_APP} 474 HPACK tools: ${ENABLE_HPACK_TOOLS} 475 Examples: ${ENABLE_EXAMPLES} 476 Threading: ${ENABLE_THREADS} 477 HTTP/3(EXPERIMENTAL): ${ENABLE_HTTP3} 478") 479if(ENABLE_LIB_ONLY_DISABLED_OTHERS) 480 message("Only the library will be built. To build other components " 481 "(such as applications and examples), set ENABLE_LIB_ONLY=OFF.") 482endif() 483