APPLINK-6324 HMI API BasicCommunication interface extension: OnFileRemoved
[profile/ivi/smartdevicelink.git] / CMakeLists.txt
1 # Copyright (c) 2013, Ford Motor Company
2 # All rights reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions are met:
6 #
7 # Redistributions of source code must retain the above copyright notice, this
8 # list of conditions and the following disclaimer.
9 #
10 # Redistributions in binary form must reproduce the above copyright notice,
11 # this list of conditions and the following
12 # disclaimer in the documentation and/or other materials provided with the
13 # distribution.
14 #
15 # Neither the name of the Ford Motor Company nor the names of its contributors
16 # may be used to endorse or promote products derived from this software
17 # without specific prior written permission.
18 #
19 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 # POSSIBILITY OF SUCH DAMAGE.
30
31 #Jenkins integration section
32 #dont modify this section if you dont know details about integration with Jenkins!!!
33 set (HMI "web" CACHE STRING "HMI type")
34 option(HMI2 "Use Qt HMI" OFF)
35 option(EXTENDED_MEDIA_MODE "Turn on and off extended Madia Manager features relates to PulseAudio A2DP and GSteamer" OFF)
36 option(BUILD_SHARED_LIBS "Build all libraries as shared (if ON) or static (if OFF)" OFF)
37 option(BUILD_BT_SUPPORT "Bluetooth support" ON)
38 option(BUILD_USB_SUPPORT "libusb support" ON)
39 option(BUILD_AVAHI_SUPPORT "libavahi support" ON)
40 option(BUILD_RWLOCK_SUPPORT "rwlocks support" OFF)
41 option(BUILD_BACKTRACE_SUPPORT "backtrace support" ON)
42 option(BUILD_TESTS "Possibility to build and run tests" OFF)
43 option(BUILD_TESTS_WITH_HMI "Possibility to build and run HMI tests" OFF)
44
45 set(OS_TYPE_OPTION      "$ENV{OS_TYPE}")
46 set(DEBUG_OPTION        "$ENV{DEBUG}")
47 set(HMI_TYPE_OPTION     "$ENV{HMI_TYPE}")
48 set(TARGET_OPTION       "$ENV{TARGET}")
49 set(MEDIA_MODE_OPTION   "$ENV{MEDIA_MODE}")
50 set(HMI_ADAPTER_OPTION  "$ENV{HMI_ADAPTER}")
51
52 if (OS_TYPE_OPTION)
53   if (${OS_TYPE_OPTION} STREQUAL "QNX")
54     message(STATUS "Jenkins integration: set build process for QNX")
55     INCLUDE("./qnx_6.5.0_linux_x86.cmake")
56     #tests are not supported yet for QNX build 
57     set (BUILD_TESTS OFF)
58   endif()
59 endif()
60
61 if (HMI_TYPE_OPTION)
62   if (${HMI_TYPE_OPTION} STREQUAL "HTML5")
63     message(STATUS "Jenkins integration: select HTML5 HMI")
64     set (HMI "web")
65   elseif (${HMI_TYPE_OPTION} STREQUAL "NONE")
66     message(STATUS "Jenkins integration: select HMI none")
67     set (HMI "no")
68   else ()
69     message(STATUS "Jenkins integration: select QML HMI none")
70     set (HMI "qt")
71   endif()
72 endif()
73
74 if (MEDIA_MODE_OPTION)
75   if (${MEDIA_MODE_OPTION} STREQUAL "EXTENDED_MEDIA")
76     message(STATUS "Jenkins integration: select extended media mode")
77     set (EXTENDED_MEDIA_MODE ON)
78   endif()
79 endif()
80
81 if (DEBUG_OPTION)
82   if (${DEBUG_OPTION} STREQUAL "DBG_OFF")
83     message(STATUS "Jenkins integration: build release version")
84     set (CMAKE_BUILD_TYPE Release)
85   endif()
86 endif()
87
88 if (HMI_ADAPTER_OPTION)
89   if (${HMI_ADAPTER_OPTION} STREQUAL "MESSAGEBROKER")
90     message(STATUS "Jenkins integration: selected HMI adapter MESSAGEBROKER")
91     set (HMIADAPTER "messagebroker")
92   elseif (${HMI_ADAPTER_OPTION} STREQUAL "DBUS")
93     message(STATUS "Jenkins integration: selected HMI adapter DBUS")
94     set (HMIADAPTER "dbus")
95   elseif (${HMI_ADAPTER_OPTION} STREQUAL "MQUEUE")
96     message(STATUS "Jenkins integration: selected HMI adapter MQUEUE")
97     set (HMIADAPTER "mqueue")
98   endif()
99 endif()
100
101 #Jenkins integration section end
102
103
104 cmake_minimum_required(VERSION 2.8.0)
105
106 set (PROJECT smartDeviceLinkCore)
107 project (${PROJECT})
108
109 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
110
111 # Please do not change compiler/linker flags if You do not know how particular
112 # flag is handled by CMake
113 set(CMAKE_INSTALL_PREFIX .)
114 set(ARCHIVE_OUTPUT_DIRECTORY ./bin)
115 set(CMAKE_CXX_FLAGS "-g3 -ggdb3 -std=gnu++0x -Werror=return-type -Wuninitialized --coverage")
116 set(CMAKE_CXX_FLAGS_RELEASE "-s -O2") #It will be appended to CMAKE_CXX_FLAGS in release
117
118 if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
119   add_definitions(-DOS_LINUX)
120 elseif(CMAKE_SYSTEM_NAME STREQUAL "QNX")
121   add_definitions(-DOS_QNX)
122   SET(BUILD_BT_SUPPORT OFF)
123   SET(BUILD_AVAHI_SUPPORT OFF)
124   SET(BUILD_BACKTRACE_SUPPORT OFF)
125   SET(EXTENDED_MEDIA_MODE OFF)
126 endif()
127
128 if (BUILD_USB_SUPPORT)
129   add_definitions(-DUSB_SUPPORT)
130 endif()
131
132 if (BUILD_BT_SUPPORT)
133   add_definitions(-DBLUETOOTH_SUPPORT)
134 endif()
135
136 if (BUILD_AVAHI_SUPPORT)
137   add_definitions(-DAVAHI_SUPPORT)
138 # --- Check libavahi-common, libavahi-client availability
139   find_package(Libavahi)
140 endif()
141
142 if (BUILD_RWLOCK_SUPPORT)
143   add_definitions(-DRWLOCK_SUPPORT)
144 endif()
145
146 if (BUILD_BACKTRACE_SUPPORT)
147   add_definitions(-DBACKTRACE_SUPPORT)
148 endif()
149
150 # TODO(AK): check current OS here
151 add_definitions(-DOS_POSIX)
152
153 IF(CMAKE_C_FLAGS_DEBUG)
154     SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDEBUG" )
155     add_definitions(-DDEBUG)
156 ELSE (CMAKE_C_FLAGS_DEBUG)
157     SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRELEASE" )
158     add_definitions(-DRELEASE)
159 ENDIF(CMAKE_C_FLAGS_DEBUG)
160
161
162 if (EXTENDED_MEDIA_MODE)
163 add_definitions(-DEXTENDED_MEDIA_MODE)
164 # required to find 'glibconfig.h'
165 find_package(PkgConfig)
166 pkg_check_modules(GLIB2 REQUIRED glib-2.0)
167 add_definitions(${GLIB2_CFLAGS})
168 endif()
169
170 # --- Interface generator
171
172 find_package(PythonInterp)
173 if(NOT PYTHONINTERP_FOUND)
174     message(ERROR "Python interpreter is not found")
175     message(ERROR "To install it type in the command line:")
176     message(ERROR "sudo apt-get install python")
177 endif(NOT PYTHONINTERP_FOUND)
178
179 if (HMI STREQUAL "qt")
180     cmake_minimum_required(VERSION 2.8.11)
181     if (CMAKE_SYSTEM_NAME STREQUAL "QNX")
182         set(qt_version "4.8.5")
183     else ()
184         set(qt_version "5.1.0")
185     endif ()
186
187     execute_process(
188         COMMAND ${CMAKE_SOURCE_DIR}/FindQt.sh -v ${qt_version}
189             OUTPUT_VARIABLE qt_bin_dir
190     )
191     message(STATUS "Binary directory Qt ${qt_version} is ${qt_bin_dir}")
192     set(ENV{PATH} ${qt_bin_dir}:$ENV{PATH})
193
194     if (CMAKE_SYSTEM_NAME STREQUAL "QNX")
195         find_package(Qt4 ${qt_version} REQUIRED QtCore QtGui QtDBus QtDeclarative)
196     else ()
197         find_package(Qt5Core REQUIRED)
198         find_package(Qt5DBus REQUIRED)
199         find_package(Qt5Qml REQUIRED)
200         find_package(Qt5Quick REQUIRED)
201         set(qmlplugindump_binary ${qt_bin_dir}/qmlplugindump)
202     endif ()
203 endif()
204
205 set(INTEFRACE_GENERATOR "${PROJECT_SOURCE_DIR}/tools/InterfaceGenerator/Generator.py")
206 set(INTEFRACE_GENERATOR_CMD ${PYTHON_EXECUTABLE} -B ${INTEFRACE_GENERATOR})
207 file(GLOB_RECURSE INTERFACE_GENERATOR_DEPENDENCIES "${PROJECT_SOURCE_DIR}/tools/InterfaceGenerator/*.*")
208
209 macro (GenerateInterface arg_xml_name arg_namespace parser_type)
210     string(REGEX MATCH "^[a-zA-Z_0-9]*[^.]" file_name ${arg_xml_name})     # TODO: make expression more robust
211
212     set(hpp_file
213       "${CMAKE_CURRENT_BINARY_DIR}/${file_name}.h"
214       "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.h"
215     )
216
217     set(cpp_file "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.cc")
218     set(full_xml_name "${CMAKE_CURRENT_SOURCE_DIR}/${arg_xml_name}")
219
220     add_custom_command( OUTPUT ${hpp_file} ${cpp_file}
221                         COMMAND ${INTEFRACE_GENERATOR_CMD} ${full_xml_name} ${arg_namespace} ${CMAKE_CURRENT_BINARY_DIR} "--parser-type" "${parser_type}"
222                         DEPENDS ${INTERFACE_GENERATOR_DEPENDENCIES} ${full_xml_name}
223                         COMMENT "Generating files:\n   ${hpp_file}\n   ${cpp_file}\nfrom:\n   ${arg_xml_name} ..."
224                         VERBATIM
225                        )
226
227     include_directories (
228         ../../../src/components/smart_objects/include
229         ../../../src/components/formatters/include/
230         ${CMAKE_SOURCE_DIR}/src/components/formatters/include/
231         ${CMAKE_BINARY_DIR}
232     )
233
234     add_library("${file_name}" ${cpp_file})
235 endmacro(GenerateInterface)
236
237 # --- Useful macro
238 macro(create_test NAME SOURCES LIBS)
239     add_executable("${NAME}" ${SOURCES})
240     target_link_libraries("${NAME}" ${LIBS})
241     if(CMAKE_SYSTEM_NAME STREQUAL "QNX")
242         add_test(${NAME} ${CMAKE_SOURCE_DIR}/qnx/remote_run_test.sh ${NAME})
243     else()
244         add_test(${NAME} ${NAME})
245     endif()
246 endmacro(create_test)
247
248 # Building application
249
250 # --- Type HMI
251 if (HMI STREQUAL "qt")
252     set(QT_HMI ON)
253     add_definitions(-DQT_HMI)
254 elseif (HMI STREQUAL "web")
255     set(WEB_HMI ON)
256     add_definitions(-DWEB_HMI)
257 else ()
258     set(HMI "no")
259     add_definitions(-DNO_HMI)
260 endif ()
261
262 if (HMI STREQUAL "qt" AND NOT DEFINED HMIADAPTER) 
263     set(HMIADAPTER "dbus")
264 endif()
265 if (HMI STREQUAL "web" AND NOT DEFINED HMIADAPTER) 
266     set(HMIADAPTER "messagebroker")
267 endif()
268 if (HMI STREQUAL "no" AND NOT DEFINED HMIADAPTER) 
269     set(HMIADAPTER "mqueue")
270 endif()
271
272 if (HMIADAPTER STREQUAL "dbus")
273     set(HMI_DBUS_API ON)
274     add_definitions(-DDBUS_HMIADAPTER)
275     add_definitions(-DHMI_DBUS_API)
276 endif()
277 if (HMIADAPTER STREQUAL "messagebroker")
278     set(HMI_JSON_API ON)
279     add_definitions(-DMESSAGEBROKER_HMIADAPTER)
280     add_definitions(-DHMI_JSON_API)
281 endif()
282 if (HMIADAPTER STREQUAL "mqueue")
283     set(HMI_JSON_API ON)
284     add_definitions(-DMQUEUE_HMIADAPTER)
285     add_definitions(-DHMI_JSON_API)
286 endif()
287
288 # --- ThirdPartyLibs
289 add_subdirectory(./src/thirdPartyLibs)
290
291 # --- Tools
292 add_subdirectory(./tools)
293
294 # --- Components
295 add_subdirectory(./src/components)
296
297 # --- Main application
298 add_subdirectory(./src/appMain)
299
300 # Building tests
301 if(BUILD_TESTS)
302     if(BUILD_TESTS_WITH_HMI)
303       add_definitions(-DTESTS_WITH_HMI)
304     endif()
305     enable_testing()
306     include(Dart)
307     # Framework GoogleTest is also integrated together gmock
308     # and must not be added separately
309     add_subdirectory(./src/thirdPartyLibs/gmock-1.6.0)
310     add_subdirectory(./test)
311 endif()
312
313 # Building documentation
314
315 # At first creating directory for generated documentation. Unfortunately doxygen
316 # cannot generate it byself
317 FIND_PACKAGE(Doxygen)
318   IF(DOXYGEN_FOUND)
319     option(DOXYGEN_ENABLE_DIAGRAMS "Enable graphical diagram generation" ON)
320
321     if(DOXYGEN_ENABLE_DIAGRAMS)
322       set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "YES")
323     else(DOXYGEN_ENABLE_DIAGRAMS)
324       set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "NO")
325     endif()
326     configure_file("${PROJECT_SOURCE_DIR}/Doxyfile" "${PROJECT_BINARY_DIR}/Doxyfile")
327     file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/doc/doxygen")
328     ADD_CUSTOM_TARGET(doxygen COMMAND ${DOXYGEN_EXECUTABLE} "${PROJECT_BINARY_DIR}/Doxyfile")
329   ELSE(DOXYGEN_FOUND)
330     MESSAGE(STATUS "Doxygen not found. Documentation will not be generated")
331     MESSAGE(STATUS "To enable documentation generation please install doxygen and graphviz packages")
332     MESSAGE(STATUS "sudo apt-get install doxygen graphviz")
333     MESSAGE(STATUS "To enable processing of MscGen comments please install mscgen")
334     MESSAGE(STATUS "sudo apt-get install mscgen")
335 ENDIF(DOXYGEN_FOUND)
336
337