master
cmake 98 lines 3.21 KB
Raw
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()