NetdataUtil.cmake 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. # Utility functions used by other modules.
  2. #
  3. # Copyright (c) 2024 Netdata Inc.
  4. # SPDX-License-Identifier: GPL-3.0-or-later
  5. include_guard()
  6. # Determine the version of the host kernel.
  7. #
  8. # Only works on UNIX-like systems, stores the version in the cache
  9. # variable HOST_KERNEL_VERSION.
  10. function(netdata_detect_host_kernel_version)
  11. if(DEFINED HOST_KERNEL_VERSION)
  12. return()
  13. endif()
  14. message(CHECK_START "Determining host kernel version")
  15. if(NOT CMAKE_CROSSCOMPILING)
  16. include(CheckIncludeFile)
  17. check_include_file("linux/version.h" CAN_USE_VERSION_H)
  18. if(CAN_USE_VERSION_H)
  19. message(CHECK_START "Checking version using linux/version.h")
  20. file(WRITE "${CMAKE_BINARY_DIR}/kversion-test.c" "
  21. #include <stdio.h>
  22. #include <linux/version.h>
  23. int main() {
  24. printf(\"%i.%i.%i\", LINUX_VERSION_MAJOR, LINUX_VERSION_PATCHLEVEL, LINUX_VERSION_SUBLEVEL);
  25. }
  26. ")
  27. try_run(_run_success _compile_success
  28. ${CMAKE_BINARY_DIR}
  29. SOURCES ${CMAKE_BINARY_DIR}/kversion-test.c
  30. RUN_OUTPUT_VARIABLE _kversion_output)
  31. if(_compile_success AND _run_success EQUAL 0)
  32. message(CHECK_PASS "success")
  33. set(_kversion_value "${_kversion_output}")
  34. else()
  35. message(CHECK_FAIL "failed")
  36. endif()
  37. endif()
  38. endif()
  39. if(NOT DEFINED _kversion_value)
  40. message(CHECK_START "Checking version using uname")
  41. execute_process(COMMAND uname -r
  42. RESULT_VARIABLE _uname_result
  43. OUTPUT_VARIABLE _uname_output)
  44. if(NOT _uname_result EQUAL 0)
  45. message(CHECK_FAIL "failed")
  46. message(CHECK_FAIL "unknown")
  47. set(HOST_KERNEL_VERSION "0.0.0" CACHE STRING "Detected host kernel version")
  48. return()
  49. else()
  50. message(CHECK_PASS "success")
  51. endif()
  52. set(_kversion_value "${_uname_output}")
  53. endif()
  54. string(REGEX REPLACE "-.+$" "" _kversion "${_kversion_value}")
  55. message(CHECK_PASS "${_kversion}")
  56. set(HOST_KERNEL_VERSION "${_kversion}" CACHE STRING "Detected host kernel version")
  57. endfunction()
  58. # Check what libc we're using.
  59. #
  60. # Sets the specified variable to the name of the libc or "unknown"
  61. function(netdata_identify_libc _libc_name)
  62. if(NOT DEFINED _ND_DETECTED_LIBC)
  63. message(CHECK_START "Detecting libc implementation")
  64. execute_process(COMMAND ldd --version
  65. COMMAND grep -q -i -E "glibc|gnu libc"
  66. RESULT_VARIABLE LDD_RESULT
  67. OUTPUT_VARIABLE LDD_OUTPUT
  68. ERROR_VARIABLE LDD_OUTPUT)
  69. if(NOT LDD_RESULT)
  70. set(${_libc_name} glibc PARENT_SCOPE)
  71. set(_ND_DETECTED_LIBC glibc CACHE INTERNAL "")
  72. message(CHECK_PASS "glibc")
  73. return()
  74. endif()
  75. execute_process(COMMAND sh -c "ldd --version 2>&1 | grep -q -i 'musl'"
  76. RESULT_VARIABLE LDD_RESULT
  77. OUTPUT_VARIABLE LDD_OUTPUT
  78. ERROR_VARIABLE LDD_OUTPUT)
  79. if(NOT LDD_RESULT)
  80. set(${_libc_name} musl PARENT_SCOPE)
  81. set(_ND_DETECTED_LIBC musl CACHE INTERNAL "")
  82. message(CHECK_PASS "musl")
  83. return()
  84. endif()
  85. set(${_libc_name} unknown PARENT_SCOPE)
  86. set(_ND_DETECTED_LIBC unknown CACHE INTERNAL "")
  87. message(CHECK_FAIL "unknown")
  88. else()
  89. set(${_libc_name} ${_ND_DETECTED_LIBC} PARENT_SCOPE)
  90. endif()
  91. endfunction()