1 # Copyright (c) 2013, Ford Motor Company
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions are met:
7 # Redistributions of source code must retain the above copyright notice, this
8 # list of conditions and the following disclaimer.
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
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.
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.
31 cmake_minimum_required(VERSION 2.8.0)
33 set (PROJECT smartDeviceLinkCore)
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)
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}")
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
73 if (${HMI_TYPE_OPTION} STREQUAL "HTML5")
74 message(STATUS "Jenkins integration: select HTML5 HMI")
76 elseif (${HMI_TYPE_OPTION} STREQUAL "NONE")
77 message(STATUS "Jenkins integration: select HMI none")
80 message(STATUS "Jenkins integration: select QML HMI none")
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)
93 if (${DEBUG_OPTION} STREQUAL "DBG_OFF")
94 message(STATUS "Jenkins integration: build release version")
95 set (CMAKE_BUILD_TYPE Release)
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")
112 if (ENABLE_LOG_OPTION)
113 if (${ENABLE_LOG_OPTION} STREQUAL "LOG_OFF")
114 message(STATUS "Jenkins integration: Log is turned off")
119 #Jenkins integration section end
121 # This command must be here after Jenkins integration section
124 #ADD_DEPENDENCIES(${PROJECT} Policy)
126 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
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")
134 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
135 add_definitions(-DGCOV_ENABLED)
137 set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -s -O2") #It will be appended to CMAKE_CXX_FLAGS in release
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)
149 if (BUILD_USB_SUPPORT)
150 add_definitions(-DUSB_SUPPORT)
153 if (BUILD_BT_SUPPORT)
154 add_definitions(-DBLUETOOTH_SUPPORT)
157 if (BUILD_MME_SUPPORT)
158 add_definitions(-DMME_SUPPORT)
160 add_definitions(-DMME_MQ)
162 endif(BUILD_MME_SUPPORT)
164 if (BUILD_AVAHI_SUPPORT)
165 add_definitions(-DAVAHI_SUPPORT)
166 # --- Check libavahi-common, libavahi-client availability
167 find_package(Libavahi)
170 if (BUILD_RWLOCK_SUPPORT)
171 add_definitions(-DRWLOCK_SUPPORT)
174 if (BUILD_BACKTRACE_SUPPORT)
175 add_definitions(-DBACKTRACE_SUPPORT)
179 add_definitions(-DENABLE_LOG)
183 add_definitions(-DTIME_TESTER)
186 # TODO(AK): check current OS here
187 add_definitions(-DOS_POSIX)
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)
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})
207 # --- Interface generator
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)
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")
221 set(qt_version "5.1.0")
225 COMMAND ${CMAKE_SOURCE_DIR}/FindQt.sh -v ${qt_version}
226 OUTPUT_VARIABLE qt_bin_dir
228 message(STATUS "Binary directory Qt ${qt_version} is ${qt_bin_dir}")
229 set(ENV{PATH} ${qt_bin_dir}:$ENV{PATH})
231 if (CMAKE_SYSTEM_NAME STREQUAL "QNX")
232 find_package(Qt4 ${qt_version} REQUIRED QtCore QtGui QtDBus QtDeclarative)
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)
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/*.*")
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
250 "${CMAKE_CURRENT_BINARY_DIR}/${file_name}.h"
251 "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.h"
254 set(cpp_file "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.cc")
255 set(full_xml_name "${CMAKE_CURRENT_SOURCE_DIR}/${arg_xml_name}")
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} ..."
264 include_directories (
265 ../../../src/components/smart_objects/include
266 ../../../src/components/formatters/include/
267 ${CMAKE_SOURCE_DIR}/src/components/formatters/include/
271 add_library("${file_name}" ${cpp_file})
272 endmacro(GenerateInterface)
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})
281 add_test(${NAME} ${NAME})
283 endmacro(create_test)
285 # Building application
288 if (HMI STREQUAL "qt")
290 add_definitions(-DQT_HMI)
291 elseif (HMI STREQUAL "web")
293 add_definitions(-DWEB_HMI)
296 add_definitions(-DNO_HMI)
299 if (HMI STREQUAL "qt" AND NOT DEFINED HMIADAPTER)
300 set(HMIADAPTER "dbus")
302 if (HMI STREQUAL "web" AND NOT DEFINED HMIADAPTER)
303 set(HMIADAPTER "messagebroker")
305 if (HMI STREQUAL "no" AND NOT DEFINED HMIADAPTER)
306 set(HMIADAPTER "mqueue")
309 if (HMIADAPTER STREQUAL "dbus")
311 add_definitions(-DDBUS_HMIADAPTER)
312 add_definitions(-DHMI_DBUS_API)
314 if (HMIADAPTER STREQUAL "messagebroker")
316 add_definitions(-DMESSAGEBROKER_HMIADAPTER)
317 add_definitions(-DHMI_JSON_API)
319 if (HMIADAPTER STREQUAL "mqueue")
321 add_definitions(-DMQUEUE_HMIADAPTER)
322 add_definitions(-DHMI_JSON_API)
326 add_subdirectory(./src/thirdPartyLibs)
329 add_subdirectory(./tools)
332 add_subdirectory(./src/components)
334 # --- Main application
335 add_subdirectory(./src/appMain)
339 if(BUILD_TESTS_WITH_HMI)
340 add_definitions(-DTESTS_WITH_HMI)
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)
350 # Building documentation
352 # At first creating directory for generated documentation. Unfortunately doxygen
353 # cannot generate it byself
354 FIND_PACKAGE(Doxygen)
356 option(DOXYGEN_ENABLE_DIAGRAMS "Enable graphical diagram generation" ON)
358 if(DOXYGEN_ENABLE_DIAGRAMS)
359 set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "YES")
360 else(DOXYGEN_ENABLE_DIAGRAMS)
361 set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "NO")
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")
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")