CMAKE_CXX_FLAGS removed --coverage
[profile/ivi/smartdevicelink.git] / SDL_Core / 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 project (${PROJECT})
35
36 option(HMI2 "Use Qt HMI" OFF)
37
38 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
39
40 # --- Check libavahi-common, libavahi-client availability
41 find_package(Libavahi)
42
43 # Please do not change compiler/linker flags if You do not know how particular
44 # flag is handled by CMake
45 set(CMAKE_INSTALL_PREFIX .)
46 set(ARCHIVE_OUTPUT_DIRECTORY ./bin)
47 set(CMAKE_CXX_FLAGS "-g3 -ggdb3 -std=gnu++0x -Werror=return-type -Wuninitialized")
48 set(CMAKE_CXX_FLAGS_RELEASE "-s -O2") #It will be appended to CMAKE_CXX_FLAGS in release
49
50 option(EXTENDED_MEDIA_MODE "Turn on and off extended Madia Manager features relates to PulseAudio A2DP and GSteamer" OFF)
51 option(BUILD_SHARED_LIBS "Build all libraries as shared (if ON) or static (if OFF)" OFF)
52 option(BUILD_BT_SUPPORT "Bluetooth support" OFF)
53 option(BUILD_USB_SUPPORT "libusb support" OFF)
54 option(BUILD_AVAHI_SUPPORT "libavahi support" OFF)
55 option(BUILD_RWLOCK_SUPPORT "rwlocks support" OFF)
56 option(BUILD_BACKTRACE_SUPPORT "backtrace support" ON)
57
58
59 if (UNIX)
60     add_definitions(-DOS_POSIX)
61 endif(UNIX)
62 if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
63   add_definitions(-DOS_LINUX)
64 elseif(CMAKE_SYSTEM_NAME STREQUAL "QNX")
65   add_definitions(-DOS_QNX)
66   SET(BUILD_BT_SUPPORT OFF)
67   SET(BUILD_AVAHI_SUPPORT OFF)
68   SET(BUILD_BACKTRACE_SUPPORT OFF)
69   SET(EXTENDED_MEDIA_MODE OFF)
70 elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
71     add_definitions(-DOS_MACOSX)
72     #compile 32-bit 64-bit is having an issue
73     SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -arch i386")
74 endif()
75
76 if (BUILD_USB_SUPPORT)
77   add_definitions(-DUSB_SUPPORT)
78 endif()
79
80 if (BUILD_BT_SUPPORT)
81   add_definitions(-DBLUETOOTH_SUPPORT)
82 endif()
83
84 if (BUILD_AVAHI_SUPPORT)
85   add_definitions(-DAVAHI_SUPPORT)
86 endif()
87
88 if (BUILD_RWLOCK_SUPPORT)
89   add_definitions(-DRWLOCK_SUPPORT)
90 endif()
91
92 if (BUILD_BACKTRACE_SUPPORT)
93   add_definitions(-DBACKTRACE_SUPPORT)
94 endif()
95
96 # TODO(AK): check current OS here
97 add_definitions(-DOS_POSIX)
98
99 IF(CMAKE_C_FLAGS_DEBUG)
100     SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDEBUG" )
101     add_definitions(-DDEBUG)
102 ELSE (CMAKE_C_FLAGS_DEBUG)
103     SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRELEASE" )
104     add_definitions(-DRELEASE)
105 ENDIF(CMAKE_C_FLAGS_DEBUG)
106
107
108 if (EXTENDED_MEDIA_MODE)
109 add_definitions(-DEXTENDED_MEDIA)
110 # required to find 'glibconfig.h'
111 find_package(PkgConfig)
112 pkg_check_modules(GLIB2 REQUIRED glib-2.0)
113 add_definitions(${GLIB2_CFLAGS})
114 endif()
115
116 # Find log4cxx
117 if(UNIX)
118     find_package(PkgConfig)
119     pkg_check_modules(LOG4CXX REQUIRED liblog4cxx)
120     include_directories(${LOG4CXX_INCLUDE_DIRS})
121     link_directories(${LOG4CXX_LIBRARY_DIRS})
122 elseif(WIN32)
123 #   Add finding log4cxx here
124 endif(UNIX)
125
126
127 # --- Interface generator
128
129 find_package(PythonInterp)
130 if(NOT PYTHONINTERP_FOUND)
131     message(ERROR "Python interpreter is not found")
132     message(ERROR "To install it type in the command line:")
133     message(ERROR "sudo apt-get install python")
134 endif(NOT PYTHONINTERP_FOUND)
135
136 if (${HMI2})
137     cmake_minimum_required(VERSION 2.8.11)
138     if (CMAKE_SYSTEM_NAME STREQUAL "QNX")
139         set(qt_version "4.8.5")
140     else ()
141         set(qt_version "5.1.0")
142     endif ()
143
144     execute_process(
145         COMMAND ${CMAKE_SOURCE_DIR}/FindQt.sh -v ${qt_version}
146             OUTPUT_VARIABLE qt_bin_dir
147     )
148     message(STATUS "Binary directory Qt ${qt_version} is ${qt_bin_dir}")
149     set(ENV{PATH} ${qt_bin_dir}:$ENV{PATH})
150
151     if (CMAKE_SYSTEM_NAME STREQUAL "QNX")
152         find_package(Qt4 ${qt_version} REQUIRED QtCore QtGui QtDBus QtDeclarative)
153     else ()
154         find_package(Qt5Core REQUIRED)
155         find_package(Qt5DBus REQUIRED)
156         find_package(Qt5Qml REQUIRED)
157         find_package(Qt5Quick REQUIRED)
158         set(qmlplugindump_binary ${qt_bin_dir}/qmlplugindump)
159     endif ()
160 endif()
161
162 set(INTEFRACE_GENERATOR "${PROJECT_SOURCE_DIR}/tools/InterfaceGenerator/Generator.py")
163 set(INTEFRACE_GENERATOR_CMD ${PYTHON_EXECUTABLE} -B ${INTEFRACE_GENERATOR})
164 file(GLOB_RECURSE INTERFACE_GENERATOR_DEPENDENCIES "${PROJECT_SOURCE_DIR}/tools/InterfaceGenerator/*.*")
165
166 macro (GenerateInterface arg_xml_name arg_namespace parser_type)
167     string(REGEX MATCH "^[a-zA-Z_0-9]*[^.]" file_name ${arg_xml_name})     # TODO: make expression more robust
168
169     set(hpp_file
170       "${CMAKE_CURRENT_BINARY_DIR}/${file_name}.h"
171       "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.h"
172     )
173
174     set(cpp_file "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.cc")
175     set(full_xml_name "${CMAKE_CURRENT_SOURCE_DIR}/${arg_xml_name}")
176
177     add_custom_command( OUTPUT ${hpp_file} ${cpp_file}
178                         COMMAND ${INTEFRACE_GENERATOR_CMD} ${full_xml_name} ${arg_namespace} ${CMAKE_CURRENT_BINARY_DIR} "--parser-type" "${parser_type}"
179                         DEPENDS ${INTERFACE_GENERATOR_DEPENDENCIES} ${full_xml_name}
180                         COMMENT "Generating files:\n   ${hpp_file}\n   ${cpp_file}\nfrom:\n   ${arg_xml_name} ..."
181                         VERBATIM
182                        )
183
184     include_directories (
185         ../../../src/components/smart_objects/include
186         ../../../src/components/formatters/include/
187         ${CMAKE_SOURCE_DIR}/src/components/formatters/include/
188         ${CMAKE_BINARY_DIR}
189     )
190
191     add_library("${file_name}" ${cpp_file})
192 endmacro(GenerateInterface)
193
194 # --- Useful macro
195 macro(create_test NAME SOURCES LIBS)
196     add_executable("${NAME}" ${SOURCES})
197     target_link_libraries("${NAME}" ${LIBS})
198     add_test(${NAME} ${NAME})
199 endmacro(create_test)
200
201 # Building application
202
203 # --- Type HMI
204 if (${HMI2})
205     set(QT_HMI ON)
206     add_definitions(-DQT_HMI)
207 else (${HMI2})
208     set(WEB_HMI ON)
209     add_definitions(-DWEB_HMI)
210 ENDIF (${HMI2})
211
212 # --- ThirdPartyLibs
213 add_subdirectory(./src/thirdPartyLibs)
214
215 # --- Tools
216 add_subdirectory(./tools)
217
218 # --- Components
219 add_subdirectory(./src/components)
220
221 # --- Main application
222 add_subdirectory(./src/appMain)
223
224 # Building tests
225 option(BUILD_TESTS "Possibility to build and run tests" OFF)
226 if(BUILD_TESTS)
227     enable_testing()
228     include(Dart)
229     # Framework GoogleTest is also integrated together gmock
230     # and must not be added separately
231     add_subdirectory(./src/thirdPartyLibs/gmock-1.6.0)
232     add_subdirectory(./test)
233 endif()
234
235 # Building documentation
236
237 # At first creating directory for generated documentation. Unfortunately doxygen
238 # cannot generate it byself
239 FIND_PACKAGE(Doxygen)
240   IF(DOXYGEN_FOUND)
241     option(DOXYGEN_ENABLE_DIAGRAMS "Enable graphical diagram generation" ON)
242
243     if(DOXYGEN_ENABLE_DIAGRAMS)
244       set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "YES")
245     else(DOXYGEN_ENABLE_DIAGRAMS)
246       set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "NO")
247     endif()
248     configure_file("${PROJECT_SOURCE_DIR}/Doxyfile" "${PROJECT_BINARY_DIR}/Doxyfile")
249     file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/doc/doxygen")
250     ADD_CUSTOM_TARGET(doxygen COMMAND ${DOXYGEN_EXECUTABLE} "${PROJECT_BINARY_DIR}/Doxyfile")
251   ELSE(DOXYGEN_FOUND)
252     MESSAGE(STATUS "Doxygen not found. Documentation will not be generated")
253     MESSAGE(STATUS "To enable documentation generation please install doxygen and graphviz packages")
254     MESSAGE(STATUS "sudo apt-get install doxygen graphviz")
255     MESSAGE(STATUS "To enable processing of MscGen comments please install mscgen")
256     MESSAGE(STATUS "sudo apt-get install mscgen")
257 ENDIF(DOXYGEN_FOUND)
258
259