summaryrefslogtreecommitdiff
path: root/tools/intergen/GenerateInterfaceLibrary.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'tools/intergen/GenerateInterfaceLibrary.cmake')
-rw-r--r--tools/intergen/GenerateInterfaceLibrary.cmake60
1 files changed, 60 insertions, 0 deletions
diff --git a/tools/intergen/GenerateInterfaceLibrary.cmake b/tools/intergen/GenerateInterfaceLibrary.cmake
new file mode 100644
index 000000000..8482a8206
--- /dev/null
+++ b/tools/intergen/GenerateInterfaceLibrary.cmake
@@ -0,0 +1,60 @@
+set(INTERGEN_CMD ${CMAKE_BINARY_DIR}/tools/intergen/bin/intergen)
+set(GENERATED_LIB_DEPENDENCIES jsoncpp)
+set(GENERATED_LIB_HEADER_DEPENDENCIES
+ ${CMAKE_SOURCE_DIR}/src/components/rpc_base/include
+ ${CMAKE_SOURCE_DIR}/src/thirdPartyLibs/jsoncpp/include
+)
+
+# Generates interface library from given xml file and builds it
+# in CMAKE_CURRENT_BINARY_DIR
+# |xml_file_name| contains path to xml spec files
+# |generated_interface_names| should contain list of generated interfaces
+# if |AUTO_FUNC_IDS| is added to argument list, intergen is called with "-a"
+# flag telling intergen to generate function ids automatically
+# if |DBUS_SUPPORT| is added to argument list, intergen is called with "-d"
+# flag that enables DBus serialization code generation
+# from xml_file (intergen creates separate directory for every interface).
+# Their names are written lowercase_underscored_style.
+function (GenerateInterfaceLibrary xml_file_name generated_interface_names)
+ set(options AUTO_FUNC_IDS DBUS_SUPPORT)
+ cmake_parse_arguments(GenerateInterfaceLibrary "${options}" "" "" ${ARGN})
+ if (GenerateInterfaceLibrary_AUTO_FUNC_IDS)
+ set(AUTOID "-a")
+ endif()
+ if (GenerateInterfaceLibrary_DBUS_SUPPORT)
+ set(NEED_DBUS "-d")
+ list(APPEND GENERATED_LIB_HEADER_DEPENDENCIES ${DBUS_INCLUDE_DIRS})
+ endif()
+
+ foreach(interface_name ${generated_interface_names})
+ set(HEADERS
+ ${interface_name}/enums.h
+ ${interface_name}/types.h
+ ${interface_name}/functions.h
+ ${interface_name}/interface.h
+ )
+ set(SOURCES
+ ${interface_name}/enums.cc
+ ${interface_name}/types.cc
+ ${interface_name}/functions.cc
+ ${interface_name}/validation.cc
+ ${interface_name}/interface.cc
+ )
+ add_custom_command( OUTPUT ${HEADERS} ${SOURCES}
+ COMMAND ${INTERGEN_CMD} -f ${CMAKE_CURRENT_SOURCE_DIR}/${xml_file_name} -j ${AUTOID} ${NEED_DBUS} -i ${interface_name}
+ DEPENDS ${INTERGEN_CMD} ${xml_file_name}
+ COMMENT "Generating interface ${interface_name} from ${xml_file_name}"
+ VERBATIM
+ )
+ include_directories(
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${GENERATED_LIB_HEADER_DEPENDENCIES}
+ )
+ add_library(${interface_name} ${SOURCES})
+
+ # |previous_interface| ensures that interface libraries are built in the same order
+ # as they defined in |generated_interface_names|
+ target_link_libraries(${interface_name} ${GENERATED_LIB_DEPENDENCIES} ${previous_interface})
+ set(previous_interface ${interface_name})
+ endforeach(interface_name)
+endfunction(GenerateInterfaceLibrary xml_file_name generated_interface_names)