APPLINK-6580: OnSystemRequest with extended API
[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 GStreamer" 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 option(ENABLE_LOG "Logging feature" ON)
45 option(EXTENDED_POLICY_FLAG "Build with specific features and extended functionality" OFF)
46
47 set(OS_TYPE_OPTION      "$ENV{OS_TYPE}")
48 set(DEBUG_OPTION        "$ENV{DEBUG}")
49 set(HMI_TYPE_OPTION     "$ENV{HMI_TYPE}")
50 set(TARGET_OPTION       "$ENV{TARGET}")
51 set(MEDIA_MODE_OPTION   "$ENV{MEDIA_MODE}")
52 set(HMI_ADAPTER_OPTION  "$ENV{HMI_ADAPTER}")
53
54 if (OS_TYPE_OPTION)
55   if (${OS_TYPE_OPTION} STREQUAL "QNX")
56     message(STATUS "Jenkins integration: set build process for QNX")
57     INCLUDE("./qnx_6.5.0_linux_x86.cmake")
58     #tests are not supported yet for QNX build 
59     set (BUILD_TESTS OFF)
60   endif()
61 endif()
62
63 if (HMI_TYPE_OPTION)
64   if (${HMI_TYPE_OPTION} STREQUAL "HTML5")
65     message(STATUS "Jenkins integration: select HTML5 HMI")
66     set (HMI "web")
67   elseif (${HMI_TYPE_OPTION} STREQUAL "NONE")
68     message(STATUS "Jenkins integration: select HMI none")
69     set (HMI "no")
70   else ()
71     message(STATUS "Jenkins integration: select QML HMI none")
72     set (HMI "qt")
73   endif()
74 endif()
75
76 if (MEDIA_MODE_OPTION)
77   if (${MEDIA_MODE_OPTION} STREQUAL "EXTENDED_MEDIA")
78     message(STATUS "Jenkins integration: select extended media mode")
79     set (EXTENDED_MEDIA_MODE ON)
80   endif()
81 endif()
82
83 if (DEBUG_OPTION)
84   if (${DEBUG_OPTION} STREQUAL "DBG_OFF")
85     message(STATUS "Jenkins integration: build release version")
86     set (CMAKE_BUILD_TYPE Release)
87   endif()
88 endif()
89
90 if (HMI_ADAPTER_OPTION)
91   if (${HMI_ADAPTER_OPTION} STREQUAL "MESSAGEBROKER")
92     message(STATUS "Jenkins integration: selected HMI adapter MESSAGEBROKER")
93     set (HMIADAPTER "messagebroker")
94   elseif (${HMI_ADAPTER_OPTION} STREQUAL "DBUS")
95     message(STATUS "Jenkins integration: selected HMI adapter DBUS")
96     set (HMIADAPTER "dbus")
97   elseif (${HMI_ADAPTER_OPTION} STREQUAL "MQUEUE")
98     message(STATUS "Jenkins integration: selected HMI adapter MQUEUE")
99     set (HMIADAPTER "mqueue")
100   endif()
101 endif()
102
103 #Jenkins integration section end
104
105
106 cmake_minimum_required(VERSION 2.8.0)
107
108 set (PROJECT smartDeviceLinkCore)
109 project (${PROJECT})
110
111 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
112
113 # Please do not change compiler/linker flags if You do not know how particular
114 # flag is handled by CMake
115 set(CMAKE_INSTALL_PREFIX .)
116 set(ARCHIVE_OUTPUT_DIRECTORY ./bin)
117 set(CMAKE_CXX_FLAGS "-g3 -ggdb3 -std=gnu++0x -Werror=return-type -Wuninitialized --coverage")
118 set(CMAKE_CXX_FLAGS_RELEASE "-s -O2") #It will be appended to CMAKE_CXX_FLAGS in release
119
120 if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
121   add_definitions(-DOS_LINUX)
122 elseif(CMAKE_SYSTEM_NAME STREQUAL "QNX")
123   add_definitions(-DOS_QNX)
124   SET(BUILD_BT_SUPPORT OFF)
125   SET(BUILD_AVAHI_SUPPORT OFF)
126   SET(BUILD_BACKTRACE_SUPPORT OFF)
127   SET(EXTENDED_MEDIA_MODE OFF)
128 endif()
129
130 if (BUILD_USB_SUPPORT)
131   add_definitions(-DUSB_SUPPORT)
132 endif()
133
134 if (BUILD_BT_SUPPORT)
135   add_definitions(-DBLUETOOTH_SUPPORT)
136 endif()
137
138 if (BUILD_AVAHI_SUPPORT)
139   add_definitions(-DAVAHI_SUPPORT)
140 # --- Check libavahi-common, libavahi-client availability
141   find_package(Libavahi)
142 endif()
143
144 if (BUILD_RWLOCK_SUPPORT)
145   add_definitions(-DRWLOCK_SUPPORT)
146 endif()
147
148 if (BUILD_BACKTRACE_SUPPORT)
149   add_definitions(-DBACKTRACE_SUPPORT)
150 endif()
151
152 if (ENABLE_LOG)
153   add_definitions(-DENABLE_LOG)
154 endif()
155
156 # TODO(AK): check current OS here
157 add_definitions(-DOS_POSIX)
158
159 # FIXME(DC): weird logic
160 IF(CMAKE_C_FLAGS_DEBUG)
161     SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDEBUG" )
162     add_definitions(-DDEBUG)
163 ELSE (CMAKE_C_FLAGS_DEBUG)
164     SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRELEASE" )
165     add_definitions(-DRELEASE)
166 ENDIF(CMAKE_C_FLAGS_DEBUG)
167
168
169 if (EXTENDED_MEDIA_MODE)
170 add_definitions(-DEXTENDED_MEDIA_MODE)
171 # required to find 'glibconfig.h'
172 find_package(PkgConfig)
173 pkg_check_modules(GLIB2 REQUIRED glib-2.0)
174 add_definitions(${GLIB2_CFLAGS})
175 endif()
176
177 # --- Interface generator
178
179 find_package(PythonInterp)
180 if(NOT PYTHONINTERP_FOUND)
181     message(ERROR "Python interpreter is not found")
182     message(ERROR "To install it type in the command line:")
183     message(ERROR "sudo apt-get install python")
184 endif(NOT PYTHONINTERP_FOUND)
185
186 if (HMI STREQUAL "qt")
187     cmake_minimum_required(VERSION 2.8.11)
188     if (CMAKE_SYSTEM_NAME STREQUAL "QNX")
189         set(qt_version "4.8.5")
190     else ()
191         set(qt_version "5.1.0")
192     endif ()
193
194     execute_process(
195         COMMAND ${CMAKE_SOURCE_DIR}/FindQt.sh -v ${qt_version}
196             OUTPUT_VARIABLE qt_bin_dir
197     )
198     message(STATUS "Binary directory Qt ${qt_version} is ${qt_bin_dir}")
199     set(ENV{PATH} ${qt_bin_dir}:$ENV{PATH})
200
201     if (CMAKE_SYSTEM_NAME STREQUAL "QNX")
202         find_package(Qt4 ${qt_version} REQUIRED QtCore QtGui QtDBus QtDeclarative)
203     else ()
204         find_package(Qt5Core REQUIRED)
205         find_package(Qt5DBus REQUIRED)
206         find_package(Qt5Qml REQUIRED)
207         find_package(Qt5Quick REQUIRED)
208         set(qmlplugindump_binary ${qt_bin_dir}/qmlplugindump)
209     endif ()
210 endif()
211
212 set(INTEFRACE_GENERATOR "${PROJECT_SOURCE_DIR}/tools/InterfaceGenerator/Generator.py")
213 set(INTEFRACE_GENERATOR_CMD ${PYTHON_EXECUTABLE} -B ${INTEFRACE_GENERATOR})
214 file(GLOB_RECURSE INTERFACE_GENERATOR_DEPENDENCIES "${PROJECT_SOURCE_DIR}/tools/InterfaceGenerator/*.*")
215
216 macro (GenerateInterface arg_xml_name arg_namespace parser_type)
217     string(REGEX MATCH "^[a-zA-Z_0-9]*[^.]" file_name ${arg_xml_name})     # TODO: make expression more robust
218
219     set(hpp_file
220       "${CMAKE_CURRENT_BINARY_DIR}/${file_name}.h"
221       "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.h"
222     )
223
224     set(cpp_file "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.cc")
225     set(full_xml_name "${CMAKE_CURRENT_SOURCE_DIR}/${arg_xml_name}")
226
227     add_custom_command( OUTPUT ${hpp_file} ${cpp_file}
228                         COMMAND ${INTEFRACE_GENERATOR_CMD} ${full_xml_name} ${arg_namespace} ${CMAKE_CURRENT_BINARY_DIR} "--parser-type" "${parser_type}"
229                         DEPENDS ${INTERFACE_GENERATOR_DEPENDENCIES} ${full_xml_name}
230                         COMMENT "Generating files:\n   ${hpp_file}\n   ${cpp_file}\nfrom:\n   ${arg_xml_name} ..."
231                         VERBATIM
232                        )
233
234     include_directories (
235         ../../../src/components/smart_objects/include
236         ../../../src/components/formatters/include/
237         ${CMAKE_SOURCE_DIR}/src/components/formatters/include/
238         ${CMAKE_BINARY_DIR}
239     )
240
241     add_library("${file_name}" ${cpp_file})
242 endmacro(GenerateInterface)
243
244 # --- Useful macro
245 macro(create_test NAME SOURCES LIBS)
246     add_executable("${NAME}" ${SOURCES})
247     target_link_libraries("${NAME}" ${LIBS})
248     if(CMAKE_SYSTEM_NAME STREQUAL "QNX")
249         add_test(${NAME} ${CMAKE_SOURCE_DIR}/qnx/remote_run_test.sh ${NAME})
250     else()
251         add_test(${NAME} ${NAME})
252     endif()
253 endmacro(create_test)
254
255 # Building application
256
257 # --- Type HMI
258 if (HMI STREQUAL "qt")
259     set(QT_HMI ON)
260     add_definitions(-DQT_HMI)
261 elseif (HMI STREQUAL "web")
262     set(WEB_HMI ON)
263     add_definitions(-DWEB_HMI)
264 else ()
265     set(HMI "no")
266     add_definitions(-DNO_HMI)
267 endif ()
268
269 if (HMI STREQUAL "qt" AND NOT DEFINED HMIADAPTER) 
270     set(HMIADAPTER "dbus")
271 endif()
272 if (HMI STREQUAL "web" AND NOT DEFINED HMIADAPTER) 
273     set(HMIADAPTER "messagebroker")
274 endif()
275 if (HMI STREQUAL "no" AND NOT DEFINED HMIADAPTER) 
276     set(HMIADAPTER "mqueue")
277 endif()
278
279 if (HMIADAPTER STREQUAL "dbus")
280     set(HMI_DBUS_API ON)
281     add_definitions(-DDBUS_HMIADAPTER)
282     add_definitions(-DHMI_DBUS_API)
283 endif()
284 if (HMIADAPTER STREQUAL "messagebroker")
285     set(HMI_JSON_API ON)
286     add_definitions(-DMESSAGEBROKER_HMIADAPTER)
287     add_definitions(-DHMI_JSON_API)
288 endif()
289 if (HMIADAPTER STREQUAL "mqueue")
290     set(HMI_JSON_API ON)
291     add_definitions(-DMQUEUE_HMIADAPTER)
292     add_definitions(-DHMI_JSON_API)
293 endif()
294
295 # --- ThirdPartyLibs
296 add_subdirectory(./src/thirdPartyLibs)
297
298 # --- Tools
299 add_subdirectory(./tools)
300
301 # --- Components
302 add_subdirectory(./src/components)
303
304 # --- Main application
305 add_subdirectory(./src/appMain)
306
307 # Building tests
308 if(BUILD_TESTS)
309     if(BUILD_TESTS_WITH_HMI)
310       add_definitions(-DTESTS_WITH_HMI)
311     endif()
312     enable_testing()
313     include(Dart)
314     # Framework GoogleTest is also integrated together gmock
315     # and must not be added separately
316     add_subdirectory(./src/thirdPartyLibs/gmock-1.6.0)
317     add_subdirectory(./test)
318 endif()
319
320 # Building documentation
321
322 # At first creating directory for generated documentation. Unfortunately doxygen
323 # cannot generate it byself
324 FIND_PACKAGE(Doxygen)
325   IF(DOXYGEN_FOUND)
326     option(DOXYGEN_ENABLE_DIAGRAMS "Enable graphical diagram generation" ON)
327
328     if(DOXYGEN_ENABLE_DIAGRAMS)
329       set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "YES")
330     else(DOXYGEN_ENABLE_DIAGRAMS)
331       set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "NO")
332     endif()
333     configure_file("${PROJECT_SOURCE_DIR}/Doxyfile" "${PROJECT_BINARY_DIR}/Doxyfile")
334     file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/doc/doxygen")
335     ADD_CUSTOM_TARGET(doxygen COMMAND ${DOXYGEN_EXECUTABLE} "${PROJECT_BINARY_DIR}/Doxyfile")
336   ELSE(DOXYGEN_FOUND)
337     MESSAGE(STATUS "Doxygen not found. Documentation will not be generated")
338     MESSAGE(STATUS "To enable documentation generation please install doxygen and graphviz packages")
339     MESSAGE(STATUS "sudo apt-get install doxygen graphviz")
340     MESSAGE(STATUS "To enable processing of MscGen comments please install mscgen")
341     MESSAGE(STATUS "sudo apt-get install mscgen")
342 ENDIF(DOXYGEN_FOUND)
343
344