• 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.0)
26# XXX using 1.8.90 instead of 1.9.0-DEV
27project(nghttp2 VERSION 1.55.0)
28
29# See versioning rule:
30#  https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
31set(LT_CURRENT  38)
32set(LT_REVISION 2)
33set(LT_AGE      24)
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("pwd.h"          HAVE_PWD_H)
277check_include_file("sys/socket.h"   HAVE_SYS_SOCKET_H)
278check_include_file("sys/time.h"     HAVE_SYS_TIME_H)
279check_include_file("sysinfoapi.h"   HAVE_SYSINFOAPI_H)
280check_include_file("syslog.h"       HAVE_SYSLOG_H)
281check_include_file("time.h"         HAVE_TIME_H)
282check_include_file("unistd.h"       HAVE_UNISTD_H)
283
284include(CheckTypeSize)
285# Checks for typedefs, structures, and compiler characteristics.
286# AC_TYPE_SIZE_T
287check_type_size("ssize_t" SIZEOF_SSIZE_T)
288if(SIZEOF_SSIZE_T STREQUAL "")
289  # ssize_t is a signed type in POSIX storing at least -1.
290  # Set it to "int" to match the behavior of AC_TYPE_SSIZE_T (autotools).
291  set(ssize_t int)
292endif()
293# AC_TYPE_UINT8_T
294# AC_TYPE_UINT16_T
295# AC_TYPE_UINT32_T
296# AC_TYPE_UINT64_T
297# AC_TYPE_INT8_T
298# AC_TYPE_INT16_T
299# AC_TYPE_INT32_T
300# AC_TYPE_INT64_T
301# AC_TYPE_OFF_T
302# AC_TYPE_PID_T
303# AC_TYPE_UID_T
304# XXX To support inline for crappy compilers, see https://cmake.org/Wiki/CMakeTestInline
305# AC_C_INLINE
306# XXX is AC_SYS_LARGEFILE still needed for modern systems?
307# add_definitions(-D_FILE_OFFSET_BITS=64)
308
309include(CheckStructHasMember)
310check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_STRUCT_TM_TM_GMTOFF)
311
312# Check size of pointer to decide we need 8 bytes alignment adjustment.
313check_type_size("int *"   SIZEOF_INT_P)
314check_type_size("time_t"  SIZEOF_TIME_T)
315
316# Checks for library functions.
317include(CheckFunctionExists)
318check_function_exists(_Exit     HAVE__EXIT)
319check_function_exists(accept4   HAVE_ACCEPT4)
320check_function_exists(clock_gettime HAVE_CLOCK_GETTIME)
321check_function_exists(mkostemp  HAVE_MKOSTEMP)
322
323check_symbol_exists(GetTickCount64 sysinfoapi.h HAVE_GETTICKCOUNT64)
324
325include(CheckSymbolExists)
326# XXX does this correctly detect initgroups (un)availability on cygwin?
327check_symbol_exists(initgroups grp.h HAVE_DECL_INITGROUPS)
328if(NOT HAVE_DECL_INITGROUPS AND HAVE_UNISTD_H)
329  # FreeBSD declares initgroups() in unistd.h
330  check_symbol_exists(initgroups unistd.h HAVE_DECL_INITGROUPS2)
331  if(HAVE_DECL_INITGROUPS2)
332    set(HAVE_DECL_INITGROUPS 1)
333  endif()
334endif()
335
336set(WARNCFLAGS)
337set(WARNCXXFLAGS)
338if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
339  if(ENABLE_WERROR)
340    set(WARNCFLAGS    /WX)
341    set(WARNCXXFLAGS  /WX)
342  endif()
343else()
344  if(ENABLE_WERROR)
345    extract_valid_c_flags(WARNCFLAGS    -Werror)
346    extract_valid_c_flags(WARNCXXFLAGS  -Werror)
347  endif()
348
349  # For C compiler
350  extract_valid_c_flags(WARNCFLAGS
351    -Wall
352    -Wextra
353    -Wmissing-prototypes
354    -Wstrict-prototypes
355    -Wmissing-declarations
356    -Wpointer-arith
357    -Wdeclaration-after-statement
358    -Wformat-security
359    -Wwrite-strings
360    -Wshadow
361    -Winline
362    -Wnested-externs
363    -Wfloat-equal
364    -Wundef
365    -Wendif-labels
366    -Wempty-body
367    -Wcast-align
368    -Wclobbered
369    -Wvla
370    -Wpragmas
371    -Wunreachable-code
372    -Waddress
373    -Wattributes
374    -Wdiv-by-zero
375    -Wshorten-64-to-32
376
377    -Wconversion
378    -Wextended-offsetof
379    -Wformat-nonliteral
380    -Wlanguage-extension-token
381    -Wmissing-field-initializers
382    -Wmissing-noreturn
383    -Wmissing-variable-declarations
384    # Not used because we cannot change public structs
385    # -Wpadded
386    -Wsign-conversion
387    # Not used because this basically disallows default case
388    # -Wswitch-enum
389    -Wunreachable-code-break
390    -Wunused-macros
391    -Wunused-parameter
392    -Wredundant-decls
393    # Only work with Clang for the moment
394    -Wheader-guard
395    # This is required because we pass format string as "const char*.
396    -Wno-format-nonliteral
397  )
398
399  extract_valid_cxx_flags(WARNCXXFLAGS
400    # For C++ compiler
401    -Wall
402    -Wformat-security
403  )
404endif()
405
406if(ENABLE_STATIC_CRT)
407  foreach(lang C CXX)
408    foreach(suffix "" _DEBUG _MINSIZEREL _RELEASE _RELWITHDEBINFO)
409      set(var "CMAKE_${lang}_FLAGS${suffix}")
410      string(REPLACE "/MD" "/MT" ${var} "${${var}}")
411    endforeach()
412  endforeach()
413endif()
414
415if(ENABLE_DEBUG)
416  set(DEBUGBUILD 1)
417endif()
418
419# Some platform does not have working std::future.  We disable
420# threading for those platforms.
421if(NOT ENABLE_THREADS OR NOT HAVE_STD_FUTURE)
422  set(NOTHREADS 1)
423endif()
424
425add_definitions(-DHAVE_CONFIG_H)
426configure_file(cmakeconfig.h.in config.h)
427# autotools-compatible names
428# Sphinx expects relative paths in the .rst files. Use the fact that the files
429# below are all one directory level deep.
430file(RELATIVE_PATH top_srcdir   "${CMAKE_CURRENT_BINARY_DIR}/dir" "${CMAKE_CURRENT_SOURCE_DIR}")
431file(RELATIVE_PATH top_builddir "${CMAKE_CURRENT_BINARY_DIR}/dir" "${CMAKE_CURRENT_BINARY_DIR}")
432set(abs_top_srcdir  "${CMAKE_CURRENT_SOURCE_DIR}")
433set(abs_top_builddir "${CMAKE_CURRENT_BINARY_DIR}")
434# libnghttp2.pc (pkg-config file)
435set(prefix          "${CMAKE_INSTALL_PREFIX}")
436set(exec_prefix     "${CMAKE_INSTALL_PREFIX}")
437set(libdir          "${CMAKE_INSTALL_FULL_LIBDIR}")
438set(includedir      "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
439set(VERSION         "${PACKAGE_VERSION}")
440# For init scripts and systemd service file (in contrib/)
441set(bindir          "${CMAKE_INSTALL_FULL_BINDIR}")
442set(sbindir         "${CMAKE_INSTALL_FULL_SBINDIR}")
443foreach(name
444   lib/libnghttp2.pc
445   lib/includes/nghttp2/nghttp2ver.h
446   integration-tests/config.go
447   integration-tests/setenv
448   doc/conf.py
449   doc/index.rst
450   doc/package_README.rst
451   doc/tutorial-client.rst
452   doc/tutorial-server.rst
453   doc/tutorial-hpack.rst
454   doc/nghttpx-howto.rst
455   doc/h2load-howto.rst
456   doc/building-android-binary.rst
457   doc/nghttp2.h.rst
458   doc/nghttp2ver.h.rst
459   doc/contribute.rst
460)
461  configure_file("${name}.in" "${name}" @ONLY)
462endforeach()
463
464if(APPLE)
465  add_definitions(-D__APPLE_USE_RFC_3542)
466endif()
467
468include_directories(
469  "${CMAKE_CURRENT_BINARY_DIR}" # for config.h
470)
471# For use in src/CMakeLists.txt
472set(PKGDATADIR "${CMAKE_INSTALL_FULL_DATADIR}/${CMAKE_PROJECT_NAME}")
473set(PKGLIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}/${CMAKE_PROJECT_NAME}")
474
475install(FILES README.rst DESTINATION "${CMAKE_INSTALL_DOCDIR}")
476
477add_subdirectory(lib)
478#add_subdirectory(lib/includes)
479add_subdirectory(third-party)
480add_subdirectory(src)
481add_subdirectory(examples)
482add_subdirectory(tests)
483#add_subdirectory(tests/testdata)
484add_subdirectory(integration-tests)
485if(ENABLE_DOC)
486  add_subdirectory(doc)
487endif()
488add_subdirectory(contrib)
489add_subdirectory(script)
490add_subdirectory(bpf)
491
492
493string(TOUPPER "${CMAKE_BUILD_TYPE}" _build_type)
494message(STATUS "summary of build options:
495
496    Package version: ${VERSION}
497    Library version: ${LT_CURRENT}:${LT_REVISION}:${LT_AGE}
498    Install prefix:  ${CMAKE_INSTALL_PREFIX}
499    Target system:   ${CMAKE_SYSTEM_NAME}
500    Compiler:
501      Build type:     ${CMAKE_BUILD_TYPE}
502      C compiler:     ${CMAKE_C_COMPILER}
503      CFLAGS:         ${CMAKE_C_FLAGS_${_build_type}} ${CMAKE_C_FLAGS}
504      C++ compiler:   ${CMAKE_CXX_COMPILER}
505      CXXFLAGS:       ${CMAKE_CXX_FLAGS_${_build_type}} ${CMAKE_CXX_FLAGS}
506      WARNCFLAGS:     ${WARNCFLAGS}
507      CXX1XCXXFLAGS:  ${CXX1XCXXFLAGS}
508    Python:
509      Python:          ${Python3_EXECUTABLE}
510      Python3_VERSION: ${Python3_VERSION}
511    Test:
512      CUnit:          ${HAVE_CUNIT} (LIBS='${CUNIT_LIBRARIES}')
513      Failmalloc:     ${ENABLE_FAILMALLOC}
514    Libs:
515      OpenSSL:        ${HAVE_OPENSSL} (LIBS='${OPENSSL_LIBRARIES}')
516      Libxml2:        ${HAVE_LIBXML2} (LIBS='${LIBXML2_LIBRARIES}')
517      Libev:          ${HAVE_LIBEV} (LIBS='${LIBEV_LIBRARIES}')
518      Libc-ares:      ${HAVE_LIBCARES} (LIBS='${LIBCARES_LIBRARIES}')
519      Libngtcp2:      ${HAVE_LIBNGTCP2} (LIBS='${LIBNGTCP2_LIBRARIES}')
520      Libngtcp2_crypto_quictls: ${HAVE_LIBNGTCP2_CRYPTO_QUICTLS} (LIBS='${LIBNGTCP2_CRYPTO_QUICTLS_LIBRARIES}')
521      Libnghttp3:     ${HAVE_LIBNGHTTP3} (LIBS='${LIBNGHTTP3_LIBRARIES}')
522      Libbpf:         ${HAVE_LIBBPF} (LIBS='${LIBBPF_LIBRARIES}')
523      Libevent(SSL):  ${HAVE_LIBEVENT_OPENSSL} (LIBS='${LIBEVENT_OPENSSL_LIBRARIES}')
524      Jansson:        ${HAVE_JANSSON} (LIBS='${JANSSON_LIBRARIES}')
525      Jemalloc:       ${HAVE_JEMALLOC} (LIBS='${JEMALLOC_LIBRARIES}')
526      Zlib:           ${HAVE_ZLIB} (LIBS='${ZLIB_LIBRARIES}')
527      Systemd:        ${HAVE_SYSTEMD} (LIBS='${SYSTEMD_LIBRARIES}')
528    Third-party:
529      http-parser:    ${ENABLE_THIRD_PARTY}
530      MRuby:          ${HAVE_MRUBY}
531      Neverbleed:     ${HAVE_NEVERBLEED}
532    Features:
533      Applications:   ${ENABLE_APP}
534      HPACK tools:    ${ENABLE_HPACK_TOOLS}
535      Examples:       ${ENABLE_EXAMPLES}
536      Threading:      ${ENABLE_THREADS}
537      HTTP/3(EXPERIMENTAL): ${ENABLE_HTTP3}
538")
539if(ENABLE_LIB_ONLY_DISABLED_OTHERS)
540  message("Only the library will be built. To build other components "
541    "(such as applications and examples), set ENABLE_LIB_ONLY=OFF.")
542endif()
543