Files
open-bamboo-networking/cmake/VendorCJSON.cmake
T

69 lines
2.9 KiB
CMake

# Static PIC cJSON via FetchContent for embedding into vendored mosquitto's
# libmosquitto_common without a host libcjson.so NEEDED on libbambu_networking.
function(obn_vendor_cjson_setup)
include(FetchContent)
set(_obn_cjson_override_dir "${CMAKE_CURRENT_BINARY_DIR}/_obn_cmake_overrides")
file(MAKE_DIRECTORY "${_obn_cjson_override_dir}")
list(PREPEND CMAKE_MODULE_PATH "${_obn_cjson_override_dir}")
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" PARENT_SCOPE)
# CACHE+FORCE so cJSON option() calls cannot reset these when combined with
# mosquitto in the same CMake run.
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
set(CJSON_OVERRIDE_BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE)
set(CJSON_BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
set(ENABLE_CJSON_TEST OFF CACHE BOOL "" FORCE)
set(ENABLE_CJSON_UTILS OFF CACHE BOOL "" FORCE)
set(ENABLE_CUSTOM_COMPILER_FLAGS OFF CACHE BOOL "" FORCE)
set(ENABLE_TARGET_EXPORT OFF CACHE BOOL "" FORCE)
set(ENABLE_CJSON_UNINSTALL OFF CACHE BOOL "" FORCE)
FetchContent_Declare(cjson
GIT_REPOSITORY https://github.com/DaveGamble/cJSON.git
GIT_TAG ${OBN_CJSON_GIT_TAG}
GIT_SHALLOW TRUE
GIT_PROGRESS TRUE
)
FetchContent_GetProperties(cjson)
if(NOT cjson_POPULATED)
FetchContent_Populate(cjson)
add_subdirectory("${cjson_SOURCE_DIR}" "${cjson_BINARY_DIR}" EXCLUDE_FROM_ALL)
endif()
if(NOT TARGET cjson)
message(FATAL_ERROR "obn: FetchContent cJSON did not produce target cjson")
endif()
# Mosquitto includes <cjson/cJSON.h>; upstream tarball uses cJSON.h at root.
set(_obn_cjson_iface_root "${CMAKE_CURRENT_BINARY_DIR}/_obn_cjson_include")
file(MAKE_DIRECTORY "${_obn_cjson_iface_root}/cjson")
file(COPY "${cjson_SOURCE_DIR}/cJSON.h" DESTINATION "${_obn_cjson_iface_root}/cjson")
target_include_directories(cjson PUBLIC "$<BUILD_INTERFACE:${_obn_cjson_iface_root}>")
set_target_properties(cjson PROPERTIES POSITION_INDEPENDENT_CODE ON)
# Consumers of mosquitto's public headers need this path too (#include
# <cjson/cJSON.h> via mosquitto/libcommon_cjson.h); do not link the cjson
# target into the plugin again (already inside vendored libmosquitto_common).
add_library(obn_vendor_cjson_iface INTERFACE)
target_include_directories(obn_vendor_cjson_iface INTERFACE
"$<BUILD_INTERFACE:${_obn_cjson_iface_root}>")
add_library(cJSON ALIAS cjson)
file(WRITE "${_obn_cjson_override_dir}/FindcJSON.cmake"
"include_guard(GLOBAL)\n"
"if(NOT TARGET cJSON)\n"
" message(FATAL_ERROR \"obn: FindcJSON: vendored cJSON target missing\")\n"
"endif()\n"
"set(CJSON_FOUND TRUE)\n"
"set(cJSON_FOUND TRUE)\n"
"set(CJSON_INCLUDE_DIRS \"${_obn_cjson_iface_root}\")\n"
)
message(STATUS "obn: using vendored cJSON static (${OBN_CJSON_GIT_TAG})")
endfunction()