summaryrefslogtreecommitdiffstats
path: root/packaging/cmake/Modules/NetdataJSONC.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'packaging/cmake/Modules/NetdataJSONC.cmake')
-rw-r--r--packaging/cmake/Modules/NetdataJSONC.cmake108
1 files changed, 108 insertions, 0 deletions
diff --git a/packaging/cmake/Modules/NetdataJSONC.cmake b/packaging/cmake/Modules/NetdataJSONC.cmake
new file mode 100644
index 000000000..9bbb424e1
--- /dev/null
+++ b/packaging/cmake/Modules/NetdataJSONC.cmake
@@ -0,0 +1,108 @@
+# Functions and macros for handling of JSON-C
+#
+# Copyright (c) 2024 Netdata Inc.
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# Handle bundling of json-c.
+#
+# This pulls it in as a sub-project using FetchContent functionality.
+#
+# This needs to be a function and not a macro for variable scoping
+# reasons. All the things we care about from the sub-project are exposed
+# as targets, which are globally scoped and not function scoped.
+function(netdata_bundle_jsonc)
+ include(FetchContent)
+ include(NetdataFetchContentExtra)
+
+ message(STATUS "Preparing vendored copy of JSON-C")
+
+ if(ENABLE_BUNDLED_JSONC)
+ set(FETCHCONTENT_TRY_FIND_PACKAGE_MODE NEVER)
+ endif()
+
+ set(FETCHCONTENT_FULLY_DISCONNECTED Off)
+
+ # JSON-C supports older versions of CMake than we do, so set
+ # the correct values for the few policies we actually need.
+ set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
+
+ # JSON-C's build system does string comparisons against option
+ # values instead of treating them as booleans, so we need to use
+ # proper strings for option values instead of just setting them
+ # to true or false.
+ set(DISABLE_BSYMBOLIC ON)
+ set(DISABLE_WERROR ON)
+ set(DISABLE_EXTRA_LIBS ON)
+ set(BUILD_SHARED_LIBS OFF)
+ set(BUILD_STATIC_LIBS ON)
+ set(BUILD_APPS OFF)
+
+ FetchContent_Declare(json-c
+ GIT_REPOSITORY https://github.com/json-c/json-c
+ GIT_TAG b4c371fa0cbc4dcbaccc359ce9e957a22988fb34 # json-c-0.17-20230812
+ CMAKE_ARGS ${NETDATA_CMAKE_PROPAGATE_TOOLCHAIN_ARGS}
+ )
+
+ FetchContent_MakeAvailable_NoInstall(json-c)
+
+ message(STATUS "Finished preparing vendored copy of JSON-C")
+endfunction()
+
+# Handle setup of json-c for the build.
+#
+# This will attempt to find json-c using pkg_check_modules. If it finds
+# a usable copy, that will be used. If not, it will bundle a vendored copy
+# as a sub-project.
+#
+# Irrespective of how json-c is to be included, library names,
+# include directories, and compile definitions will be specified in the
+# NETDATA_JSONC_* variables for later use.
+macro(netdata_detect_jsonc)
+ if(NOT ENABLE_BUNDLED_JSONC)
+ pkg_check_modules(JSONC json-c)
+ endif()
+
+ if(NOT JSONC_FOUND)
+ set(ENABLE_BUNDLED_JSONC True PARENT_SCOPE)
+ netdata_bundle_jsonc()
+ set(NETDATA_JSONC_LDFLAGS json-c)
+ set(NETDATA_JSONC_INCLUDE_DIRS ${PROJECT_BINARY_DIR}/include)
+ get_target_property(NETDATA_JSONC_CFLAGS_OTHER json-c INTERFACE_COMPILE_DEFINITIONS)
+
+ if(NETDATA_JSONC_CFLAGS_OTHER STREQUAL NETDATA_JSONC_CFLAGS_OTHER-NOTFOUND)
+ set(NETDATA_JSONC_CFLAGS_OTHER "")
+ endif()
+
+ add_custom_command(
+ OUTPUT ${PROJECT_BINARY_DIR}/include/json-c
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/include
+ COMMAND ${CMAKE_COMMAND} -E create_symlink ${json-c_BINARY_DIR} ${PROJECT_BINARY_DIR}/include/json-c
+ COMMENT "Create compatibility symlink for vendored JSON-C headers"
+ DEPENDS json-c
+ )
+ add_custom_target(
+ json-c-compat-link
+ DEPENDS ${PROJECT_BINARY_DIR}/include/json-c
+ )
+ else()
+ set(NETDATA_JSONC_LDFLAGS ${JSONC_LDFLAGS})
+ set(NETDATA_JSONC_CFLAGS_OTHER ${JSONC_CFLAGS_OTHER})
+ set(NETDATA_JSONC_INCLUDE_DIRS ${JSONC_INCLUDE_DIRS})
+ add_custom_target(json-c-compat-link)
+ endif()
+endmacro()
+
+# Add json-c as a public link dependency of the specified target.
+#
+# The specified target must already exist, and the netdata_detect_json-c
+# macro must have already been run at least once for this to work correctly.
+function(netdata_add_jsonc_to_target _target)
+ if(ENABLE_BUNDLED_JSONC)
+ target_include_directories(${_target} BEFORE PUBLIC ${NETDATA_JSONC_INCLUDE_DIRS})
+ else()
+ target_include_directories(${_target} PUBLIC ${NETDATA_JSONC_INCLUDE_DIRS})
+ endif()
+ target_compile_options(${_target} PUBLIC ${NETDATA_JSONC_CFLAGS_OTHER})
+ target_link_libraries(${_target} PUBLIC ${NETDATA_JSONC_LDFLAGS})
+ add_dependencies(${_target} json-c-compat-link)
+endfunction()