summaryrefslogtreecommitdiffstats
path: root/cmake/modules/CuraMacros.cmake
blob: cf38db901376acfda0e2c5fe5e17589f0b013976 (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
72
73
74
75

# This macro takes name of the MOF for one provider and header files using
# konkretcmpi. It also generates provider skeleton if it doesn't exist.
#
# @param[in] MOF name of the MOF file (should be in mof/ directory of the project root)
# @param[out] CIM_PROVIDERS list of sources of the provider generated from the MOF
# @param[out] CIM_HEADERS list of header file generated from the MOF
#
macro(konkretcmpi_generate MOF CIM_PROVIDERS CIM_HEADERS)
    # Check if MOF exists
    find_file(MOF_FILE
              ${MOF}
              PATHS ${CMAKE_SOURCE_DIR}/mof/
    )
    if (MOF_FILE STREQUAL "MOF_FILE-NOTFOUND")
        message(FATAL_ERROR "MOF file ${MOF} not found")
    endif (MOF_FILE STREQUAL "MOF_FILE-NOTFOUND")

    # Read CIM classes out of MOF file
    execute_process(COMMAND sed -e "/class/ !D" -e "s/class \\(.*\\):.*/\\1/g"
                    INPUT_FILE ${MOF_FILE}
                    OUTPUT_VARIABLE CIM_CLASSES
    )

    if (${CIM_CLASSES} STREQUAL "")
        message(FATAL_ERROR "No class found in the MOF file ${MOF_FILE}")
    endif (${CIM_CLASSES} STREQUAL "")

    # And fill list with them
    string(REGEX MATCHALL "[a-zA-Z_-]+" CIM_CLASSES ${CIM_CLASSES})

    # Get headers and sources names from the list of CIM classes
    set(${CIM_HEADERS} "")
    set(${CIM_PROVIDERS} "")
    set(GENERATE_PROVIDERS "")
    set(NEW_PROVIDERS "")
    foreach(CLASS ${CIM_CLASSES})
        # Add generated header to the list
        set(${CIM_HEADERS} ${CIM_HEADERS} ${CLASS}.h)
        # Get name of the source file
        set(PROVIDER ${CLASS}Provider.c)
        # If the provider doesn't exist, generate it
        if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${PROVIDER})
            # Part of generating command - passed to konkret
            set(GENERATE_PROVIDERS ${GENERATE_PROVIDERS} -s ${CLASS})
            # List of freshly generated providers
            set(NEW_PROVIDERS ${NEW_PROVIDERS} ${PROVIDER})
        endif (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${PROVIDER})
        # Add provider source to the list
        set(${CIM_PROVIDERS} ${CIM_PROVIDERS} ${PROVIDER})
    endforeach(CLASS ${CIM_CLASSES})

    # Generate headers for CIM classes
    set(ENV{KONKRET_SCHEMA_DIR} "/usr/share/mof/cim-current")
    execute_process(COMMAND ${KONKRETCMPI_KONKRET}
                            #-m /usr/share/sblim-cmpi-base/Linux_Base.mof
                            -m ${MOF_FILE}
                            ${GENERATE_PROVIDERS}
                            ${CIM_CLASSES}
                    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
                    RESULT_VARIABLE RES
                    OUTPUT_VARIABLE OUT
                    ERROR_VARIABLE ERR
                )

    # Show error message when konkret fails
    if (NOT ${RES} EQUAL 0)
        message(FATAL_ERROR "KonkretCMPI failed: ${RES} ${ERR}")
    endif (NOT ${RES} EQUAL 0)

    # Move pregenerated sources for providers to source directory
    foreach(PROVIDER ${NEW_PROVIDERS})
        file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/${PROVIDER} ${CMAKE_CURRENT_SOURCE_DIR}/${PROVIDER})
    endforeach(PROVIDER ${NEW_PROVIDERS})
endmacro(konkretcmpi_generate MOF PROVIDERS HEADERS)