deleted files weren't added to last commit
[profile/ivi/smartdevicelink.git] / 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 # 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)
44
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)
52
53
54 if (UNIX)
55   add_definitions(-DOS_POSIX)
56
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
59
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")
72   endif()
73 endif(UNIX)
74
75 if (BUILD_USB_SUPPORT)
76   add_definitions(-DUSB_SUPPORT)
77 endif()
78
79 if (BUILD_BT_SUPPORT)
80   add_definitions(-DBLUETOOTH_SUPPORT)
81 endif()
82
83 if (BUILD_AVAHI_SUPPORT)
84   # --- Check libavahi-common, libavahi-client availability
85   find_package(Libavahi)
86
87   add_definitions(-DAVAHI_SUPPORT)
88 endif()
89
90 if (BUILD_RWLOCK_SUPPORT)
91   add_definitions(-DRWLOCK_SUPPORT)
92 endif()
93
94 if (BUILD_BACKTRACE_SUPPORT)
95   add_definitions(-DBACKTRACE_SUPPORT)
96 endif()
97
98 # TODO(AK): check current OS here
99 add_definitions(-DOS_POSIX)
100
101 IF(CMAKE_C_FLAGS_DEBUG)
102     SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDEBUG" )
103     add_definitions(-DDEBUG)
104
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)
112
113
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})
120 endif()
121
122 # Find log4cxx
123 if(UNIX)
124     find_package(PkgConfig)
125     pkg_check_modules(LOG4CXX REQUIRED liblog4cxx)
126     include_directories(${LOG4CXX_INCLUDE_DIRS})
127     link_directories(${LOG4CXX_LIBRARY_DIRS})
128 elseif(WIN32)
129 #   Add finding log4cxx here
130 endif(UNIX)
131
132
133 # --- Interface generator
134
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)
141
142 if (${HMI2})
143     cmake_minimum_required(VERSION 2.8.11)
144     if (CMAKE_SYSTEM_NAME STREQUAL "QNX")
145         set(qt_version "4.8.5")
146     else ()
147         set(qt_version "5.1.0")
148     endif ()
149
150     execute_process(
151         COMMAND ${CMAKE_SOURCE_DIR}/FindQt.sh -v ${qt_version}
152             OUTPUT_VARIABLE qt_bin_dir
153     )
154     message(STATUS "Binary directory Qt ${qt_version} is ${qt_bin_dir}")
155     set(ENV{PATH} ${qt_bin_dir}:$ENV{PATH})
156
157     if (CMAKE_SYSTEM_NAME STREQUAL "QNX")
158         find_package(Qt4 ${qt_version} REQUIRED QtCore QtGui QtDBus QtDeclarative)
159     else ()
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)
165     endif ()
166 endif()
167
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/*.*")
171
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
174
175     set(hpp_file
176       "${CMAKE_CURRENT_BINARY_DIR}/${file_name}.h"
177       "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.h"
178     )
179
180     set(cpp_file "${CMAKE_CURRENT_BINARY_DIR}/${file_name}_schema.cc")
181     set(full_xml_name "${CMAKE_CURRENT_SOURCE_DIR}/${arg_xml_name}")
182
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} ..."
187                         VERBATIM
188                        )
189
190     include_directories (
191         ../../../src/components/smart_objects/include
192         ../../../src/components/formatters/include/
193         ${CMAKE_SOURCE_DIR}/src/components/formatters/include/
194         ${CMAKE_BINARY_DIR}
195     )
196
197     add_library("${file_name}" ${cpp_file})
198 endmacro(GenerateInterface)
199
200 # --- Useful macro
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)
206
207 # Building application
208
209 # --- Type HMI
210 if (${HMI2})
211     set(QT_HMI ON)
212     add_definitions(-DQT_HMI)
213 else (${HMI2})
214     set(WEB_HMI ON)
215     add_definitions(-DWEB_HMI)
216 ENDIF (${HMI2})
217
218 # --- ThirdPartyLibs
219 add_subdirectory(./src/thirdPartyLibs)
220
221 # --- Tools
222 add_subdirectory(./tools)
223
224 # --- Components
225 add_subdirectory(./src/components)
226
227 # --- Main application
228 add_subdirectory(./src/appMain)
229
230 # Building tests
231 option(BUILD_TESTS "Possibility to build and run tests" OFF)
232 if(BUILD_TESTS)
233     enable_testing()
234     include(Dart)
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)
239 endif()
240
241 # Building documentation
242
243 # At first creating directory for generated documentation. Unfortunately doxygen
244 # cannot generate it byself
245 FIND_PACKAGE(Doxygen)
246   IF(DOXYGEN_FOUND)
247     option(DOXYGEN_ENABLE_DIAGRAMS "Enable graphical diagram generation" ON)
248
249     if(DOXYGEN_ENABLE_DIAGRAMS)
250       set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "YES")
251     else(DOXYGEN_ENABLE_DIAGRAMS)
252       set(DOXYGEN_ENABLE_DIAGRAMS_PARAM "NO")
253     endif()
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")
257   ELSE(DOXYGEN_FOUND)
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")
263 ENDIF(DOXYGEN_FOUND)
264
265