summaryrefslogtreecommitdiffstats
path: root/packaging/cmake/Modules/NetdataYAML.cmake
blob: f2f9b404ee4367b123170ed3dcc751b2a38e7177 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# Functions and macros for handling of libYAML
#
# Copyright (c) 2024 Netdata Inc.
# SPDX-License-Identifier: GPL-3.0-or-later

# Handle bundling of libyaml.
#
# 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_libyaml)
        include(FetchContent)
        include(NetdataFetchContentExtra)

        if(ENABLE_BUNDLED_LIBYAML)
                set(FETCHCONTENT_TRY_FIND_PACKAGE_MODE NEVER)
        endif()

        set(FETCHCONTENT_FULLY_DISCONNECTED Off)

        FetchContent_Declare(yaml
                GIT_REPOSITORY https://github.com/yaml/libyaml
                GIT_TAG 2c891fc7a770e8ba2fec34fc6b545c672beb37e6 # v0.2.5
                CMAKE_ARGS ${NETDATA_CMAKE_PROPAGATE_TOOLCHAIN_ARGS}
        )

        FetchContent_MakeAvailable_NoInstall(yaml)
endfunction()

# Handle setup of libyaml for the build.
#
# This will attempt to find libyaml 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 libyaml is to be included, library names,
# include directories, and compile definitions will be specified in the
# NETDATA_YAML_* variables for later use.
macro(netdata_detect_libyaml)
        set(HAVE_LIBYAML True)

        pkg_check_modules(YAML yaml-0.1)

        if(ENABLE_BUNDLED_LIBYAML OR NOT YAML_FOUND)
                netdata_bundle_libyaml()
                set(ENABLE_BUNDLED_LIBYAML True PARENT_SCOPE)
                set(NETDATA_YAML_LDFLAGS yaml)
                get_target_property(NETDATA_YAML_INCLUDE_DIRS yaml INTERFACE_INCLUDE_DIRECTORIES)
                get_target_property(NETDATA_YAML_CFLAGS_OTHER yaml INTERFACE_COMPILE_DEFINITIONS)
        else()
                set(NETDATA_YAML_LDFLAGS ${YAML_LDFLAGS})
                set(NETDATA_YAML_CFLAGS_OTHER ${YAML_CFLAGS_OTHER})
                set(NETDATA_YAML_INCLUDE_DIRS ${YAML_INCLUDE_DIRS})
        endif()
endmacro()

# Add libyaml as a public link dependency of the specified target.
#
# The specified target must already exist, and the netdata_detect_libyaml
# macro must have already been run at least once for this to work correctly.
function(netdata_add_libyaml_to_target _target)
        if(ENABLE_BUNDLED_LIBYAML)
                target_include_directories(${_target} BEFORE PUBLIC ${NETDATA_YAML_INCLUDE_DIRS})
        else()
                target_include_directories(${_target} PUBLIC ${NETDATA_YAML_INCLUDE_DIRS})
        endif()
        target_compile_options(${_target} PUBLIC ${NETDATA_YAML_CFLAGS_OTHER})
        target_link_libraries(${_target} PUBLIC ${NETDATA_YAML_LDFLAGS})
endfunction()