diff --git a/CMakeLists.txt b/CMakeLists.txt index a3d31f0576..c8185ef29a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -83,6 +83,11 @@ if(USE_MOLD) endif() endif() +check_c_compiler_flag("-fexceptions" HAVE_FEXCEPTIONS) +if (NOT HAVE_FEXCEPTIONS) + message(FATAL_ERROR "Missing required compiler flag: -fexceptions.") +endif() + set(CONFIG_H_DIR ${CMAKE_BINARY_DIR}) set(CONFIG_H ${CONFIG_H_DIR}/config.h) @@ -2965,8 +2970,33 @@ endif() set(WEB_DEST "${WEB_DIR}") set(WEB_DIR "${NETDATA_RUNTIME_PREFIX}/${WEB_DEST}") +# Collect all compiler flags +get_directory_property(NETDATA_COMPILE_OPTIONS COMPILE_OPTIONS) +get_directory_property(NETDATA_COMPILE_DEFINITIONS COMPILE_DEFINITIONS) + +# Collect all linker flags +get_directory_property(NETDATA_LINK_OPTIONS LINK_OPTIONS) +get_directory_property(NETDATA_LINK_LIBRARIES LINK_LIBRARIES) + +list(APPEND CONFIGURE_OPTIONS + # Build type and languages + "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" + "-DCMAKE_C_STANDARD=${CMAKE_C_STANDARD}" + "-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}" + "-DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS}" + + # Compiler flags (dynamically collected) + "-DCMAKE_C_FLAGS='${CMAKE_C_FLAGS} ${NETDATA_COMPILE_OPTIONS}'" + "-DCMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS} ${NETDATA_COMPILE_OPTIONS}'" + "-DCMAKE_COMPILE_DEFINITIONS='${NETDATA_COMPILE_DEFINITIONS}'" + + # Linker flags (dynamically collected) + "-DCMAKE_EXE_LINKER_FLAGS='${CMAKE_EXE_LINKER_FLAGS} ${NETDATA_LINK_OPTIONS}'" + "-DCMAKE_SHARED_LINKER_FLAGS='${CMAKE_SHARED_LINKER_FLAGS}'" +) + +string(JOIN " " CONFIGURE_COMMAND "cmake" ${CONFIGURE_OPTIONS}) -set(CONFIGURE_COMMAND "dummy-configure-command") if (NOT NETDATA_USER) set(NETDATA_USER "netdata") endif() diff --git a/packaging/cmake/config.cmake.h.in b/packaging/cmake/config.cmake.h.in index 91eba4ed53..4ae5d5f63a 100644 --- a/packaging/cmake/config.cmake.h.in +++ b/packaging/cmake/config.cmake.h.in @@ -14,6 +14,10 @@ #cmakedefine OS_MACOS #cmakedefine OS_WINDOWS +// required compilation options + +#cmakedefine HAVE_FEXCEPTIONS + // checked headers #cmakedefine HAVE_NETINET_IN_H diff --git a/src/daemon/buildinfo.c b/src/daemon/buildinfo.c index fe30427d37..150fa0a6cc 100644 --- a/src/daemon/buildinfo.c +++ b/src/daemon/buildinfo.c @@ -118,6 +118,11 @@ typedef enum __attribute__((packed)) { BIB_EXPORT_SHELL, BIB_DEVEL_TRACE_ALLOCATIONS, BIB_DEVELOPER_MODE, + BIB_RUNTIME_PROFILE, + BIB_RUNTIME_PARENT, + BIB_RUNTIME_CHILD, + BIB_RUNTIME_MEM_TOTAL, + BIB_RUNTIME_MEM_AVAIL, // leave this last BIB_TERMINATOR, @@ -135,7 +140,8 @@ typedef enum __attribute__((packed)) { BIC_LIBS, BIC_PLUGINS, BIC_EXPORTERS, - BIC_DEBUG_DEVEL + BIC_DEBUG_DEVEL, + BIC_RUNTIME, } BUILD_INFO_CATEGORY; typedef enum __attribute__((packed)) { @@ -1040,6 +1046,46 @@ static struct { .json = "dev-mode", .value = NULL, }, + [BIB_RUNTIME_PROFILE] = { + .category = BIC_RUNTIME, + .type = BIT_STRING, + .analytics = "ConfigProfile", + .print = "Profile", + .json = "profile", + .value = NULL, + }, + [BIB_RUNTIME_PARENT] = { + .category = BIC_RUNTIME, + .type = BIT_BOOLEAN, + .analytics = "StreamParent", + .print = "Stream Parent (accept data from Children)", + .json = "parent", + .value = NULL, + }, + [BIB_RUNTIME_CHILD] = { + .category = BIC_RUNTIME, + .type = BIT_BOOLEAN, + .analytics = "StreamChild", + .print = "Stream Child (send data to a Parent)", + .json = "child", + .value = NULL, + }, + [BIB_RUNTIME_MEM_TOTAL] = { + .category = BIC_RUNTIME, + .type = BIT_STRING, + .analytics = "TotalMemory", + .print = "Total System Memory", + .json = "mem-total", + .value = NULL, + }, + [BIB_RUNTIME_MEM_AVAIL] = { + .category = BIC_RUNTIME, + .type = BIT_STRING, + .analytics = "AvailableMemory", + .print = "Available System Memory", + .json = "mem-available", + .value = NULL, + }, // leave this last [BIB_TERMINATOR] = { @@ -1454,9 +1500,26 @@ static void populate_packaging_info() { build_info_set_value(BIB_PACKAGING_INSTALL_TYPE, strdupz(BUILD_PACKAGING_INFO.install_type)); build_info_set_value(BIB_PACKAGING_ARCHITECTURE, strdupz(BUILD_PACKAGING_INFO.prebuilt_arch)); build_info_set_value(BIB_PACKAGING_DISTRO, strdupz(BUILD_PACKAGING_INFO.prebuilt_distro)); + + CLEAN_BUFFER *wb = buffer_create(0, NULL); + ND_PROFILE_2buffer(wb, nd_profile_detect_and_configure(false), " "); + build_info_set_value_strdupz(BIB_RUNTIME_PROFILE, buffer_tostring(wb)); + + build_info_set_status(BIB_RUNTIME_PARENT, stream_conf_is_parent(false)); + build_info_set_status(BIB_RUNTIME_CHILD, stream_conf_is_child()); } spinlock_unlock(&BUILD_PACKAGING_INFO.spinlock); } + + OS_SYSTEM_MEMORY sm = os_system_memory(true); + char buf[1024]; + snprintfz(buf, sizeof(buf), "%" PRIu64, sm.ram_total_bytes); + // size_snprintf(buf, sizeof(buf), sm.ram_total_bytes, "B", false); + build_info_set_value_strdupz(BIB_RUNTIME_MEM_TOTAL, buf); + + snprintfz(buf, sizeof(buf), "%" PRIu64, sm.ram_available_bytes); + // size_snprintf(buf, sizeof(buf), sm.ram_available_bytes, "B", false); + build_info_set_value_strdupz(BIB_RUNTIME_MEM_AVAIL, buf); } // ---------------------------------------------------------------------------- @@ -1529,6 +1592,7 @@ void print_build_info(void) { print_build_info_category_to_console(BIC_PLUGINS, "Plugins"); print_build_info_category_to_console(BIC_EXPORTERS, "Exporters"); print_build_info_category_to_console(BIC_DEBUG_DEVEL, "Debug/Developer Features"); + print_build_info_category_to_console(BIC_RUNTIME, "Runtime Information"); } void build_info_to_json_object(BUFFER *b) { @@ -1548,6 +1612,7 @@ void build_info_to_json_object(BUFFER *b) { print_build_info_category_to_json(b, BIC_PLUGINS, "plugins"); print_build_info_category_to_json(b, BIC_EXPORTERS, "exporters"); print_build_info_category_to_json(b, BIC_DEBUG_DEVEL, "debug-n-devel"); + print_build_info_category_to_json(b, BIC_RUNTIME, "runtime"); } void print_build_info_json(void) { diff --git a/src/daemon/main.c b/src/daemon/main.c index 0ef243ee1b..7f8090bb72 100644 --- a/src/daemon/main.c +++ b/src/daemon/main.c @@ -227,6 +227,11 @@ int unittest_prepare_rrd(const char **user) { } int netdata_main(int argc, char **argv) { +#if !defined(HAVE_FEXCEPTIONS) + fprintf(stderr, "Netdata has been compiled without these required compiler flags: -fexceptions.\n"); + exit(1); +#endif + string_init(); analytics_init();