2 # Find common-api sources
4 # This module defines these variables:
6 # ${PARAMS_TARGET}_GEN_HEADERS
7 # A list with generated headers
8 # ${PARAMS_TARGET}_GEN_SOURCES
9 # A list with generated sources
10 # ${PARAMS_TARGET}_GEN_INCLUDE_DIR
11 # A list with include directories
13 include(CMakeParseArguments)
15 IF(COMMON_API_FOUND AND COMMON_API_DBUS_FOUND)
16 # get lists with headers and sources after they has been generated
17 macro(SEARCH_FOR_COMMON_API_GEN_FILES GEN_DESTINATION)
19 #searching for generated headers
20 execute_process(COMMAND find ${GEN_DESTINATION} -name *.h
21 RESULT_VARIABLE EXIT_CODE
22 OUTPUT_VARIABLE _CAPI_HEADERS
23 ERROR_VARIABLE CAPI_HEADERS_ERROR
24 OUTPUT_STRIP_TRAILING_WHITESPACE
25 ERROR_STRIP_TRAILING_WHITESPACE)
27 IF(CAPI_HEADERS_ERROR)
28 MESSAGE(FATAL_ERROR "Can't find common-api generated headers!")
30 string(REPLACE "\n" ";" CAPI_HEADERS ${_CAPI_HEADERS})
32 FOREACH(INCLUDE_ITER ${CAPI_HEADERS})
33 GET_FILENAME_COMPONENT(TEMP_PATH ${INCLUDE_ITER} PATH)
34 SET(CAPI_INCLUDES ${CAPI_INCLUDES} ${TEMP_PATH})
35 ENDFOREACH(INCLUDE_ITER ${CAPI_HEADERS})
36 LIST(REMOVE_DUPLICATES CAPI_INCLUDES)
38 #searching for generated sources
39 execute_process(COMMAND find ${GEN_DESTINATION} -name *.cpp
40 RESULT_VARIABLE EXIT_CODE
41 OUTPUT_VARIABLE _CAPI_SOURCES
42 ERROR_VARIABLE CAPI_SOURCES_ERROR
43 OUTPUT_STRIP_TRAILING_WHITESPACE
44 ERROR_STRIP_TRAILING_WHITESPACE)
45 IF(CAPI_SOURCES_ERROR)
46 MESSAGE(FATAL_ERROR "Can't find common-api generated sources!")
48 string(REPLACE "\n" ";" CAPI_SOURCES ${_CAPI_SOURCES})
49 LIST(REMOVE_DUPLICATES CAPI_SOURCES)
51 set(${PARAMS_TARGET}_GEN_HEADERS ${CAPI_HEADERS} PARENT_SCOPE)
52 set(${PARAMS_TARGET}_GEN_SOURCES ${CAPI_SOURCES} PARENT_SCOPE)
54 #add base path src-gen
55 SET(${PARAMS_TARGET}_GEN_INCLUDE_DIR ${CAPI_INCLUDES} ${GEN_DESTINATION} PARENT_SCOPE)
58 # generate common-api sources and retreive a list with them
60 # searching for common-api-generator executable ...
61 FIND_PATH(COMMONAPI_GENERATOR_JAR
63 "common-api-generator.jar"
65 CommonAPI-${COMMON_API_VERSION}
69 if(COMMONAPI_GENERATOR_JAR)
70 # load java runtime ...
71 find_package(Java COMPONENTS Runtime REQUIRED QUIET)
72 function(mktmpdir OUTVAR)
73 while(NOT TEMP_DESTINATION OR EXISTS ${TEMP_DESTINATION})
74 string(RANDOM LENGTH 16 TEMP_DESTINATION)
75 set(TEMP_DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/${TEMP_DESTINATION}")
78 file(MAKE_DIRECTORY ${TEMP_DESTINATION})
80 set(${OUTVAR} ${TEMP_DESTINATION} PARENT_SCOPE)
82 # execute the generate command ...
83 execute_process(COMMAND ${Java_JAVA_EXECUTABLE} -jar "${COMMONAPI_GENERATOR_JAR}/common-api-generator.jar" -dest ${PARAMS_DESTINATION} ${ARGS} ${FIDLS}
84 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
85 RESULT_VARIABLE EXIT_CODE
86 OUTPUT_VARIABLE GENERATOR_OUTPUT
87 ERROR_VARIABLE GENERATOR_OUTPUT
88 OUTPUT_STRIP_TRAILING_WHITESPACE
89 ERROR_STRIP_TRAILING_WHITESPACE)
91 message(FATAL_ERROR "Failed to generate files from FIDL:\n ${GENERATOR_OUTPUT}")
93 SET(TEMP_GEN_DST ${PARAMS_DESTINATION})
95 # if the generator is not found, try to find the sources in the alternative folder
96 SET(TEMP_GEN_DST ${PARAMS_ALT_DESTINATION})
97 message(STATUS "Couldn't find a common-api generator...skiping generation!")
99 # get the lists with the sources and headers
100 message(STATUS "Looking for available common-api generated files...")
101 SEARCH_FOR_COMMON_API_GEN_FILES(${TEMP_GEN_DST})
104 function(COMMON_API_GENERATE_SOUCRES)
105 #parse the input parameters
107 set(oneValueArgs TARGET DESTINATION ALT_DESTINATION HEADER_TEMPLATE)
108 set(multiValueArgs FIDLS FIDL_DEPENDS)
110 cmake_parse_arguments(PARAMS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
112 if(NOT IS_ABSOLUTE ${PARAMS_DESTINATION})
113 set(PARAMS_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${PARAMS_DESTINATION})
116 if(NOT IS_ABSOLUTE ${PARAMS_ALT_DESTINATION})
117 set(PARAMS_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${PARAMS_ALT_DESTINATION})
119 # check the cmake option, whether to use the generator or not ...
120 IF(NOT WITH_COMMON_API_GEN)
121 message(STATUS "Looking for available common-api generated files...")
122 # check which of the given folders exists and get it as destination
123 IF(EXISTS ${PARAMS_DESTINATION})
124 SEARCH_FOR_COMMON_API_GEN_FILES(${PARAMS_DESTINATION})
126 SEARCH_FOR_COMMON_API_GEN_FILES(${PARAMS_ALT_DESTINATION})
129 message(STATUS "Will generate common-api files...")
131 message(FATAL_ERROR "FIDLS must be specified")
134 if(NOT PARAMS_TARGET)
135 message(FATAL_ERROR "TARGET must be specified")
139 list(APPEND ARGS -dbus)
142 if(PARAMS_HEADER_TEMPLATE)
143 list(APPEND ARGS -pref ${PARAMS_HEADER_TEMPLATE})
146 foreach(FIDL ${PARAMS_FIDLS})
147 get_filename_component(FIDL_PATH ${FIDL} ABSOLUTE)
149 # Run configure_file on the .fidl - this forces cmake to reexecute its
150 # configure phase if the input file changes.
151 string(MD5 ${FIDL_PATH} FIDL_CHECKSUM)
152 configure_file(${FIDL_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${FIDL_CHECKSUM}.fidl.done)
154 list(APPEND FIDLS ${FIDL_PATH})
157 message(STATUS "Determining list of generated files for ${PARAMS_FIDLS}")
159 foreach(FIDL_DEPEND ${PARAMS_FIDL_DEPENDS})
160 string(MD5 ${FIDL_PATH} FIDL_CHECKSUM)
161 configure_file(${FIDL_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${FIDL_CHECKSUM}.fidl.done)
167 ENDIF(COMMON_API_FOUND AND COMMON_API_DBUS_FOUND)