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