aboutsummaryrefslogtreecommitdiff
path: root/cmake/PkgConfigWithFallbackOnConfigScript.cmake
blob: 4bc94a33f510d063d8e2d793645c5ec4ca83f6d7 (plain) (blame)
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
include(CMakeParseArguments)

function(find_pkg_config_with_fallback_on_config_script name)
    cmake_parse_arguments(ARGS "" "PKG_CONFIG_NAME" "CONFIG_SCRIPT_NAME" ${ARGN})
    set(${name}_PKG_CONFIG_NAME ${ARGS_PKG_CONFIG_NAME} PARENT_SCOPE)
    find_package(PkgConfig)

    if(PKG_CONFIG_FOUND)
        pkg_search_module(${name}_PKG_CONFIG QUIET ${ARGS_PKG_CONFIG_NAME})
    endif(PKG_CONFIG_FOUND)

    if (${name}_PKG_CONFIG_FOUND)
        # Found via pkg-config, using it's result values
        set(${name}_FOUND ${${name}_PKG_CONFIG_FOUND})

        # Try to find real file name of libraries
        foreach(lib ${${name}_PKG_CONFIG_LIBRARIES})
            find_library(${name}_${lib}_LIBRARY ${lib} HINTS ${${name}_PKG_CONFIG_LIBRARY_DIRS})
            mark_as_advanced(${name}_${lib}_LIBRARY)
            if(NOT ${name}_${lib}_LIBRARY)
                unset(${name}_FOUND)
            endif(NOT ${name}_${lib}_LIBRARY)
        endforeach(lib)
        if(${name}_FOUND)
            set(${name}_LIBRARIES "")
            foreach(lib ${${name}_PKG_CONFIG_LIBRARIES})
                list(APPEND ${name}_LIBRARIES ${${name}_${lib}_LIBRARY})
            endforeach(lib)
            list(REMOVE_DUPLICATES ${name}_LIBRARIES)
            set(${name}_LIBRARIES ${${name}_LIBRARIES} PARENT_SCOPE)
            list(GET ${name}_LIBRARIES "0" ${name}_LIBRARY)

            set(${name}_FOUND ${${name}_FOUND} PARENT_SCOPE)
            set(${name}_INCLUDE_DIRS ${${name}_PKG_CONFIG_INCLUDE_DIRS} PARENT_SCOPE)
            set(${name}_LIBRARIES ${${name}_PKG_CONFIG_LIBRARIES} PARENT_SCOPE)
            set(${name}_LIBRARY ${${name}_LIBRARY} PARENT_SCOPE)
            set(${name}_VERSION ${${name}_PKG_CONFIG_VERSION} PARENT_SCOPE)

            if(NOT TARGET ${ARGS_PKG_CONFIG_NAME})
                add_library(${ARGS_PKG_CONFIG_NAME} INTERFACE IMPORTED)
                set_property(TARGET ${ARGS_PKG_CONFIG_NAME} PROPERTY INTERFACE_COMPILE_OPTIONS "${${name}_PKG_CONFIG_CFLAGS_OTHER}")
                set_property(TARGET ${ARGS_PKG_CONFIG_NAME} PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${name}_PKG_CONFIG_INCLUDE_DIRS}")
                set_property(TARGET ${ARGS_PKG_CONFIG_NAME} PROPERTY INTERFACE_LINK_LIBRARIES "${${name}_LIBRARIES}")
            endif(NOT TARGET ${ARGS_PKG_CONFIG_NAME})
        endif(${name}_FOUND)
    else(${name}_PKG_CONFIG_FOUND)
        # No success with pkg-config, try via custom a *-config script
        find_program(${name}_CONFIG_EXECUTABLE NAMES ${ARGS_CONFIG_SCRIPT_NAME}-config)
        mark_as_advanced(${name}_CONFIG_EXECUTABLE)
        find_program(${name}_SH_EXECUTABLE NAMES sh)
        mark_as_advanced(${name}_SH_EXECUTABLE)

        if(${name}_CONFIG_EXECUTABLE)
            macro(config_script_fail errcode)
                if(${errcode})
                    message(FATAL_ERROR "Error invoking ${ARGS_CONFIG_SCRIPT_NAME}-config: ${errcode}")
                endif(${errcode})
            endmacro(config_script_fail)
            file(TO_NATIVE_PATH "${${name}_CONFIG_EXECUTABLE}" ${name}_CONFIG_EXECUTABLE)
            file(TO_NATIVE_PATH "${${name}_SH_EXECUTABLE}" ${name}_SH_EXECUTABLE)

            execute_process(COMMAND "${${name}_SH_EXECUTABLE}" "${${name}_CONFIG_EXECUTABLE}" --version
                            OUTPUT_VARIABLE ${name}_VERSION
                            RESULT_VARIABLE ERRCODE
                            OUTPUT_STRIP_TRAILING_WHITESPACE)
            config_script_fail(${ERRCODE})

            execute_process(COMMAND "${${name}_SH_EXECUTABLE}" "${${name}_CONFIG_EXECUTABLE}" --api-version
                            OUTPUT_VARIABLE ${name}_API_VERSION
                            RESULT_VARIABLE ERRCODE
                            OUTPUT_STRIP_TRAILING_WHITESPACE)
            config_script_fail(${ERRCODE})

            execute_process(COMMAND "${${name}_SH_EXECUTABLE}" "${${name}_CONFIG_EXECUTABLE}" --cflags
                            OUTPUT_VARIABLE ${name}_CFLAGS
                            RESULT_VARIABLE ERRCODE
                            OUTPUT_STRIP_TRAILING_WHITESPACE)
            config_script_fail(${ERRCODE})

            execute_process(COMMAND "${${name}_SH_EXECUTABLE}" "${${name}_CONFIG_EXECUTABLE}" --libs
                            OUTPUT_VARIABLE ${name}_LDFLAGS
                            RESULT_VARIABLE ERRCODE
                            OUTPUT_STRIP_TRAILING_WHITESPACE)
            config_script_fail(${ERRCODE})

            string(TOLOWER ${name} "${name}_LOWER")
            string(REGEX REPLACE "^(.* |)-l([^ ]*${${name}_LOWER}[^ ]*)( .*|)$" "\\2" ${name}_LIBRARY_NAME "${${name}_LDFLAGS}")
            string(REGEX REPLACE "^(.* |)-L([^ ]*)( .*|)$" "\\2" ${name}_LIBRARY_DIRS "${${name}_LDFLAGS}")
            find_library(${name}_LIBRARY ${${name}_LIBRARY_NAME} HINTS ${${name}_LIBRARY_DIRS})
            mark_as_advanced(${name}_LIBRARY)
            set(${name}_LIBRARY ${${name}_LIBRARY} PARENT_SCOPE)
            set(${name}_VERSION ${${name}_VERSION} PARENT_SCOPE)
            unset(${name}_LIBRARY_NAME)
            unset(${name}_LIBRARY_DIRS)

            if(NOT TARGET ${name}_LOWER)
                add_library(${name}_LOWER INTERFACE IMPORTED)
                set_property(TARGET ${name}_LOWER PROPERTY INTERFACE_LINK_LIBRARIES "${${name}_LDFLAGS}")
                set_property(TARGET ${name}_LOWER PROPERTY INTERFACE_COMPILE_OPTIONS "${${name}_CFLAGS}")
            endif(NOT TARGET ${name}_LOWER)
        endif(${name}_CONFIG_EXECUTABLE)
    endif(${name}_PKG_CONFIG_FOUND)
endfunction()