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)
36 option(HMI2 "Use Qt HMI" OFF)
38 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
40 # Please do not change compiler/linker flags if You do not know how particular
41 # flag is handled by CMake
42 set(CMAKE_INSTALL_PREFIX .)
43 set(ARCHIVE_OUTPUT_DIRECTORY ./bin)
45 option(EXTENDED_MEDIA_MODE "Turn on and off extended Madia Manager features relates to PulseAudio A2DP and GStreamer" OFF)
46 option(BUILD_SHARED_LIBS "Build all libraries as shared (if ON) or static (if OFF)" OFF)
47 option(BUILD_BT_SUPPORT "Bluetooth support" OFF)
48 option(BUILD_USB_SUPPORT "libusb support" OFF)
49 option(BUILD_AVAHI_SUPPORT "libavahi support" OFF)
50 option(BUILD_RWLOCK_SUPPORT "rwlocks support" OFF)
51 option(BUILD_BACKTRACE_SUPPORT "backtrace support" ON)
55 add_definitions(-DOS_POSIX)
57 set(CMAKE_CXX_FLAGS "-g3 -ggdb3 -std=gnu++0x -Werror=return-type -Wuninitialized")
58 set(CMAKE_CXX_FLAGS_RELEASE "-s -O2") #It will be appended to CMAKE_CXX_FLAGS in release
60 if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
61 add_definitions(-DOS_LINUX)
62 elseif(CMAKE_SYSTEM_NAME STREQUAL "QNX")
63 add_definitions(-DOS_QNX)
64 SET(BUILD_BT_SUPPORT OFF)
65 SET(BUILD_AVAHI_SUPPORT OFF)
66 SET(BUILD_BACKTRACE_SUPPORT OFF)
67 SET(EXTENDED_MEDIA_MODE OFF)
68 elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
69 add_definitions(-DOS_MACOSX)
70 #compile 32-bit 64-bit is having an issue
71 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -arch i386")
75 if (BUILD_USB_SUPPORT)
76 add_definitions(-DUSB_SUPPORT)
80 add_definitions(-DBLUETOOTH_SUPPORT)
83 if (BUILD_AVAHI_SUPPORT)
84 # --- Check libavahi-common, libavahi-client availability
85 find_package(Libavahi)
87 add_definitions(-DAVAHI_SUPPORT)
90 if (BUILD_RWLOCK_SUPPORT)
91 add_definitions(-DRWLOCK_SUPPORT)
94 if (BUILD_BACKTRACE_SUPPORT)
95 add_definitions(-DBACKTRACE_SUPPORT)
98 # TODO(AK): check current OS here
99 add_definitions(-DOS_POSIX)
101 IF(CMAKE_C_FLAGS_DEBUG)
102 SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDEBUG" )
103 add_definitions(-DDEBUG)
105 # Enable debug mode in the GNU C++ library, to catch incorrect/undefined behavior
106 add_definitions(-D_GLIBCXX_DEBUG)
107 add_definitions(-D_GLIBCXX_DEBUG_PEDANTIC)
108 ELSE (CMAKE_C_FLAGS_DEBUG)
109 SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRELEASE" )
110 add_definitions(-DRELEASE)
111 ENDIF(CMAKE_C_FLAGS_DEBUG)
114 if (EXTENDED_MEDIA_MODE)
115 add_definitions(-DEXTENDED_MEDIA)
116 # required to find 'glibconfig.h'
117 find_package(PkgConfig)
118 pkg_check_modules(GLIB2 REQUIRED glib-2.0)
119 add_definitions(${GLIB2_CFLAGS})
124 find_package(PkgConfig)
125 pkg_check_modules(LOG4CXX REQUIRED liblog4cxx)
126 include_directories(${LOG4CXX_INCLUDE_DIRS})
127 link_directories(${LOG4CXX_LIBRARY_DIRS})
129 # Add finding log4cxx here
133 # --- Interface generator
135 find_package(PythonInterp)
136 if(NOT PYTHONINTERP_FOUND)
137 message(ERROR "Python interpreter is not found")
138 message(ERROR "To install it type in the command line:")
139 message(ERROR "sudo apt-get install python")
140 endif(NOT PYTHONINTERP_FOUND)
143 cmake_minimum_required(VERSION 2.8.11)
144 if (CMAKE_SYSTEM_NAME STREQUAL "QNX")
145 set(qt_version "4.8.5")
147 set(qt_version "5.1.0")
151 COMMAND ${CMAKE_SOURCE_DIR}/FindQt.sh -v ${qt_version}
152 OUTPUT_VARIABLE qt_bin_dir
154 message(STATUS "Binary directory Qt ${qt_version} is ${qt_bin_dir}")
155 set(ENV{PATH} ${qt_bin_dir}:$ENV{PATH})
157 if (CMAKE_SYSTEM_NAME STREQUAL "QNX")
158 find_package(Qt4 ${qt_version} REQUIRED QtCore QtGui QtDBus QtDeclarative)
160 find_package(Qt5Core REQUIRED)
161 find_package(Qt5DBus REQUIRED)
162 find_package(Qt5Qml REQUIRED)
163 find_package(Qt5Quick REQUIRED)
164 set(qmlplugindump_binary ${qt_bin_dir}/qmlplugindump)
168 set(INTEFRACE_GENERATOR "${PROJECT_SOURCE_DIR}/tools/InterfaceGenerator/Generator.py")
169 set(INTEFRACE_GENERATOR_CMD ${PYTHON_EXECUTABLE} -B ${INTEFRACE_GENERATOR})
170 file(GLOB_RECURSE INTERFACE_GENERATOR_DEPENDENCIES "${PROJECT_SOURCE_DIR}/tools/InterfaceGenerator/*.*")
172 macro (GenerateInterface arg_xml_name arg_namespace parser_type)
173 string(REGEX MATCH "^[a-zA-Z_0-9]*[^.]" file_name ${arg_xml_name}) # TODO: make expression more robust
176 "${CMAKE_CURRENT_BINARY_DIR}/${file_name}.h"
177 "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.h"
180 set(cpp_file "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.cc")
181 set(full_xml_name "${CMAKE_CURRENT_SOURCE_DIR}/${arg_xml_name}")
183 add_custom_command( OUTPUT ${hpp_file} ${cpp_file}
184 COMMAND ${INTEFRACE_GENERATOR_CMD} ${full_xml_name} ${arg_namespace} ${CMAKE_CURRENT_BINARY_DIR} "--parser-type" "${parser_type}"
185 DEPENDS ${INTERFACE_GENERATOR_DEPENDENCIES} ${full_xml_name}
186 COMMENT "Generating files:\n ${hpp_file}\n ${cpp_file}\nfrom:\n ${arg_xml_name} ..."
190 include_directories (
191 ../../../src/components/smart_objects/include
192 ../../../src/components/formatters/include/
193 ${CMAKE_SOURCE_DIR}/src/components/formatters/include/
197 add_library("${file_name}" ${cpp_file})
198 endmacro(GenerateInterface)
201 macro(create_test NAME SOURCES LIBS)
202 add_executable("${NAME}" ${SOURCES})
203 target_link_libraries("${NAME}" ${LIBS})
204 add_test(${NAME} ${NAME})
205 endmacro(create_test)
207 # Building application
212 add_definitions(-DQT_HMI)
215 add_definitions(-DWEB_HMI)
219 add_subdirectory(./src/thirdPartyLibs)
222 add_subdirectory(./tools)
225 add_subdirectory(./src/components)
227 # --- Main application
228 add_subdirectory(./src/appMain)
231 option(BUILD_TESTS "Possibility to build and run tests" OFF)
235 # Framework GoogleTest is also integrated together gmock
236 # and must not be added separately
237 add_subdirectory(./src/thirdPartyLibs/gmock-1.6.0)
238 add_subdirectory(./test)
241 # Building documentation
243 # At first creating directory for generated documentation. Unfortunately doxygen
244 # cannot generate it byself
245 FIND_PACKAGE(Doxygen)
247 option(DOXYGEN_ENABLE_DIAGRAMS "Enable graphical diagram generation" ON)
249 if(DOXYGEN_ENABLE_DIAGRAMS)
250 set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "YES")
251 else(DOXYGEN_ENABLE_DIAGRAMS)
252 set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "NO")
254 configure_file("${PROJECT_SOURCE_DIR}/Doxyfile" "${PROJECT_BINARY_DIR}/Doxyfile")
255 file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/doc/doxygen")
256 ADD_CUSTOM_TARGET(doxygen COMMAND ${DOXYGEN_EXECUTABLE} "${PROJECT_BINARY_DIR}/Doxyfile")
258 MESSAGE(STATUS "Doxygen not found. Documentation will not be generated")
259 MESSAGE(STATUS "To enable documentation generation please install doxygen and graphviz packages")
260 MESSAGE(STATUS "sudo apt-get install doxygen graphviz")
261 MESSAGE(STATUS "To enable processing of MscGen comments please install mscgen")
262 MESSAGE(STATUS "sudo apt-get install mscgen")