File: plugin_config_command.cmake

package info (click to toggle)
sight 25.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 43,252 kB
  • sloc: cpp: 310,629; xml: 17,622; ansic: 9,960; python: 1,379; sh: 144; makefile: 33
file content (77 lines) | stat: -rw-r--r-- 3,450 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
# CMake script file launch at build time before the build of each module

file(STRINGS "${PROJECT_DIR}/rc/plugin.xml" PLUGIN_CONTENT)

set(FOUND_EXTENSION OFF)
foreach(LINE ${PLUGIN_CONTENT})

    if(NOT FOUND_EXTENSION)
        # Look for service extension
        if("${LINE}" MATCHES "<extension implements=\"(::)?sight::service::extension::factory\" *>")
            set(FOUND_EXTENSION ON)
            set(OBJECTS "")
        endif()
    else()
        if("${LINE}" MATCHES "</extension>")
            set(FOUND_EXTENSION OFF)

            # 1. Generate an entry for one service
            list(APPEND REGISTER_SERVICES "SIGHT_REGISTER_SERVICE( ${TYPE}, ${SERVICE} )\n")

            # 2. Generate the include for the service
            set(SERVICE_INCLUDE ${SERVICE})
            # Remove the trailing :: from the left
            string(REGEX REPLACE "^::(.*)" "\\1" SERVICE_INCLUDE ${SERVICE_INCLUDE})
            # Guess the name of the root of the target containing the file
            get_filename_component(PROJECT_LAST_DIR ${PROJECT_DIR} NAME)
            if("${PROJECT_LAST_DIR}" STREQUAL "__")
                get_filename_component(PARENT_DIR ${PROJECT_DIR} DIRECTORY)
                get_filename_component(PROJECT_LAST_DIR ${PARENT_DIR} NAME)
            endif()
            string(REGEX REPLACE ".*${PROJECT_LAST_DIR}::(.*)" "\\1" SERVICE_INCLUDE ${SERVICE_INCLUDE})

            string(REGEX REPLACE "::" "/" SERVICE_INCLUDE ${SERVICE_INCLUDE})
            set(SERVICE_INCLUDE "${PROJECT_DIR}/${SERVICE_INCLUDE}.hpp")
            if(NOT "${SERVICE}" MATCHES "module")
                string(REGEX REPLACE "module" "lib" SERVICE_INCLUDE ${SERVICE_INCLUDE})
            endif()
            list(APPEND REGISTER_INCLUDE "#include <${SERVICE_INCLUDE}>")

            foreach(OBJ ${OBJECTS})
                # 3. Generate the object register macros
                list(APPEND REGISTER_SERVICES "SIGHT_REGISTER_SERVICE_OBJECT( ${SERVICE}, ${OBJ} )\n")

                # 4. Generate the include for the data objects
                set(OBJECT_INCLUDE ${OBJ})
                # Remove the trailing :: from the left
                string(REGEX REPLACE "^::(.*)" "\\1" OBJECT_INCLUDE ${OBJECT_INCLUDE})
                # Drop the root namespace
                string(REGEX REPLACE "([A-z0-9]*::)?([A-z0-9]*::[A-z0-9]*(.*))" "\\2" OBJECT_INCLUDE ${OBJECT_INCLUDE})
                string(REGEX REPLACE "::" "/" OBJECT_INCLUDE ${OBJECT_INCLUDE})

                list(APPEND REGISTER_INCLUDE "#include <${OBJECT_INCLUDE}.hpp>")
            endforeach()

        else()
            if("${LINE}" MATCHES "<type>(.*)</type>")
                set(TYPE ${CMAKE_MATCH_1})
            elseif("${LINE}" MATCHES "<service>(.*)</service>")
                set(SERVICE ${CMAKE_MATCH_1})
            elseif("${LINE}" MATCHES "<object>(.*)</object>")
                list(APPEND OBJECTS ${CMAKE_MATCH_1})
            elseif("${LINE}" MATCHES "<object key=\"(.*)\">(.*)</object>")
                list(APPEND OBJECTS ${CMAKE_MATCH_2})
            endif()
        endif()
    endif()

endforeach()

if(REGISTER_SERVICES)
    list(APPEND REGISTER_INCLUDE "#include <service/macros.hpp>")

    string(REPLACE ";" "" REGISTER_SERVICES "${REGISTER_SERVICES}")
    string(REPLACE ";" "\n" REGISTER_INCLUDE "${REGISTER_INCLUDE}")
endif()

configure_file("${CMAKE_SCRIPTS_DIR}/registerServices.cpp.in" "${REGISTERSERVICE_OUTPUT_PATH}/registerServices.cpp")