| 1 | # SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | # Handling for libbpf (used by the eBPF plugin) |
| 3 | |
| 4 | include(ExternalProject) |
| 5 | include(NetdataUtil) |
| 6 | |
| 7 | set(libbpf_SOURCE_DIR "${CMAKE_BINARY_DIR}/libbpf") |
| 8 | |
| 9 | # Check if the kernel is old enough that we need to use a legacy copy of eBPF. |
| 10 | function(_need_legacy_libbpf _var) |
| 11 | if(FORCE_LEGACY_LIBBPF) |
| 12 | set(${_var} TRUE PARENT_SCOPE) |
| 13 | return() |
| 14 | endif() |
| 15 | |
| 16 | netdata_detect_host_kernel_version() |
| 17 | |
| 18 | if(HOST_KERNEL_VERSION VERSION_LESS "4.14.0") |
| 19 | set(${_var} TRUE PARENT_SCOPE) |
| 20 | else() |
| 21 | set(${_var} FALSE PARENT_SCOPE) |
| 22 | endif() |
| 23 | endfunction() |
| 24 | |
| 25 | # Prepare a vendored copy of libbpf |
| 26 | function(netdata_bundle_libbpf) |
| 27 | _need_legacy_libbpf(USE_LEGACY_LIBBPF) |
| 28 | |
| 29 | if(USE_LEGACY_LIBBPF) |
| 30 | set(_libbpf_tag 673424c56127bb556e64095f41fd60c26f9083ec) # v0.0.9_netdata-1 |
| 31 | else() |
| 32 | set(_libbpf_tag f5dcbae736e5d7f83a35718e01be1a8e3010fa39) # v1.7.0.0p_netdata |
| 33 | endif() |
| 34 | |
| 35 | if(STATIC_BUILD) |
| 36 | set(need_static TRUE) |
| 37 | endif() |
| 38 | |
| 39 | if(NOT need_static) |
| 40 | netdata_identify_libc(_libc) |
| 41 | |
| 42 | string(REGEX MATCH "glibc|musl" _libc_supported "${_libc}") |
| 43 | |
| 44 | if(NOT _libc_supported) |
| 45 | message(FATAL_ERROR "This system’s libc (detected: ${_libc}) is not not supported by the eBPF plugin.") |
| 46 | endif() |
| 47 | endif() |
| 48 | |
| 49 | find_program(MAKE_COMMAND make) |
| 50 | |
| 51 | if(MAKE_COMMAND STREQUAL MAKE_COMMAND-NOTFOUND) |
| 52 | message(FATAL_ERROR "GNU Make is required when building the eBPF plugin, but could not be found.") |
| 53 | endif() |
| 54 | |
| 55 | pkg_check_modules(ELF REQUIRED libelf) |
| 56 | pkg_check_modules(ZLIB REQUIRED zlib) |
| 57 | |
| 58 | set(_libbpf_lib_dir lib) |
| 59 | |
| 60 | if(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(amd64)") |
| 61 | set(_libbpf_lib_dir lib64) |
| 62 | endif() |
| 63 | |
| 64 | set(_libbpf_library "${libbpf_SOURCE_DIR}/usr/${_libbpf_lib_dir}/libbpf.a") |
| 65 | |
| 66 | ExternalProject_Add( |
| 67 | libbpf |
| 68 | GIT_REPOSITORY https://github.com/netdata/libbpf.git |
| 69 | GIT_TAG ${_libbpf_tag} |
| 70 | SOURCE_DIR "${libbpf_SOURCE_DIR}" |
| 71 | CONFIGURE_COMMAND "" |
| 72 | BUILD_COMMAND ${MAKE_COMMAND} -C src CC=${CMAKE_C_COMPILER} BUILD_STATIC_ONLY=1 OBJDIR=build/ DESTDIR=../ LIBSUBDIR=${_libbpf_lib_dir} install |
| 73 | BUILD_IN_SOURCE 1 |
| 74 | BUILD_BYPRODUCTS "${_libbpf_library}" |
| 75 | INSTALL_COMMAND "" |
| 76 | EXCLUDE_FROM_ALL 1 |
| 77 | ) |
| 78 | |
| 79 | add_library(libbpf_library STATIC IMPORTED GLOBAL) |
| 80 | set_property( |
| 81 | TARGET libbpf_library |
| 82 | PROPERTY IMPORTED_LOCATION "${_libbpf_library}" |
| 83 | ) |
| 84 | set_property( |
| 85 | TARGET libbpf_library |
| 86 | PROPERTY INTERFACE_LINK_LIBRARIES "${ELF_LIBRARIES};${ZLIB_LIBRARIES}" |
| 87 | ) |
| 88 | set(NETDATA_LIBBPF_INCLUDE_DIRECTORIES "${libbpf_SOURCE_DIR}/usr/include;${libbpf_SOURCE_DIR}/include;${ELF_INCLUDE_DIRECTORIES};${ZLIB_INCLUDE_DIRECTORIES}" PARENT_SCOPE) |
| 89 | set(NETDATA_LIBBPF_COMPILE_OPTIONS "${ELF_CFLAGS_OTHER};${ZLIB_CFLAGS_OTHER}" PARENT_SCOPE) |
| 90 | endfunction() |
| 91 | |
| 92 | # Add libbpf as a link dependency for the given target. |
| 93 | function(netdata_add_libbpf_to_target _target) |
| 94 | target_link_libraries(${_target} libbpf_library) |
| 95 | target_include_directories(${_target} BEFORE PUBLIC "${NETDATA_LIBBPF_INCLUDE_DIRECTORIES}") |
| 96 | target_compile_options(${_target} PUBLIC "${NETDATA_LIBBPF_COMPILE_OPTIONS}") |
| 97 | add_dependencies(${_target} libbpf) |
| 98 | endfunction() |