summaryrefslogtreecommitdiff
path: root/cmake/CommonAPIGenerator.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/CommonAPIGenerator.cmake')
-rwxr-xr-xcmake/CommonAPIGenerator.cmake167
1 files changed, 167 insertions, 0 deletions
diff --git a/cmake/CommonAPIGenerator.cmake b/cmake/CommonAPIGenerator.cmake
new file mode 100755
index 0000000..1deba53
--- /dev/null
+++ b/cmake/CommonAPIGenerator.cmake
@@ -0,0 +1,167 @@
+#
+# Find common-api sources
+#
+# This module defines these variables:
+#
+# ${PARAMS_TARGET}_GEN_HEADERS
+# A list with generated headers
+# ${PARAMS_TARGET}_GEN_SOURCES
+# A list with generated sources
+# ${PARAMS_TARGET}_GEN_INCLUDE_DIR
+# A list with include directories
+
+include(CMakeParseArguments)
+
+IF(COMMON_API_FOUND AND COMMON_API_DBUS_FOUND)
+ # get lists with headers and sources after they has been generated
+ macro(SEARCH_FOR_COMMON_API_GEN_FILES GEN_DESTINATION)
+
+ #searching for generated headers
+ execute_process(COMMAND find ${GEN_DESTINATION} -name *.h
+ RESULT_VARIABLE EXIT_CODE
+ OUTPUT_VARIABLE _CAPI_HEADERS
+ ERROR_VARIABLE CAPI_HEADERS_ERROR
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ ERROR_STRIP_TRAILING_WHITESPACE)
+
+ IF(CAPI_HEADERS_ERROR)
+ MESSAGE(FATAL_ERROR "Can't find common-api generated headers!")
+ ENDIF()
+ string(REPLACE "\n" ";" CAPI_HEADERS ${_CAPI_HEADERS})
+
+ FOREACH(INCLUDE_ITER ${CAPI_HEADERS})
+ GET_FILENAME_COMPONENT(TEMP_PATH ${INCLUDE_ITER} PATH)
+ SET(CAPI_INCLUDES ${CAPI_INCLUDES} ${TEMP_PATH})
+ ENDFOREACH(INCLUDE_ITER ${CAPI_HEADERS})
+ LIST(REMOVE_DUPLICATES CAPI_INCLUDES)
+
+ #searching for generated sources
+ execute_process(COMMAND find ${GEN_DESTINATION} -name *.cpp
+ RESULT_VARIABLE EXIT_CODE
+ OUTPUT_VARIABLE _CAPI_SOURCES
+ ERROR_VARIABLE CAPI_SOURCES_ERROR
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ ERROR_STRIP_TRAILING_WHITESPACE)
+ IF(CAPI_SOURCES_ERROR)
+ MESSAGE(FATAL_ERROR "Can't find common-api generated sources!")
+ ENDIF()
+ string(REPLACE "\n" ";" CAPI_SOURCES ${_CAPI_SOURCES})
+ LIST(REMOVE_DUPLICATES CAPI_SOURCES)
+
+ set(${PARAMS_TARGET}_GEN_HEADERS ${CAPI_HEADERS} PARENT_SCOPE)
+ set(${PARAMS_TARGET}_GEN_SOURCES ${CAPI_SOURCES} PARENT_SCOPE)
+
+ #add base path src-gen
+ SET(${PARAMS_TARGET}_GEN_INCLUDE_DIR ${CAPI_INCLUDES} ${GEN_DESTINATION} PARENT_SCOPE)
+ endmacro()
+
+ # generate common-api sources and retreive a list with them
+ macro(GENERATE_FILES)
+ # searching for common-api-generator executable ...
+ FIND_PATH(COMMONAPI_GENERATOR_JAR
+ NAMES
+ "common-api-generator.jar"
+ PATH_SUFFIXES
+ CommonAPI-${COMMON_API_VERSION}
+ PATHS
+ "/usr/share"
+ "/usr/local/share")
+ if(COMMONAPI_GENERATOR_JAR)
+ # load java runtime ...
+ find_package(Java COMPONENTS Runtime REQUIRED QUIET)
+ function(mktmpdir OUTVAR)
+ while(NOT TEMP_DESTINATION OR EXISTS ${TEMP_DESTINATION})
+ string(RANDOM LENGTH 16 TEMP_DESTINATION)
+ set(TEMP_DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/${TEMP_DESTINATION}")
+ endwhile()
+
+ file(MAKE_DIRECTORY ${TEMP_DESTINATION})
+
+ set(${OUTVAR} ${TEMP_DESTINATION} PARENT_SCOPE)
+ endfunction()
+ # execute the generate command ...
+ execute_process(COMMAND ${Java_JAVA_EXECUTABLE} -jar "${COMMONAPI_GENERATOR_JAR}/common-api-generator.jar" -dest ${PARAMS_DESTINATION} ${ARGS} ${FIDLS}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ RESULT_VARIABLE EXIT_CODE
+ OUTPUT_VARIABLE GENERATOR_OUTPUT
+ ERROR_VARIABLE GENERATOR_OUTPUT
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ ERROR_STRIP_TRAILING_WHITESPACE)
+ if(EXIT_CODE)
+ message(FATAL_ERROR "Failed to generate files from FIDL:\n ${GENERATOR_OUTPUT}")
+ endif()
+ SET(TEMP_GEN_DST ${PARAMS_DESTINATION})
+ else()
+ # if the generator is not found, try to find the sources in the alternative folder
+ SET(TEMP_GEN_DST ${PARAMS_ALT_DESTINATION})
+ message(STATUS "Couldn't find a common-api generator...skiping generation!")
+ endif()
+ # get the lists with the sources and headers
+ message(STATUS "Looking for available common-api generated files...")
+ SEARCH_FOR_COMMON_API_GEN_FILES(${TEMP_GEN_DST})
+ endmacro()
+
+ function(COMMON_API_GENERATE_SOUCRES)
+ #parse the input parameters
+ set(options DBUS)
+ set(oneValueArgs TARGET DESTINATION ALT_DESTINATION HEADER_TEMPLATE)
+ set(multiValueArgs FIDLS FIDL_DEPENDS)
+
+ cmake_parse_arguments(PARAMS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+ if(NOT IS_ABSOLUTE ${PARAMS_DESTINATION})
+ set(PARAMS_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${PARAMS_DESTINATION})
+ endif()
+
+ if(NOT IS_ABSOLUTE ${PARAMS_ALT_DESTINATION})
+ set(PARAMS_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${PARAMS_ALT_DESTINATION})
+ endif()
+ # check the cmake option, whether to use the generator or not ...
+ IF(NOT WITH_COMMON_API_GEN)
+ message(STATUS "Looking for available common-api generated files...")
+ # check which of the given folders exists and get it as destination
+ IF(EXISTS ${PARAMS_DESTINATION})
+ SEARCH_FOR_COMMON_API_GEN_FILES(${PARAMS_DESTINATION})
+ ELSE()
+ SEARCH_FOR_COMMON_API_GEN_FILES(${PARAMS_ALT_DESTINATION})
+ ENDIF()
+ ELSE()
+ message(STATUS "Will generate common-api files...")
+ if(NOT PARAMS_FIDLS)
+ message(FATAL_ERROR "FIDLS must be specified")
+ endif()
+
+ if(NOT PARAMS_TARGET)
+ message(FATAL_ERROR "TARGET must be specified")
+ endif()
+
+ if(PARAMS_DBUS)
+ list(APPEND ARGS -dbus)
+ endif()
+
+ if(PARAMS_HEADER_TEMPLATE)
+ list(APPEND ARGS -pref ${PARAMS_HEADER_TEMPLATE})
+ endif()
+
+ foreach(FIDL ${PARAMS_FIDLS})
+ get_filename_component(FIDL_PATH ${FIDL} ABSOLUTE)
+
+ # Run configure_file on the .fidl - this forces cmake to reexecute its
+ # configure phase if the input file changes.
+ string(MD5 ${FIDL_PATH} FIDL_CHECKSUM)
+ configure_file(${FIDL_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${FIDL_CHECKSUM}.fidl.done)
+
+ list(APPEND FIDLS ${FIDL_PATH})
+ endforeach()
+
+ message(STATUS "Determining list of generated files for ${PARAMS_FIDLS}")
+
+ foreach(FIDL_DEPEND ${PARAMS_FIDL_DEPENDS})
+ string(MD5 ${FIDL_PATH} FIDL_CHECKSUM)
+ configure_file(${FIDL_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${FIDL_CHECKSUM}.fidl.done)
+ endforeach()
+ GENERATE_FILES()
+ ENDIF()
+ endfunction()
+
+ENDIF(COMMON_API_FOUND AND COMMON_API_DBUS_FOUND)