File: ConfigHeader.cmake

package info (click to toggle)
martchus-cpp-utilities 5.28.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,352 kB
  • sloc: cpp: 12,471; awk: 18; ansic: 12; makefile: 10
file content (88 lines) | stat: -rw-r--r-- 3,710 bytes parent folder | download
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
cmake_minimum_required(VERSION 3.17.0 FATAL_ERROR)

# before including this module, all relevant variables must be set just include this module as last one since nothing should
# depend on it

if (NOT TARGET_CONFIG_DONE)
    message(FATAL_ERROR "Before including the ConfigHeader module, the AppTarget/LibraryTarget module must be included.")
endif ()

# find config.h template
include(TemplateFinder)
find_template_file("config.h" CPP_UTILITIES CONFIG_H_TEMPLATE_FILE)

# ensure certain variables are cleared
unset(DEPENCENCY_VERSIONS)
unset(DEPENCENCY_VERSIONS_ARRAY)
unset(LINK_LIBRARIES_LIST)
unset(INTERFACE_LINK_LIBRARIES_LIST)
unset(PROCESSED_DEPENDENCIES)
unset(HAVE_OPENSSL)

# get list of dependencies the main target links to
if (NOT META_HEADER_ONLY_LIB)
    get_target_property(LINK_LIBRARIES_LIST "${META_TARGET_NAME}" LINK_LIBRARIES)
endif ()
get_target_property(INTERFACE_LINK_LIBRARIES_LIST "${META_TARGET_NAME}" INTERFACE_LINK_LIBRARIES)

# make list with link-time dependency versions and display names
foreach (DEPENDENCY IN LISTS LINK_LIBRARIES_LIST INTERFACE_LINK_LIBRARIES_LIST)
    # skip non-targets and already processed dependencies
    if (NOT TARGET "${DEPENDENCY}" OR "${DEPENDENCY}" IN_LIST PROCESSED_DEPENDENCIES)
        continue()
    endif ()

    # find version and display name for target
    unset(DEPENDENCY_VER)
    unset(DEPENDENCY_DISPLAY_NAME)
    if (DEPENDENCY MATCHES "((Static)?Qt[0-9]+)::([A-Za-z0-9]+)")
        # read meta-data of Qt module
        set(DEPENDENCY_MODULE_PREFIX "${CMAKE_MATCH_1}")
        set(DEPENDENCY_MODULE_NAME "${CMAKE_MATCH_3}")
        set(DEPENDENCY_DISPLAY_NAME "Qt ${DEPENDENCY_MODULE_NAME}")
        set(DEPENDENCY_VER "${${DEPENDENCY_MODULE_PREFIX}${DEPENDENCY_MODULE_NAME}_VERSION_STRING}")
        if (NOT DEPENDENCY_VER)
            set(DEPENDENCY_VER "${${DEPENDENCY_MODULE_PREFIX}${DEPENDENCY_MODULE_NAME}_VERSION}")
        endif ()
    elseif (DEPENDENCY STREQUAL ZLIB::ZLIB)
        set(DEPENDENCY_DISPLAY_NAME "zlib")
        set(DEPENDENCY_VER "${ZLIB_VERSION_STRING}")
    elseif (NOT HAVE_OPENSSAL AND (DEPENDENCY STREQUAL OpenSSL::SSL OR DEPENDENCY STREQUAL OpenSSL::Crypto))
        set(DEPENDENCY_DISPLAY_NAME "OpenSSL")
        set(DEPENDENCY_VER "${OPENSSL_VERSION}")
    elseif (${DEPENDENCY}_varname)
        # read meta-data of one of my own libraries
        set(DEPENDENCY_VARNAME "${${DEPENDENCY}_varname}")
        set(DEPENDENCY_DISPLAY_NAME "${DEPENDENCY}")
        if (${DEPENDENCY_VARNAME}_DISPLAY_NAME)
            set(DEPENDENCY_DISPLAY_NAME "${${DEPENDENCY_VARNAME}_DISPLAY_NAME}")
        endif ()
        set(DEPENDENCY_VER "${${DEPENDENCY_VARNAME}_VERSION}")
    endif ()

    # TODO: provide meta-data for other libs, too

    if (NOT DEPENDENCY_VER OR "${DEPENDENCY_VER}" STREQUAL "DEPENDENCY_VER-NOTFOUND")
        continue()
    endif ()
    list(APPEND PROCESSED_DEPENDENCIES "${DEPENDENCY}")
    list(APPEND DEPENCENCY_VERSIONS "${DEPENDENCY_DISPLAY_NAME}: ${DEPENDENCY_VER}")
endforeach ()

# format "DEPENCENCY_VERSIONS_ARRAY"
if (DEPENCENCY_VERSIONS)
    include(ListToString)
    list_to_string("," " \\\n    \"" "\"" "${DEPENCENCY_VERSIONS}" DEPENCENCY_VERSIONS_ARRAY)
endif ()

# add configuration header
configure_file("${CONFIG_H_TEMPLATE_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/resources/config.h")

# ensure generated include files can be included via #include "resources/config.h"
if (NOT META_HEADER_ONLY_LIB)
    foreach (TARGET_NAME ${META_TARGET_NAME} ${META_TARGET_NAME}_tests ${META_TARGET_NAME}_testlib)
        if (TARGET ${TARGET_NAME})
            target_include_directories(${TARGET_NAME} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
        endif ()
    endforeach ()
endif ()