NetdataLibBPF.cmake 3.3 KB

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