• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.14)
26# XXX using 1.8.90 instead of 1.9.0-DEV
27project(nghttp2 VERSION 1.62.1)
28
29# See versioning rule:
30#  https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
31set(LT_CURRENT  42)
32set(LT_REVISION 1)
33set(LT_AGE      28)
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)
54include(CMakeDependentOption)
55
56# For documentation
57find_package(Python3 COMPONENTS Interpreter)
58
59# Auto-detection of features that can be toggled
60if(NOT ENABLE_LIB_ONLY)
61  find_package(Libev 4.11)
62  find_package(Libcares 1.7.5)
63  find_package(ZLIB 1.2.3)
64  find_package(Libbrotlienc 1.0.9)
65  find_package(Libbrotlidec 1.0.9)
66endif()
67
68find_package(OpenSSL 1.1.1)
69find_package(Libngtcp2 1.0.0)
70find_package(Libngtcp2_crypto_quictls 1.0.0)
71if(LIBNGTCP2_CRYPTO_QUICTLS_FOUND)
72  set(HAVE_LIBNGTCP2_CRYPTO_QUICTLS 1)
73endif()
74find_package(Libnghttp3 1.1.0)
75if(WITH_LIBBPF)
76  find_package(Libbpf 0.7.0)
77  if(NOT LIBBPF_FOUND)
78    message(FATAL_ERROR "libbpf was requested (WITH_LIBBPF=1) but not found.")
79  endif()
80endif()
81if(OPENSSL_FOUND AND LIBEV_FOUND AND ZLIB_FOUND)
82  set(ENABLE_APP_DEFAULT ON)
83else()
84  set(ENABLE_APP_DEFAULT OFF)
85endif()
86find_package(Systemd 209)
87find_package(Jansson  2.5)
88set(ENABLE_HPACK_TOOLS_DEFAULT ${JANSSON_FOUND})
89# 2.0.8 is required because we use evconnlistener_set_error_cb()
90find_package(Libevent 2.0.8 COMPONENTS core extra openssl)
91set(ENABLE_EXAMPLES_DEFAULT ${LIBEVENT_OPENSSL_FOUND})
92
93find_package(LibXml2 2.6.26)
94set(WITH_LIBXML2_DEFAULT    ${LIBXML2_FOUND})
95find_package(Jemalloc)
96set(WITH_JEMALLOC_DEFAULT   ${JEMALLOC_FOUND})
97
98include(CMakeOptions.txt)
99
100if(ENABLE_LIB_ONLY AND (ENABLE_APP OR ENABLE_HPACK_TOOLS OR ENABLE_EXAMPLES))
101  # Remember when disabled options are disabled for later diagnostics.
102  set(ENABLE_LIB_ONLY_DISABLED_OTHERS 1)
103else()
104  set(ENABLE_LIB_ONLY_DISABLED_OTHERS 0)
105endif()
106if(ENABLE_LIB_ONLY)
107  set(ENABLE_APP            OFF)
108  set(ENABLE_HPACK_TOOLS    OFF)
109  set(ENABLE_EXAMPLES       OFF)
110endif()
111
112# Do not disable assertions based on CMAKE_BUILD_TYPE.
113foreach(_build_type "Release" "MinSizeRel" "RelWithDebInfo")
114  foreach(_lang C CXX)
115    string(TOUPPER "CMAKE_${_lang}_FLAGS_${_build_type}" _var)
116    string(REGEX REPLACE "(^| )[/-]D *NDEBUG($| )" " " ${_var} "${${_var}}")
117  endforeach()
118endforeach()
119
120if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
121  set(HINT_NORETURN       "__attribute__((noreturn))")
122else()
123  set(HINT_NORETURN)
124endif()
125
126include(ExtractValidFlags)
127foreach(_cxx1x_flag -std=c++20)
128  extract_valid_cxx_flags(_cxx1x_flag_supported ${_cxx1x_flag})
129  if(_cxx1x_flag_supported)
130    set(CXX1XCXXFLAGS ${_cxx1x_flag})
131    break()
132  endif()
133endforeach()
134
135include(CMakePushCheckState)
136include(CheckCXXSourceCompiles)
137cmake_push_check_state()
138set(CMAKE_REQUIRED_DEFINITIONS "${CXX1XCXXFLAGS}")
139# Check that std::future is available.
140check_cxx_source_compiles("
141#include <vector>
142#include <future>
143int main() { std::vector<std::future<int>> v; }" HAVE_STD_FUTURE)
144# Check that std::map::emplace is available for g++-4.7.
145check_cxx_source_compiles("
146#include <map>
147int main() { std::map<int, int>().emplace(1, 2); }" HAVE_STD_MAP_EMPLACE)
148cmake_pop_check_state()
149
150
151# Checks for libraries.
152# Additional libraries required for programs under src directory.
153set(APP_LIBRARIES)
154
155set(CMAKE_THREAD_PREFER_PTHREAD 1)
156find_package(Threads)
157if(CMAKE_USE_PTHREADS_INIT)
158  list(APPEND APP_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
159endif()
160# XXX android and C++, is this still needed in cmake?
161# case "$host" in
162#   *android*)
163#     android_build=yes
164#     # android does not need -pthread, but needs following 3 libs for C++
165#     APPLDFLAGS="$APPLDFLAGS -lstdc++ -latomic -lsupc++"
166
167# dl: openssl requires libdl when it is statically linked.
168# XXX shouldn't ${CMAKE_DL_LIBS} be appended to OPENSSL_LIBRARIES instead of
169# APP_LIBRARIES if it is really specific to OpenSSL?
170
171enable_testing()
172add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
173
174# openssl (for src)
175include(CheckSymbolExists)
176set(HAVE_OPENSSL    ${OPENSSL_FOUND})
177if(OPENSSL_FOUND)
178  set(OPENSSL_INCLUDE_DIRS  ${OPENSSL_INCLUDE_DIR})
179  cmake_push_check_state()
180  set(CMAKE_REQUIRED_INCLUDES   "${OPENSSL_INCLUDE_DIR}")
181  set(CMAKE_REQUIRED_LIBRARIES  "${OPENSSL_LIBRARIES}")
182  if(WIN32)
183    set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}" "ws2_32" "bcrypt")
184  endif()
185  if(ENABLE_HTTP3)
186    check_symbol_exists(SSL_provide_quic_data "openssl/ssl.h" HAVE_SSL_PROVIDE_QUIC_DATA)
187    if(NOT HAVE_SSL_PROVIDE_QUIC_DATA)
188        message(WARNING "OpenSSL in ${OPENSSL_LIBRARIES} does not have SSL_provide_quic_data.  HTTP/3 support cannot be enabled")
189    endif()
190  endif()
191  cmake_pop_check_state()
192else()
193  set(OPENSSL_INCLUDE_DIRS  "")
194  set(OPENSSL_LIBRARIES     "")
195endif()
196# libev (for src)
197set(HAVE_LIBEV      ${LIBEV_FOUND})
198set(HAVE_ZLIB       ${ZLIB_FOUND})
199set(HAVE_SYSTEMD    ${SYSTEMD_FOUND})
200set(HAVE_LIBEVENT_OPENSSL ${LIBEVENT_FOUND})
201if(LIBEVENT_FOUND)
202  # Must both link the core and openssl libraries.
203  set(LIBEVENT_OPENSSL_LIBRARIES ${LIBEVENT_LIBRARIES})
204endif()
205# libc-ares (for src)
206set(HAVE_LIBCARES   ${LIBCARES_FOUND})
207if(LIBCARES_FOUND)
208  set(LIBCARES_INCLUDE_DIRS ${LIBCARES_INCLUDE_DIR})
209else()
210  set(LIBCARES_INCLUDE_DIRS "")
211  set(LIBCARES_LIBRARIES    "")
212endif()
213# jansson (for src/nghttp, src/deflatehd and src/inflatehd)
214set(HAVE_JANSSON    ${JANSSON_FOUND})
215# libxml2 (for src/nghttp)
216set(HAVE_LIBXML2    ${LIBXML2_FOUND})
217if(LIBXML2_FOUND)
218  set(LIBXML2_INCLUDE_DIRS  ${LIBXML2_INCLUDE_DIR})
219else()
220  set(LIBXML2_INCLUDE_DIRS  "")
221  set(LIBXML2_LIBRARIES     "")
222endif()
223# jemalloc
224set(HAVE_JEMALLOC   ${JEMALLOC_FOUND})
225
226# libbrotli (for src)
227set(HAVE_LIBBROTLIENC ${LIBBROTLIENC_FOUND})
228set(HAVE_LIBBROTLIDEC ${LIBBROTLIDEC_FOUND})
229if(LIBBROTLIENC_FOUND AND LIBBROTLIDEC_FOUND)
230  set(HAVE_LIBBROTLI 1)
231endif()
232
233# libbpf (for bpf)
234set(HAVE_LIBBPF ${LIBBPF_FOUND})
235if(LIBBPF_FOUND)
236  set(BPFCFLAGS -Wall -O2 -g)
237  if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
238    # For Debian/Ubuntu
239    set(EXTRABPFCFLAGS -I/usr/include/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu)
240  endif()
241
242  check_c_source_compiles("
243#include <linux/bpf.h>
244int main() { enum bpf_stats_type foo; (void)foo; }" HAVE_BPF_STATS_TYPE)
245endif()
246
247# The nghttp, nghttpd and nghttpx under src depend on zlib, OpenSSL and libev
248if(ENABLE_APP AND NOT (ZLIB_FOUND AND OPENSSL_FOUND AND LIBEV_FOUND))
249  message(FATAL_ERROR "Applications were requested (ENABLE_APP=1) but dependencies are not met.")
250endif()
251
252# HTTP/3 requires quictls/openssl, libngtcp2, libngtcp2_crypto_quictls
253# and libnghttp3.
254if(ENABLE_HTTP3 AND NOT (HAVE_SSL_PROVIDE_QUIC_DATA AND LIBNGTCP2_FOUND AND LIBNGTCP2_CRYPTO_QUICTLS_FOUND AND LIBNGHTTP3_FOUND))
255  message(FATAL_ERROR "HTTP/3 was requested (ENABLE_HTTP3=1) but dependencies are not met.")
256endif()
257
258# HPACK tools requires jansson
259if(ENABLE_HPACK_TOOLS AND NOT HAVE_JANSSON)
260  message(FATAL_ERROR "HPACK tools were requested (ENABLE_HPACK_TOOLS=1) but dependencies are not met.")
261endif()
262
263# examples
264if(ENABLE_EXAMPLES AND NOT (OPENSSL_FOUND AND LIBEVENT_OPENSSL_FOUND))
265  message(FATAL_ERROR "examples were requested (ENABLE_EXAMPLES=1) but dependencies are not met.")
266endif()
267
268# third-party http-parser only be built when needed
269if(ENABLE_EXAMPLES OR ENABLE_APP OR ENABLE_HPACK_TOOLS)
270  set(ENABLE_THIRD_PARTY 1)
271  # mruby (for src/nghttpx)
272  set(HAVE_MRUBY      ${WITH_MRUBY})
273  set(HAVE_NEVERBLEED ${WITH_NEVERBLEED})
274else()
275  set(HAVE_MRUBY 0)
276  set(HAVE_NEVERBLEED 0)
277endif()
278
279# Checks for header files.
280include(CheckIncludeFile)
281check_include_file("arpa/inet.h"    HAVE_ARPA_INET_H)
282check_include_file("fcntl.h"        HAVE_FCNTL_H)
283check_include_file("inttypes.h"     HAVE_INTTYPES_H)
284check_include_file("limits.h"       HAVE_LIMITS_H)
285check_include_file("netdb.h"        HAVE_NETDB_H)
286check_include_file("netinet/in.h"   HAVE_NETINET_IN_H)
287check_include_file("netinet/ip.h"   HAVE_NETINET_IP_H)
288check_include_file("pwd.h"          HAVE_PWD_H)
289check_include_file("sys/socket.h"   HAVE_SYS_SOCKET_H)
290check_include_file("sys/time.h"     HAVE_SYS_TIME_H)
291check_include_file("syslog.h"       HAVE_SYSLOG_H)
292check_include_file("unistd.h"       HAVE_UNISTD_H)
293check_include_file("windows.h"      HAVE_WINDOWS_H)
294
295include(CheckTypeSize)
296# Checks for typedefs, structures, and compiler characteristics.
297# AC_TYPE_SIZE_T
298check_type_size("ssize_t" SIZEOF_SSIZE_T)
299if(SIZEOF_SSIZE_T STREQUAL "")
300  # ssize_t is a signed type in POSIX storing at least -1.
301  # Set it to "int" to match the behavior of AC_TYPE_SSIZE_T (autotools).
302  set(ssize_t int)
303endif()
304# AC_TYPE_UINT8_T
305# AC_TYPE_UINT16_T
306# AC_TYPE_UINT32_T
307# AC_TYPE_UINT64_T
308# AC_TYPE_INT8_T
309# AC_TYPE_INT16_T
310# AC_TYPE_INT32_T
311# AC_TYPE_INT64_T
312# AC_TYPE_OFF_T
313# AC_TYPE_PID_T
314# AC_TYPE_UID_T
315# XXX To support inline for crappy compilers, see https://cmake.org/Wiki/CMakeTestInline
316# AC_C_INLINE
317# XXX is AC_SYS_LARGEFILE still needed for modern systems?
318# add_definitions(-D_FILE_OFFSET_BITS=64)
319
320include(CheckStructHasMember)
321check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_STRUCT_TM_TM_GMTOFF)
322
323# Checks for library functions.
324include(CheckFunctionExists)
325check_function_exists(_Exit     HAVE__EXIT)
326check_function_exists(accept4   HAVE_ACCEPT4)
327check_function_exists(clock_gettime HAVE_CLOCK_GETTIME)
328check_function_exists(mkostemp  HAVE_MKOSTEMP)
329
330check_symbol_exists(GetTickCount64 sysinfoapi.h HAVE_GETTICKCOUNT64)
331
332include(CheckSymbolExists)
333# XXX does this correctly detect initgroups (un)availability on cygwin?
334check_symbol_exists(initgroups grp.h HAVE_DECL_INITGROUPS)
335if(NOT HAVE_DECL_INITGROUPS AND HAVE_UNISTD_H)
336  # FreeBSD declares initgroups() in unistd.h
337  check_symbol_exists(initgroups unistd.h HAVE_DECL_INITGROUPS2)
338  if(HAVE_DECL_INITGROUPS2)
339    set(HAVE_DECL_INITGROUPS 1)
340  endif()
341endif()
342
343check_symbol_exists(CLOCK_MONOTONIC "time.h" HAVE_DECL_CLOCK_MONOTONIC)
344
345set(WARNCFLAGS)
346set(WARNCXXFLAGS)
347if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
348  if(ENABLE_WERROR)
349    set(WARNCFLAGS    /WX)
350    set(WARNCXXFLAGS  /WX)
351  endif()
352else()
353  if(ENABLE_WERROR)
354    set(WARNCFLAGS   "-Werror")
355    set(WARNCXXFLAGS "-Werror")
356  endif()
357
358  include(PickyWarningsC)
359  include(PickyWarningsCXX)
360endif()
361
362if(ENABLE_STATIC_CRT)
363  foreach(lang C CXX)
364    foreach(suffix "" _DEBUG _MINSIZEREL _RELEASE _RELWITHDEBINFO)
365      set(var "CMAKE_${lang}_FLAGS${suffix}")
366      string(REPLACE "/MD" "/MT" ${var} "${${var}}")
367    endforeach()
368  endforeach()
369endif()
370
371if(ENABLE_DEBUG)
372  set(DEBUGBUILD 1)
373endif()
374
375# Some platform does not have working std::future.  We disable
376# threading for those platforms.
377if(NOT ENABLE_THREADS OR NOT HAVE_STD_FUTURE)
378  set(NOTHREADS 1)
379endif()
380
381add_definitions(-DHAVE_CONFIG_H)
382configure_file(cmakeconfig.h.in config.h)
383# autotools-compatible names
384# Sphinx expects relative paths in the .rst files. Use the fact that the files
385# below are all one directory level deep.
386file(RELATIVE_PATH top_srcdir   "${CMAKE_CURRENT_BINARY_DIR}/dir" "${CMAKE_CURRENT_SOURCE_DIR}")
387file(RELATIVE_PATH top_builddir "${CMAKE_CURRENT_BINARY_DIR}/dir" "${CMAKE_CURRENT_BINARY_DIR}")
388set(abs_top_srcdir  "${CMAKE_CURRENT_SOURCE_DIR}")
389set(abs_top_builddir "${CMAKE_CURRENT_BINARY_DIR}")
390# libnghttp2.pc (pkg-config file)
391set(prefix          "${CMAKE_INSTALL_PREFIX}")
392set(exec_prefix     "${CMAKE_INSTALL_PREFIX}")
393set(libdir          "${CMAKE_INSTALL_FULL_LIBDIR}")
394set(includedir      "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
395set(VERSION         "${PACKAGE_VERSION}")
396# For init scripts and systemd service file (in contrib/)
397set(bindir          "${CMAKE_INSTALL_FULL_BINDIR}")
398set(sbindir         "${CMAKE_INSTALL_FULL_SBINDIR}")
399foreach(name
400   lib/libnghttp2.pc
401   lib/includes/nghttp2/nghttp2ver.h
402   integration-tests/config.go
403   integration-tests/setenv
404   doc/conf.py
405   doc/index.rst
406   doc/package_README.rst
407   doc/tutorial-client.rst
408   doc/tutorial-server.rst
409   doc/tutorial-hpack.rst
410   doc/nghttpx-howto.rst
411   doc/h2load-howto.rst
412   doc/building-android-binary.rst
413   doc/nghttp2.h.rst
414   doc/nghttp2ver.h.rst
415   doc/contribute.rst
416)
417  configure_file("${name}.in" "${name}" @ONLY)
418endforeach()
419
420if(APPLE)
421  add_definitions(-D__APPLE_USE_RFC_3542)
422endif()
423
424include_directories(
425  "${CMAKE_CURRENT_BINARY_DIR}" # for config.h
426)
427# For use in src/CMakeLists.txt
428set(PKGDATADIR "${CMAKE_INSTALL_FULL_DATADIR}/${CMAKE_PROJECT_NAME}")
429set(PKGLIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}/${CMAKE_PROJECT_NAME}")
430
431install(FILES README.rst DESTINATION "${CMAKE_INSTALL_DOCDIR}")
432
433add_subdirectory(lib)
434#add_subdirectory(lib/includes)
435add_subdirectory(third-party)
436add_subdirectory(src)
437add_subdirectory(examples)
438if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND BUILD_TESTING)
439  add_subdirectory(tests)
440  #add_subdirectory(tests/testdata)
441  add_subdirectory(integration-tests)
442endif()
443if(ENABLE_DOC)
444  add_subdirectory(doc)
445endif()
446add_subdirectory(contrib)
447add_subdirectory(script)
448add_subdirectory(bpf)
449
450
451string(TOUPPER "${CMAKE_BUILD_TYPE}" _build_type)
452message(STATUS "summary of build options:
453
454    Package version: ${VERSION}
455    Library version: ${LT_CURRENT}:${LT_REVISION}:${LT_AGE}
456    Install prefix:  ${CMAKE_INSTALL_PREFIX}
457    Target system:   ${CMAKE_SYSTEM_NAME}
458    Compiler:
459      Build type:     ${CMAKE_BUILD_TYPE}
460      C compiler:     ${CMAKE_C_COMPILER}
461      CFLAGS:         ${CMAKE_C_FLAGS_${_build_type}} ${CMAKE_C_FLAGS}
462      C++ compiler:   ${CMAKE_CXX_COMPILER}
463      CXXFLAGS:       ${CMAKE_CXX_FLAGS_${_build_type}} ${CMAKE_CXX_FLAGS}
464      WARNCFLAGS:     ${WARNCFLAGS}
465      CXX1XCXXFLAGS:  ${CXX1XCXXFLAGS}
466      WARNCXXFLAGS:   ${WARNCXXFLAGS}
467    Python:
468      Python:          ${Python3_EXECUTABLE}
469      Python3_VERSION: ${Python3_VERSION}
470    Test:
471      Failmalloc:     ${ENABLE_FAILMALLOC}
472      Build Test:     ${BUILD_TESTING}
473    Libs:
474      OpenSSL:        ${HAVE_OPENSSL} (LIBS='${OPENSSL_LIBRARIES}')
475      Libxml2:        ${HAVE_LIBXML2} (LIBS='${LIBXML2_LIBRARIES}')
476      Libev:          ${HAVE_LIBEV} (LIBS='${LIBEV_LIBRARIES}')
477      Libc-ares:      ${HAVE_LIBCARES} (LIBS='${LIBCARES_LIBRARIES}')
478      Libngtcp2:      ${HAVE_LIBNGTCP2} (LIBS='${LIBNGTCP2_LIBRARIES}')
479      Libngtcp2_crypto_quictls: ${HAVE_LIBNGTCP2_CRYPTO_QUICTLS} (LIBS='${LIBNGTCP2_CRYPTO_QUICTLS_LIBRARIES}')
480      Libnghttp3:     ${HAVE_LIBNGHTTP3} (LIBS='${LIBNGHTTP3_LIBRARIES}')
481      Libbpf:         ${HAVE_LIBBPF} (LIBS='${LIBBPF_LIBRARIES}')
482      Libevent(SSL):  ${HAVE_LIBEVENT_OPENSSL} (LIBS='${LIBEVENT_OPENSSL_LIBRARIES}')
483      Jansson:        ${HAVE_JANSSON} (LIBS='${JANSSON_LIBRARIES}')
484      Jemalloc:       ${HAVE_JEMALLOC} (LIBS='${JEMALLOC_LIBRARIES}')
485      Zlib:           ${HAVE_ZLIB} (LIBS='${ZLIB_LIBRARIES}')
486      Systemd:        ${HAVE_SYSTEMD} (LIBS='${SYSTEMD_LIBRARIES}')
487      Libbrotlienc:   ${HAVE_LIBBROTLIENC} (LIBS='${LIBBROTLIENC_LIBRARIES}')
488      Libbrotlidec:   ${HAVE_LIBBROTLIDEC} (LIBS='${LIBBROTLIDEC_LIBRARIES}')
489    Third-party:
490      http-parser:    ${ENABLE_THIRD_PARTY}
491      MRuby:          ${HAVE_MRUBY}
492      Neverbleed:     ${HAVE_NEVERBLEED}
493    Features:
494      Applications:   ${ENABLE_APP}
495      HPACK tools:    ${ENABLE_HPACK_TOOLS}
496      Examples:       ${ENABLE_EXAMPLES}
497      Threading:      ${ENABLE_THREADS}
498      HTTP/3(EXPERIMENTAL): ${ENABLE_HTTP3}
499")
500if(ENABLE_LIB_ONLY_DISABLED_OTHERS)
501  message("Only the library will be built. To build other components "
502    "(such as applications and examples), set ENABLE_LIB_ONLY=OFF.")
503endif()
504