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 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)
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}")
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
62 if (${HMI_TYPE_OPTION} STREQUAL "HTML5")
63 message(STATUS "Jenkins integration: select HTML5 HMI")
65 elseif (${HMI_TYPE_OPTION} STREQUAL "NONE")
66 message(STATUS "Jenkins integration: select HMI none")
69 message(STATUS "Jenkins integration: select QML HMI none")
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)
82 if (${DEBUG_OPTION} STREQUAL "DBG_OFF")
83 message(STATUS "Jenkins integration: build release version")
84 set (CMAKE_BUILD_TYPE Release)
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")
101 #Jenkins integration section end
104 cmake_minimum_required(VERSION 2.8.0)
106 set (PROJECT smartDeviceLinkCore)
109 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
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
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)
128 if (BUILD_USB_SUPPORT)
129 add_definitions(-DUSB_SUPPORT)
132 if (BUILD_BT_SUPPORT)
133 add_definitions(-DBLUETOOTH_SUPPORT)
136 if (BUILD_AVAHI_SUPPORT)
137 add_definitions(-DAVAHI_SUPPORT)
138 # --- Check libavahi-common, libavahi-client availability
139 find_package(Libavahi)
142 if (BUILD_RWLOCK_SUPPORT)
143 add_definitions(-DRWLOCK_SUPPORT)
146 if (BUILD_BACKTRACE_SUPPORT)
147 add_definitions(-DBACKTRACE_SUPPORT)
150 # TODO(AK): check current OS here
151 add_definitions(-DOS_POSIX)
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)
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})
170 # --- Interface generator
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)
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")
184 set(qt_version "5.1.0")
188 COMMAND ${CMAKE_SOURCE_DIR}/FindQt.sh -v ${qt_version}
189 OUTPUT_VARIABLE qt_bin_dir
191 message(STATUS "Binary directory Qt ${qt_version} is ${qt_bin_dir}")
192 set(ENV{PATH} ${qt_bin_dir}:$ENV{PATH})
194 if (CMAKE_SYSTEM_NAME STREQUAL "QNX")
195 find_package(Qt4 ${qt_version} REQUIRED QtCore QtGui QtDBus QtDeclarative)
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)
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/*.*")
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
213 "${CMAKE_CURRENT_BINARY_DIR}/${file_name}.h"
214 "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.h"
217 set(cpp_file "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.cc")
218 set(full_xml_name "${CMAKE_CURRENT_SOURCE_DIR}/${arg_xml_name}")
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} ..."
227 include_directories (
228 ../../../src/components/smart_objects/include
229 ../../../src/components/formatters/include/
230 ${CMAKE_SOURCE_DIR}/src/components/formatters/include/
234 add_library("${file_name}" ${cpp_file})
235 endmacro(GenerateInterface)
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})
244 add_test(${NAME} ${NAME})
246 endmacro(create_test)
248 # Building application
251 if (HMI STREQUAL "qt")
253 add_definitions(-DQT_HMI)
254 elseif (HMI STREQUAL "web")
256 add_definitions(-DWEB_HMI)
259 add_definitions(-DNO_HMI)
262 if (HMI STREQUAL "qt" AND NOT DEFINED HMIADAPTER)
263 set(HMIADAPTER "dbus")
265 if (HMI STREQUAL "web" AND NOT DEFINED HMIADAPTER)
266 set(HMIADAPTER "messagebroker")
268 if (HMI STREQUAL "no" AND NOT DEFINED HMIADAPTER)
269 set(HMIADAPTER "mqueue")
272 if (HMIADAPTER STREQUAL "dbus")
274 add_definitions(-DDBUS_HMIADAPTER)
275 add_definitions(-DHMI_DBUS_API)
277 if (HMIADAPTER STREQUAL "messagebroker")
279 add_definitions(-DMESSAGEBROKER_HMIADAPTER)
280 add_definitions(-DHMI_JSON_API)
282 if (HMIADAPTER STREQUAL "mqueue")
284 add_definitions(-DMQUEUE_HMIADAPTER)
285 add_definitions(-DHMI_JSON_API)
289 add_subdirectory(./src/thirdPartyLibs)
292 add_subdirectory(./tools)
295 add_subdirectory(./src/components)
297 # --- Main application
298 add_subdirectory(./src/appMain)
302 if(BUILD_TESTS_WITH_HMI)
303 add_definitions(-DTESTS_WITH_HMI)
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)
313 # Building documentation
315 # At first creating directory for generated documentation. Unfortunately doxygen
316 # cannot generate it byself
317 FIND_PACKAGE(Doxygen)
319 option(DOXYGEN_ENABLE_DIAGRAMS "Enable graphical diagram generation" ON)
321 if(DOXYGEN_ENABLE_DIAGRAMS)
322 set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "YES")
323 else(DOXYGEN_ENABLE_DIAGRAMS)
324 set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "NO")
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")
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")