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 #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)
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}")
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
64 if (${HMI_TYPE_OPTION} STREQUAL "HTML5")
65 message(STATUS "Jenkins integration: select HTML5 HMI")
67 elseif (${HMI_TYPE_OPTION} STREQUAL "NONE")
68 message(STATUS "Jenkins integration: select HMI none")
71 message(STATUS "Jenkins integration: select QML HMI none")
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)
84 if (${DEBUG_OPTION} STREQUAL "DBG_OFF")
85 message(STATUS "Jenkins integration: build release version")
86 set (CMAKE_BUILD_TYPE Release)
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")
103 #Jenkins integration section end
106 cmake_minimum_required(VERSION 2.8.0)
108 set (PROJECT smartDeviceLinkCore)
111 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
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
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)
130 if (BUILD_USB_SUPPORT)
131 add_definitions(-DUSB_SUPPORT)
134 if (BUILD_BT_SUPPORT)
135 add_definitions(-DBLUETOOTH_SUPPORT)
138 if (BUILD_AVAHI_SUPPORT)
139 add_definitions(-DAVAHI_SUPPORT)
140 # --- Check libavahi-common, libavahi-client availability
141 find_package(Libavahi)
144 if (BUILD_RWLOCK_SUPPORT)
145 add_definitions(-DRWLOCK_SUPPORT)
148 if (BUILD_BACKTRACE_SUPPORT)
149 add_definitions(-DBACKTRACE_SUPPORT)
153 add_definitions(-DENABLE_LOG)
156 # TODO(AK): check current OS here
157 add_definitions(-DOS_POSIX)
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)
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})
177 # --- Interface generator
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)
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")
191 set(qt_version "5.1.0")
195 COMMAND ${CMAKE_SOURCE_DIR}/FindQt.sh -v ${qt_version}
196 OUTPUT_VARIABLE qt_bin_dir
198 message(STATUS "Binary directory Qt ${qt_version} is ${qt_bin_dir}")
199 set(ENV{PATH} ${qt_bin_dir}:$ENV{PATH})
201 if (CMAKE_SYSTEM_NAME STREQUAL "QNX")
202 find_package(Qt4 ${qt_version} REQUIRED QtCore QtGui QtDBus QtDeclarative)
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)
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/*.*")
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
220 "${CMAKE_CURRENT_BINARY_DIR}/${file_name}.h"
221 "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.h"
224 set(cpp_file "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.cc")
225 set(full_xml_name "${CMAKE_CURRENT_SOURCE_DIR}/${arg_xml_name}")
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} ..."
234 include_directories (
235 ../../../src/components/smart_objects/include
236 ../../../src/components/formatters/include/
237 ${CMAKE_SOURCE_DIR}/src/components/formatters/include/
241 add_library("${file_name}" ${cpp_file})
242 endmacro(GenerateInterface)
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})
251 add_test(${NAME} ${NAME})
253 endmacro(create_test)
255 # Building application
258 if (HMI STREQUAL "qt")
260 add_definitions(-DQT_HMI)
261 elseif (HMI STREQUAL "web")
263 add_definitions(-DWEB_HMI)
266 add_definitions(-DNO_HMI)
269 if (HMI STREQUAL "qt" AND NOT DEFINED HMIADAPTER)
270 set(HMIADAPTER "dbus")
272 if (HMI STREQUAL "web" AND NOT DEFINED HMIADAPTER)
273 set(HMIADAPTER "messagebroker")
275 if (HMI STREQUAL "no" AND NOT DEFINED HMIADAPTER)
276 set(HMIADAPTER "mqueue")
279 if (HMIADAPTER STREQUAL "dbus")
281 add_definitions(-DDBUS_HMIADAPTER)
282 add_definitions(-DHMI_DBUS_API)
284 if (HMIADAPTER STREQUAL "messagebroker")
286 add_definitions(-DMESSAGEBROKER_HMIADAPTER)
287 add_definitions(-DHMI_JSON_API)
289 if (HMIADAPTER STREQUAL "mqueue")
291 add_definitions(-DMQUEUE_HMIADAPTER)
292 add_definitions(-DHMI_JSON_API)
296 add_subdirectory(./src/thirdPartyLibs)
299 add_subdirectory(./tools)
302 add_subdirectory(./src/components)
304 # --- Main application
305 add_subdirectory(./src/appMain)
309 if(BUILD_TESTS_WITH_HMI)
310 add_definitions(-DTESTS_WITH_HMI)
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)
320 # Building documentation
322 # At first creating directory for generated documentation. Unfortunately doxygen
323 # cannot generate it byself
324 FIND_PACKAGE(Doxygen)
326 option(DOXYGEN_ENABLE_DIAGRAMS "Enable graphical diagram generation" ON)
328 if(DOXYGEN_ENABLE_DIAGRAMS)
329 set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "YES")
330 else(DOXYGEN_ENABLE_DIAGRAMS)
331 set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "NO")
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")
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")