* Support for automatically generation of common-api sources. Cmake macros adopted...
[profile/ivi/genivi/genivi-audio-manager.git] / cmake / CommonAPIGenerator.cmake
1 #
2 # Find common-api sources
3 #
4 # This module defines these variables:
5 #
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
12
13 include(CMakeParseArguments)
14
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)
18            
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)
26             
27             IF(CAPI_HEADERS_ERROR)
28                 MESSAGE(FATAL_ERROR "Can't find common-api generated headers!")
29             ENDIF()
30             string(REPLACE "\n" ";" CAPI_HEADERS ${_CAPI_HEADERS})
31             
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)
37             
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!")
47             ENDIF()
48             string(REPLACE "\n" ";" CAPI_SOURCES ${_CAPI_SOURCES})
49             LIST(REMOVE_DUPLICATES CAPI_SOURCES)
50                                
51             set(${PARAMS_TARGET}_GEN_HEADERS ${CAPI_HEADERS} PARENT_SCOPE)
52             set(${PARAMS_TARGET}_GEN_SOURCES ${CAPI_SOURCES} PARENT_SCOPE)
53                             
54             #add base path src-gen
55             SET(${PARAMS_TARGET}_GEN_INCLUDE_DIR ${CAPI_INCLUDES} ${GEN_DESTINATION} PARENT_SCOPE)   
56     endmacro()
57     
58     # generate common-api sources and retreive a list with them 
59     macro(GENERATE_FILES)    
60         # searching for common-api-generator executable ...
61         FIND_PATH(COMMONAPI_GENERATOR_JAR
62                       NAMES 
63                           "common-api-generator.jar"
64                       PATH_SUFFIXES 
65                           CommonAPI-${COMMON_API_VERSION}        
66                       PATHS
67                           "/usr/share" 
68                           "/usr/local/share")
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}")
76                 endwhile()
77     
78                file(MAKE_DIRECTORY ${TEMP_DESTINATION})
79     
80                set(${OUTVAR} ${TEMP_DESTINATION} PARENT_SCOPE)
81             endfunction()
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)
90             if(EXIT_CODE)
91                 message(FATAL_ERROR "Failed to generate files from FIDL:\n ${GENERATOR_OUTPUT}")
92             endif()
93             SET(TEMP_GEN_DST ${PARAMS_DESTINATION})
94         else()
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!")
98         endif()
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})
102     endmacro()
103     
104     function(COMMON_API_GENERATE_SOUCRES)
105         #parse the input parameters
106         set(options DBUS)
107         set(oneValueArgs TARGET DESTINATION ALT_DESTINATION HEADER_TEMPLATE)
108         set(multiValueArgs FIDLS FIDL_DEPENDS)
109
110         cmake_parse_arguments(PARAMS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
111         
112          if(NOT IS_ABSOLUTE ${PARAMS_DESTINATION})
113              set(PARAMS_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${PARAMS_DESTINATION})
114         endif()
115         
116         if(NOT IS_ABSOLUTE ${PARAMS_ALT_DESTINATION})
117              set(PARAMS_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${PARAMS_ALT_DESTINATION})
118         endif()
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})
125             ELSE()
126                 SEARCH_FOR_COMMON_API_GEN_FILES(${PARAMS_ALT_DESTINATION})
127             ENDIF()    
128         ELSE()
129             message(STATUS "Will generate common-api files...")
130             if(NOT PARAMS_FIDLS)
131                 message(FATAL_ERROR "FIDLS must be specified")
132             endif()
133         
134             if(NOT PARAMS_TARGET)
135                 message(FATAL_ERROR "TARGET must be specified")
136             endif()
137         
138             if(PARAMS_DBUS)
139                   list(APPEND ARGS -dbus)
140             endif()
141         
142             if(PARAMS_HEADER_TEMPLATE)
143                 list(APPEND ARGS -pref ${PARAMS_HEADER_TEMPLATE})
144             endif()
145             
146             foreach(FIDL ${PARAMS_FIDLS})
147                 get_filename_component(FIDL_PATH ${FIDL} ABSOLUTE)
148             
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)
153             
154                 list(APPEND FIDLS ${FIDL_PATH})
155             endforeach()
156             
157             message(STATUS "Determining list of generated files for ${PARAMS_FIDLS}")
158             
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)
162             endforeach()
163             GENERATE_FILES()
164         ENDIF()
165     endfunction()
166
167 ENDIF(COMMON_API_FOUND AND COMMON_API_DBUS_FOUND)