summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--cmake/modules/CuraMacros.cmake75
2 files changed, 77 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 29cb9bd..36df36f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -15,6 +15,8 @@ endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
# Set path to custom cmake modules
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH})
+include(CuraMacros)
+
# Find required packages
find_package(CMPI REQUIRED)
find_package(KonkretCMPI REQUIRED)
diff --git a/cmake/modules/CuraMacros.cmake b/cmake/modules/CuraMacros.cmake
new file mode 100644
index 0000000..cf38db9
--- /dev/null
+++ b/cmake/modules/CuraMacros.cmake
@@ -0,0 +1,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)