1# Copyright (C) 2015-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
2# This Source Code Form is subject to the terms of the Mozilla Public
3# License, v. 2.0. If a copy of the MPL was not distributed with this
4# file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
6cmake_minimum_required (VERSION 2.8.12...3.23.3)
7project (vsomeip)
8
9set (VSOMEIP_NAME vsomeip3)
10set (VSOMEIP_COMPAT_NAME vsomeip)
11
12set (VSOMEIP_MAJOR_VERSION 3)
13set (VSOMEIP_MINOR_VERSION 1)
14set (VSOMEIP_PATCH_VERSION 37)
15set (VSOMEIP_HOTFIX_VERSION 1)
16
17set (VSOMEIP_VERSION ${VSOMEIP_MAJOR_VERSION}.${VSOMEIP_MINOR_VERSION}.${VSOMEIP_PATCH_VERSION})
18set (PACKAGE_VERSION ${VSOMEIP_VERSION}) # Used in documentation/doxygen.in
19set (CMAKE_VERBOSE_MAKEFILE off)
20
21if (NOT GTEST_ROOT)
22    if (DEFINED ENV{GTEST_ROOT})
23        set(GTEST_ROOT $ENV{GTEST_ROOT})
24    else()
25        set(GTEST_ROOT "n/a" CACHE STRING "Path to root folder of googletest. Must be set for building the tests.")
26    endif()
27endif()
28
29###################################################################################################
30# see http://www.cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file
31###################################################################################################
32
33# Offer the user the choice of overriding the installation directories
34set (INSTALL_LIB_DIR lib CACHE STRING "Installation directory for libraries")
35set (INSTALL_BIN_DIR bin CACHE STRING "Installation directory for executables")
36set (INSTALL_INCLUDE_DIR include CACHE STRING "Installation directory for header files")
37
38if (WIN32 AND NOT CYGWIN)
39    set (DEF_INSTALL_CMAKE_DIR CMake)
40else ()
41    set (DEF_INSTALL_CMAKE_DIR lib/cmake/${VSOMEIP_NAME})
42endif ()
43
44set (INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE STRING "Installation directory for CMake files")
45
46###################################################################################################
47# Set a default build type if none was specified
48set(default_build_type "RelWithDebInfo")
49if(NOT CMAKE_BUILD_TYPE)
50  message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
51  set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING "Choose the type of build." FORCE)
52  # Set the possible values of build type for cmake-gui
53  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
54endif()
55
56# OS
57if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
58    set(OS "LINUX")
59    set(DL_LIBRARY "dl")
60    set(EXPORTSYMBOLS "-Wl,-export-dynamic -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/exportmap.gcc")
61    set(NO_DEPRECATED "")
62    set(OPTIMIZE "")
63    set(OS_CXX_FLAGS "-D_GLIBCXX_USE_NANOSLEEP -pthread -O -Wall -Wextra -Wformat -Wformat-security -Wconversion -fexceptions -fstrict-aliasing -fstack-protector-strong -fasynchronous-unwind-tables -fno-omit-frame-pointer -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security -fPIE -pie -Wl,-z,relro,-z,now")
64endif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
65
66if (${CMAKE_SYSTEM_NAME} MATCHES "Android")
67    set(OS "ANDROID")
68    set(DL_LIBRARY "")
69    set(EXPORTSYMBOLS "")
70    set(NO_DEPRECATED "")
71    set(OPTIMIZE "")
72
73    find_library(ANDROID_LOG_LIB log)
74    set(OS_LIBS ${ANDROID_LOG_LIB})
75endif(${CMAKE_SYSTEM_NAME} MATCHES "Android")
76
77if (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
78    set(OS "FREEBSD")
79    set(DL_LIBRARY "")
80    set(EXPORTSYMBOLS "")
81    set(NO_DEPRECATED "-Wno-deprecated")
82    set(OPTIMIZE "")
83    set(OS_CXX_FLAGS "-pthread")
84endif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
85
86################################################################################
87# Options
88################################################################################
89
90# DLT
91if (DISABLE_DLT)
92set (VSOMEIP_ENABLE_DLT 0)
93else ()
94set (VSOMEIP_ENABLE_DLT 1)
95endif ()
96
97# Signal handling
98if (ENABLE_SIGNAL_HANDLING)
99set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVSOMEIP_ENABLE_SIGNAL_HANDLING")
100endif ()
101
102# Sanitizer
103if (ENABLE_THREAD_SANITIZER)
104set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread")
105endif ()
106
107if (ENABLE_LEAK_SANITIZER)
108set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=leak")
109endif ()
110
111# Configuration overlays
112if (ENABLE_CONFIGURATION_OVERLAYS)
113set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVSOMEIP_ENABLE_CONFIGURATION_OVERLAYS")
114endif ()
115
116# Compatibility
117if (ENABLE_COMPAT)
118set (VSOMEIP_ENABLE_COMPAT 1)
119else ()
120set (VSOMEIP_ENABLE_COMPAT 0)
121endif ()
122
123# Multiple routing managers
124if (ENABLE_MULTIPLE_ROUTING_MANAGERS)
125set (VSOMEIP_ENABLE_MULTIPLE_ROUTING_MANAGERS 1)
126else ()
127set (VSOMEIP_ENABLE_MULTIPLE_ROUTING_MANAGERS 0)
128endif ()
129
130# Session handling configuration
131if (ENABLE_SESSION_HANDLING_CONFIG)
132set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVSOMEIP_HAS_SESSION_HANDLING_CONFIG")
133endif ()
134
135################################################################################
136# Dependencies
137################################################################################
138
139# Threads
140find_package(Threads REQUIRED)
141
142# Boost
143find_package( Boost 1.55 COMPONENTS system thread filesystem REQUIRED )
144include_directories(SYSTEM ${Boost_INCLUDE_DIR} )
145
146if(Boost_FOUND)
147  if(Boost_LIBRARY_DIR)
148    MESSAGE( STATUS "Boost_LIBRARY_DIR not empty using it: ${Boost_LIBRARY_DIR}" )
149  else()
150    if(BOOST_LIBRARYDIR)
151      MESSAGE( STATUS "Boost_LIBRARY_DIR empty but BOOST_LIBRARYDIR is set setting Boost_LIBRARY_DIR to: ${BOOST_LIBRARYDIR}" )
152      set(Boost_LIBRARY_DIR ${BOOST_LIBRARYDIR})
153    endif()
154  endif()
155else()
156  MESSAGE( STATUS "Boost was not found!")
157endif()
158
159# cmake 3.15 introduced a new variable and a new format for the old one
160if (DEFINED Boost_VERSION_MACRO)
161  set(VSOMEIP_BOOST_VERSION ${Boost_VERSION_MACRO})
162else()
163  set(VSOMEIP_BOOST_VERSION ${Boost_VERSION})
164endif()
165
166message( STATUS "Using boost version: ${VSOMEIP_BOOST_VERSION}" )
167if (${VSOMEIP_BOOST_VERSION} GREATER 107600)
168message( ERROR "boost version ${VSOMEIP_BOOST_VERSION} is not (yet) supported. Latest supported version is 1.76.0" )
169elseif(${VSOMEIP_BOOST_VERSION} GREATER 107500)
170set(VSOMEIP_BOOST_HELPER implementation/helper/1.76)
171elseif(${VSOMEIP_BOOST_VERSION} GREATER 107300)
172set(VSOMEIP_BOOST_HELPER implementation/helper/1.74)
173elseif(${VSOMEIP_BOOST_VERSION} GREATER 106999)
174set(VSOMEIP_BOOST_HELPER implementation/helper/1.70)
175elseif(${VSOMEIP_BOOST_VERSION} GREATER 106599)
176set(VSOMEIP_BOOST_HELPER implementation/helper/1.66)
177else()
178set(VSOMEIP_BOOST_HELPER implementation/helper/1.55)
179endif()
180
181find_package(PkgConfig)
182
183# DLT
184if(VSOMEIP_ENABLE_DLT EQUAL 1)
185pkg_check_modules(DLT "automotive-dlt >= 2.11")
186if(DLT_FOUND)
187     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_DLT")
188endif(DLT_FOUND)
189endif()
190
191# SystemD
192pkg_check_modules(SystemD "libsystemd")
193
194if(NOT SystemD_FOUND OR ${CMAKE_SYSTEM_NAME} MATCHES "Android")
195MESSAGE( STATUS "Systemd was not found, watchdog disabled!")
196set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWITHOUT_SYSTEMD")
197else()
198list(APPEND OS_LIBS ${SystemD_LIBRARIES})
199endif(NOT SystemD_FOUND OR ${CMAKE_SYSTEM_NAME} MATCHES "Android")
200
201# Multiple routing managers
202if (VSOMEIP_ENABLE_MULTIPLE_ROUTING_MANAGERS EQUAL 1)
203set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVSOMEIP_ENABLE_MULTIPLE_ROUTING_MANAGERS")
204endif ()
205
206################################################################################
207# Directories
208################################################################################
209
210include_directories(
211    interface
212)
213
214include_directories(SYSTEM
215    ${VSOMEIP_BOOST_HELPER}
216    ${DLT_INCLUDE_DIRS}
217)
218
219link_directories(
220    ${DLT_LIBDIR}
221)
222
223if (${VSOMEIP_HOTFIX_VERSION} EQUAL 0)
224add_definitions(-DVSOMEIP_VERSION="${VSOMEIP_VERSION}")
225else()
226add_definitions(-DVSOMEIP_VERSION="${VSOMEIP_VERSION}.${VSOMEIP_HOTFIX_VERSION}")
227endif()
228
229if (MSVC)
230    message("using MSVC Compiler")
231    # add_definitions(-DVSOMEIP_DLL_COMPILATION) now it is controlled per target
232    SET(BOOST_WINDOWS_VERSION "0x600" CACHE STRING "Set the same Version as the Version with which Boost was built, otherwise there will be errors. (normaly 0x600 is for Windows 7 and 0x501 is for Windows XP)")
233    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_WINSOCK_DEPRECATED_NO_WARNINGS -D_WIN32_WINNT=${BOOST_WINDOWS_VERSION} -DWIN32 -DBOOST_ASIO_DISABLE_IOCP /EHsc")
234    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS -D_WIN32_WINNT=${BOOST_WINDOWS_VERSION} -DWIN32 -DBOOST_ASIO_DISABLE_IOCP /EHsc")
235    set(USE_RT "")
236    link_directories(${Boost_LIBRARY_DIR_DEBUG})
237    ADD_DEFINITIONS( -DBOOST_ALL_DYN_LINK )
238else()
239    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D${OS} ${OS_CXX_FLAGS} -g ${OPTIMIZE} -std=c++11 ${NO_DEPRECATED} ${EXPORTSYMBOLS}")
240    if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Android")
241        set(USE_RT "rt")
242    endif()
243endif()
244
245################################################################################
246# Configuration library
247################################################################################
248file(GLOB ${VSOMEIP_NAME}-cfg_SRC
249    "implementation/configuration/src/*.cpp"
250)
251list(SORT ${VSOMEIP_NAME}-cfg_SRC)
252if (VSOMEIP_ENABLE_MULTIPLE_ROUTING_MANAGERS EQUAL 0)
253    add_library(${VSOMEIP_NAME}-cfg SHARED ${${VSOMEIP_NAME}-cfg_SRC})
254    set_target_properties (${VSOMEIP_NAME}-cfg PROPERTIES VERSION ${VSOMEIP_VERSION} SOVERSION ${VSOMEIP_MAJOR_VERSION})
255    if (MSVC)
256        set_target_properties(${VSOMEIP_NAME}-cfg PROPERTIES COMPILE_DEFINITIONS "VSOMEIP_DLL_COMPILATION_PLUGIN")
257    endif()
258
259    target_link_libraries(${VSOMEIP_NAME}-cfg ${VSOMEIP_NAME} ${Boost_LIBRARIES} ${USE_RT} ${DL_LIBRARY} ${OS_LIBS})
260endif ()
261
262################################################################################
263# Base library
264################################################################################
265file(GLOB ${VSOMEIP_NAME}_SRC
266    "implementation/endpoints/src/*.cpp"
267    "implementation/logger/src/*.cpp"
268    "implementation/tracing/src/*.cpp"
269    "implementation/message/src/*.cpp"
270    "implementation/plugin/src/*.cpp"
271    "implementation/routing/src/*.cpp"
272    "implementation/runtime/src/*.cpp"
273    "implementation/security/src/*.cpp"
274    "implementation/utility/src/*.cpp"
275)
276if (VSOMEIP_ENABLE_MULTIPLE_ROUTING_MANAGERS EQUAL 1)
277list(APPEND ${VSOMEIP_NAME}_SRC "implementation/configuration/src/configuration_impl.cpp")
278endif()
279list(SORT ${VSOMEIP_NAME}_SRC)
280
281add_library(${VSOMEIP_NAME} SHARED ${${VSOMEIP_NAME}_SRC})
282set_target_properties (${VSOMEIP_NAME} PROPERTIES VERSION ${VSOMEIP_VERSION} SOVERSION ${VSOMEIP_MAJOR_VERSION})
283if (MSVC)
284    set_target_properties(${VSOMEIP_NAME} PROPERTIES COMPILE_DEFINITIONS "VSOMEIP_DLL_COMPILATION")
285endif ()
286target_include_directories(${VSOMEIP_NAME} INTERFACE
287    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/interface>
288    $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>
289    $<INSTALL_INTERFACE:${INSTALL_INCLUDE_DIR}>)
290# PRIVATE means the listed libraries won't be included in the "link interface",
291# meaning the exported vsomeip3Targets.cmake targets won't try to link against
292# them (which shouldn't be required). ${Boost_LIBRARIES} includes absolute
293# build host paths as of writing, which also makes this important as it breaks
294# the build.
295target_link_libraries(${VSOMEIP_NAME} PRIVATE ${Boost_LIBRARIES} ${USE_RT} ${DL_LIBRARY} ${DLT_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${OS_LIBS})
296
297################################################################################
298# Service Discovery library
299################################################################################
300file(GLOB ${VSOMEIP_NAME}-sd_SRC
301    "implementation/service_discovery/src/*.cpp"
302)
303list(SORT ${VSOMEIP_NAME}-sd_SRC)
304
305add_library(${VSOMEIP_NAME}-sd SHARED ${${VSOMEIP_NAME}-sd_SRC})
306set_target_properties (${VSOMEIP_NAME}-sd PROPERTIES VERSION ${VSOMEIP_VERSION} SOVERSION ${VSOMEIP_MAJOR_VERSION})
307if (MSVC)
308    set_target_properties(${VSOMEIP_NAME}-sd PROPERTIES COMPILE_DEFINITIONS "VSOMEIP_DLL_COMPILATION_PLUGIN")
309endif ()
310
311target_link_libraries(${VSOMEIP_NAME}-sd ${VSOMEIP_NAME} ${Boost_LIBRARIES} ${USE_RT} ${DL_LIBRARY} ${CMAKE_THREAD_LIBS_INIT} ${OS_LIBS})
312
313
314################################################################################
315# E2E library
316################################################################################
317file(GLOB_RECURSE ${VSOMEIP_NAME}-e2e_SRC
318    "implementation/e2e_protection/src/*.cpp"
319)
320list(SORT ${VSOMEIP_NAME}-e2e_SRC)
321
322add_library(${VSOMEIP_NAME}-e2e SHARED ${${VSOMEIP_NAME}-e2e_SRC})
323set_target_properties (${VSOMEIP_NAME}-e2e PROPERTIES VERSION ${VSOMEIP_VERSION} SOVERSION ${VSOMEIP_MAJOR_VERSION})
324if (MSVC)
325    set_target_properties(${VSOMEIP_NAME}-e2e PROPERTIES COMPILE_DEFINITIONS "VSOMEIP_DLL_COMPILATION_PLUGIN")
326endif ()
327
328target_link_libraries(${VSOMEIP_NAME}-e2e ${VSOMEIP_NAME} ${Boost_LIBRARIES} ${USE_RT} ${DL_LIBRARY} ${OS_LIBS})
329
330################################################################################
331# Compatibility library
332################################################################################
333if (VSOMEIP_ENABLE_COMPAT EQUAL 1)
334set (VSOMEIP_COMPAT_MAJOR_VERSION 2)
335set (VSOMEIP_COMPAT_VERSION ${VSOMEIP_COMPAT_MAJOR_VERSION}.99.99)
336
337set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVSOMEIP_ENABLE_COMPAT")
338
339file(GLOB_RECURSE ${VSOMEIP_COMPAT_NAME}_SRC
340    "implementation/compat/logging/src/*.cpp"
341    "implementation/compat/message/src/*.cpp"
342    "implementation/compat/runtime/src/*.cpp"
343)
344list(SORT ${VSOMEIP_COMPAT_NAME}_SRC)
345
346add_library(${VSOMEIP_COMPAT_NAME} SHARED ${${VSOMEIP_COMPAT_NAME}_SRC})
347set_target_properties (${VSOMEIP_COMPAT_NAME} PROPERTIES VERSION ${VSOMEIP_COMPAT_VERSION} SOVERSION ${VSOMEIP_COMPAT_MAJOR_VERSION})
348if (MSVC)
349    set_target_properties(${VSOMEIP_COMPAT_NAME} PROPERTIES COMPILE_DEFINITIONS "VSOMEIP_DLL_COMPILATION_PLUGIN")
350endif ()
351
352target_include_directories(
353    ${VSOMEIP_COMPAT_NAME}
354    PUBLIC
355    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/interface/compat>
356    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> # for generated files in build mode
357    $<INSTALL_INTERFACE:include/compat> # for clients in install mode
358)
359target_link_libraries(${VSOMEIP_COMPAT_NAME} PRIVATE ${VSOMEIP_NAME} ${Boost_LIBRARIES} ${USE_RT} ${DL_LIBRARY} ${OS_LIBS})
360
361endif ()
362
363################################################################################
364# Configuration files
365################################################################################
366set(EXAMPLE_CONFIG_FILES
367    "config/vsomeip.json"
368    "config/vsomeip-local.json"
369    "config/vsomeip-tcp-client.json"
370    "config/vsomeip-tcp-service.json"
371    "config/vsomeip-udp-client.json"
372    "config/vsomeip-udp-service.json"
373)
374
375################################################################################
376# Configuration parameters
377################################################################################
378set (VSOMEIP_BASE_PATH "/tmp")
379if (BASE_PATH)
380set (VSOMEIP_BASE_PATH ${BASE_PATH})
381endif ()
382set (VSOMEIP_DIAGNOSIS_ADDRESS "0x01")
383if (DIAGNOSIS_ADDRESS)
384set (VSOMEIP_DIAGNOSIS_ADDRESS ${DIAGNOSIS_ADDRESS})
385endif ()
386set (VSOMEIP_UNICAST_ADDRESS "127.0.0.1")
387if (UNICAST_ADDRESS)
388set (VSOMEIP_UNICAST_ADDRESS ${UNICAST_ADDRESS})
389endif ()
390set (VSOMEIP_ROUTING_READY_MESSAGE "SOME/IP routing ready.")
391if (ROUTING_READY_MESSAGE)
392set (VSOMEIP_ROUTING_READY_MESSAGE ${ROUTING_READY_MESSAGE})
393endif ()
394
395set(DEFAULT_CONFIGURATION_FOLDER "/etc/vsomeip" CACHE PATH "Default configuration folder")
396message(STATUS "Default configuration folder: ${DEFAULT_CONFIGURATION_FOLDER}")
397
398set(DEFAULT_CONFIGURATION_FILE "/etc/vsomeip.json" CACHE FILEPATH "Default configuration file")
399message(STATUS "Default configuration file: ${DEFAULT_CONFIGURATION_FILE}")
400
401message("Predefined base path: ${VSOMEIP_BASE_PATH}")
402message("Predefined unicast address: ${VSOMEIP_UNICAST_ADDRESS}")
403message("Predefined diagnosis address: ${VSOMEIP_DIAGNOSIS_ADDRESS}")
404
405################################################################################
406# Installation
407################################################################################
408set(INCLUDE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/interface/vsomeip")
409
410file (GLOB_RECURSE vsomeip_INCLUDE RELATIVE ${INCLUDE_PATH} "interface/*.hpp"  )
411list (SORT vsomeip_INCLUDE)
412
413foreach ( file ${vsomeip_INCLUDE} )
414    get_filename_component( dir ${file} DIRECTORY )
415    install( FILES "${INCLUDE_PATH}/${file}" DESTINATION "${INSTALL_INCLUDE_DIR}/vsomeip/${dir}" COMPONENT dev)
416endforeach()
417
418install (
419    TARGETS ${VSOMEIP_NAME}
420    # IMPORTANT: Add the vsomeip library to the "export-set"
421    EXPORT vsomeip3Targets
422    RUNTIME DESTINATION "${INSTALL_BIN_DIR}" COMPONENT
423    LIBRARY DESTINATION "${INSTALL_LIB_DIR}" COMPONENT
424    ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
425    COMPONENT dev
426)
427
428install (
429    TARGETS ${VSOMEIP_NAME}-e2e
430    LIBRARY DESTINATION "${INSTALL_LIB_DIR}" COMPONENT shlib
431    RUNTIME DESTINATION "${INSTALL_BIN_DIR}" COMPONENT bin
432)
433
434if (VSOMEIP_ENABLE_MULTIPLE_ROUTING_MANAGERS EQUAL 0)
435install (
436    TARGETS ${VSOMEIP_NAME}-cfg
437    LIBRARY DESTINATION "${INSTALL_LIB_DIR}" COMPONENT shlib
438    RUNTIME DESTINATION "${INSTALL_BIN_DIR}" COMPONENT bin
439)
440endif ()
441
442install (
443    TARGETS ${VSOMEIP_NAME}-sd
444    LIBRARY DESTINATION "${INSTALL_LIB_DIR}" COMPONENT shlib
445    RUNTIME DESTINATION "${INSTALL_BIN_DIR}" COMPONENT bin
446)
447
448if (VSOMEIP_ENABLE_COMPAT EQUAL 1)
449install (
450    TARGETS ${VSOMEIP_COMPAT_NAME}
451    EXPORT vsomeipTargets
452    LIBRARY DESTINATION "${INSTALL_LIB_DIR}" COMPONENT shlib
453    RUNTIME DESTINATION "${INSTALL_BIN_DIR}" COMPONENT bin
454)
455
456export (TARGETS ${VSOMEIP_COMPAT_NAME} FILE "${PROJECT_BINARY_DIR}/vsomeipTargets.cmake")
457export (PACKAGE ${VSOMEIP_COMPAT_NAME})
458
459configure_file (vsomeipConfig.cmake.in "${PROJECT_BINARY_DIR}/vsomeipConfig.cmake" @ONLY)
460configure_file (vsomeipConfigVersion.cmake.in "${PROJECT_BINARY_DIR}/vsomeipConfigVersion.cmake" @ONLY)
461
462set (COMPAT_INSTALL_CMAKE_DIR "lib/cmake/${VSOMEIP_COMPAT_NAME}")
463
464install (
465    EXPORT vsomeipTargets
466    DESTINATION "${COMPAT_INSTALL_CMAKE_DIR}"
467    COMPONENT dev
468)
469
470install (
471    FILES
472    "${PROJECT_BINARY_DIR}/vsomeipConfig.cmake"
473    "${PROJECT_BINARY_DIR}/vsomeipConfigVersion.cmake"
474    DESTINATION "${COMPAT_INSTALL_CMAKE_DIR}"
475    COMPONENT dev
476)
477
478configure_file(vsomeip.pc.in ${PROJECT_BINARY_DIR}/vsomeip.pc @ONLY)
479install(FILES ${PROJECT_BINARY_DIR}/vsomeip.pc DESTINATION lib/pkgconfig)
480
481endif ()
482
483install (
484  FILES ${EXAMPLE_CONFIG_FILES} DESTINATION etc/vsomeip COMPONENT config
485)
486
487# Add all targets to the build-tree export set
488export (TARGETS ${VSOMEIP_NAME} FILE "${PROJECT_BINARY_DIR}/vsomeip3Targets.cmake")
489
490# Export the package for use from the build-tree
491# (this registers the build-tree with a global CMake-registry)
492export (PACKAGE ${VSOMEIP_NAME})
493
494# Create the vsomeip3Config.cmake and vsomeip3ConfigVersion files
495configure_file (vsomeip3Config.cmake.in "${PROJECT_BINARY_DIR}/vsomeip3Config.cmake" @ONLY)
496configure_file (vsomeip3ConfigVersion.cmake.in "${PROJECT_BINARY_DIR}/vsomeip3ConfigVersion.cmake" @ONLY)
497
498# configure internal.hpp for correct version number
499configure_file (
500   "${PROJECT_SOURCE_DIR}/implementation/configuration/include/internal.hpp.in"
501   "${PROJECT_SOURCE_DIR}/implementation/configuration/include/internal.hpp"
502)
503
504# Install the vsomeip3Config.cmake and vsomeip3ConfigVersion.cmake
505install (
506    FILES
507    "${PROJECT_BINARY_DIR}/vsomeip3Config.cmake"
508    "${PROJECT_BINARY_DIR}/vsomeip3ConfigVersion.cmake"
509    DESTINATION "${INSTALL_CMAKE_DIR}"
510    COMPONENT dev
511)
512
513# Install the export set for use with the install-tree
514install (
515    EXPORT vsomeip3Targets
516    DESTINATION "${INSTALL_CMAKE_DIR}"
517    COMPONENT dev
518)
519
520##############################################################################
521# build documentation
522##############################################################################
523add_custom_target(doc)
524
525find_package(Doxygen)
526if (NOT DOXYGEN_FOUND)
527    message(WARNING "Doxygen is not installed. Documentation can not be built.")
528else()
529    # set configuration variables for doxygen.in
530    set(PROJECT "vsomeip")
531    set(DOCDIR documentation)
532    set(SRCDIR .)
533    set(GENERATE_HTML YES)
534    set(GENERATE_HTMLHELP NO)
535    set(GENERATE_CHI NO)
536    set(GENERATE_LATEX NO)
537    set(GENERATE_PDF NO)
538    set(GENERATE_RTF NO)
539    set(GENERATE_MAN NO)
540    set(GENERATE_XML NO)
541    set(HAVE_DOT YES)
542
543    if(HAVE_DOT)
544        # Note: the @DOT_PATH@ variable won't be used in doxygen.in as doxygen
545        # somehow manages to strip the last slash from the path and therfore no
546        # graphs are generated. Therefore dot should be available in your $PATH
547        FIND_PROGRAM(DOT_PATH dot)
548        if ("${DOT_PATH}" STREQUAL "DOT_PATH-NOTFOUND")
549            message(WARNING "dot (graphviz) is not installed. Graphs in documentation can't be generated.")
550        else()
551            message("dot found")
552        endif()
553    endif()
554
555    configure_file(documentation/doxygen.in ${PROJECT_BINARY_DIR}/Doxyfile @ONLY)
556    add_custom_target(doxygen-doc
557                      COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_BINARY_DIR}/Doxyfile
558                      SOURCES ${PROJECT_BINARY_DIR}/Doxyfile)
559
560    add_dependencies(doc doxygen-doc)
561endif()
562
563find_program(ASCIIDOC_PATH asciidoc)
564find_program(SOURCE_HIGHLIGHT_PATH source-highlight)
565if ("${ASCIIDOC_PATH}" STREQUAL "ASCIIDOC_PATH-NOTFOUND")
566    message(WARNING "asciidoc is not installed. Readme can not be built.")
567elseif("${SOURCE_HIGHLIGHT_PATH}" STREQUAL "SOURCE_HIGHLIGHT_PATH-NOTFOUND")
568    message(WARNING "source-highlight is not installed. Readme can not be built.")
569else()
570    message("asciidoc found")
571    message("source-highlight found")
572    add_custom_command(TARGET doc
573                       POST_BUILD
574                       COMMAND asciidoc
575                               -a version=${VSOMEIP_VERSION}
576                               -b html
577                               -o documentation/vsomeipUserGuide.html
578                               ${PROJECT_SOURCE_DIR}/documentation/vsomeipUserGuide)
579endif()
580
581##############################################################################
582# create pkg-config file
583if(NOT WIN32)
584        configure_file(vsomeip3.pc.in ${PROJECT_BINARY_DIR}/vsomeip3.pc @ONLY)
585        install(FILES ${PROJECT_BINARY_DIR}/vsomeip3.pc DESTINATION lib/pkgconfig)
586endif()
587
588##############################################################################
589if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Android")
590    # build routing manager daemon (Non-Windows only)
591    if (NOT MSVC)
592    add_subdirectory( examples/routingmanagerd )
593    endif()
594
595    # build tools
596    add_custom_target( tools )
597    add_subdirectory( tools )
598
599    # build examples
600    add_custom_target( examples )
601    add_subdirectory( examples EXCLUDE_FROM_ALL )
602    add_custom_target( hello_world )
603    add_subdirectory( examples/hello_world  EXCLUDE_FROM_ALL )
604endif()
605
606##############################################################################
607# Test section
608##############################################################################
609
610##############################################################################
611# google test
612
613# check for set environment variable
614if(${GTEST_ROOT} STREQUAL "n/a")
615    message(STATUS "GTEST_ROOT is not defined. For building the tests the variable
616             GTEST_ROOT has to be defined. Tests can not be built.")
617    # early exit
618    return()  # test can not be build -> make commands build_tests and check are not available
619else()
620    message(STATUS "GTEST_ROOT is set. gtest root path set to ${GTEST_ROOT}")
621endif()
622
623# build google test as static library (always) -> therefore deactivate BUILD_SHARED_LIBS in case it is active
624set(BUILD_SHARED_LIBS_AUTOMATIC_OFF 0)
625if ("${BUILD_SHARED_LIBS}" STREQUAL "ON")
626    set(BUILD_SHARED_LIBS OFF)
627    set(BUILD_SHARED_LIBS_AUTOMATIC_OFF 1)
628endif()
629add_subdirectory(${GTEST_ROOT} ${CMAKE_CURRENT_BINARY_DIR}/gtest EXCLUDE_FROM_ALL)
630if ("${BUILD_SHARED_LIBS_AUTOMATIC_OFF}" STREQUAL "1")
631    set(BUILD_SHARED_LIBS ON)
632    set(BUILD_SHARED_LIBS_AUTOMATIC_OFF 0)
633endif()
634
635
636
637##############################################################################
638# build tests
639
640enable_testing()
641SET(TESTS_BAT "OFF" CACHE BOOL
642    "Controls whether only BAT tests should be build or not")
643SET(TEST_SYMLINK_CONFIG_FILES "OFF" CACHE BOOL
644    "Controls if the json and scripts needed needed to run the tests are copied or symlinked into the build directroy (ignored on Windows)")
645SET(TEST_SYMLINK_CONFIG_FILES_RELATIVE "OFF" CACHE BOOL
646    "Controls if the json and scripts needed needed to run the tests are symlinked relatively into the build directroy (ignored on Windows)")
647
648SET(TEST_IP_DEFAULT_VALUE "XXX.XXX.XXX.XXX")
649SET(TEST_IP_MASTER "${TEST_IP_DEFAULT_VALUE}" CACHE STRING
650    "The IP address of the interface which will act as test master")
651SET(TEST_IP_SLAVE "${TEST_IP_DEFAULT_VALUE}" CACHE STRING
652    "The IP address of the interface which will act as test slave")
653
654if((${TEST_IP_MASTER} STREQUAL ${TEST_IP_DEFAULT_VALUE}) OR
655   (${TEST_IP_SLAVE}  STREQUAL ${TEST_IP_DEFAULT_VALUE}))
656    message(WARNING "TEST_IP_MASTER and/or TEST_IP_SLAVE isn't set. "
657                    "Only local tests will be runnable "
658                    "Please specify them via for example "
659                    "-DTEST_IP_MASTER=10.0.3.1 -DTEST_IP_SLAVE=10.0.3.125")
660endif()
661
662SET(TEST_IP_SLAVE_SECOND "${TEST_IP_DEFAULT_VALUE}" CACHE STRING
663    "The second IP address of the interface which will act as test slave")
664set(TEST_SECOND_ADDRESS "OFF" CACHE BOOL
665    "Controls whether second address tests should run or not")
666
667if(${TEST_IP_SLAVE_SECOND} STREQUAL ${TEST_IP_DEFAULT_VALUE})
668    message(WARNING "TEST_IP_SLAVE_SECOND isn't set. "
669                    "Test with more than one IP address on same interface is not enabled."
670                    "Please specify them via for example "
671                    "-TEST_IP_SLAVE_SECOND=10.0.3.126")
672else()
673    set(TEST_SECOND_ADDRESS "ON")
674endif()
675
676set(TEST_E2E_PROFILE_04 "OFF" CACHE BOOL
677    "Controls whether E2E Profile 04 tests should run or not")
678if (ENABLE_SESSION_HANDLING_CONFIG)
679    set(TEST_E2E_PROFILE_04 "ON")
680else ()
681    message(WARNING "ENABLE_SESSION_HANDLING_CONFIG isn't set. "
682                    "Test of E2E Profile 04 is not enabled.")
683endif ()
684
685
686SET(TEST_UID_DEFAULT_VALUE "123456789")
687SET(TEST_UID "${TEST_UID_DEFAULT_VALUE}" CACHE STRING
688    "The User ID of the user running the test: Needed for security")
689SET(TEST_GID_DEFAULT_VALUE "123456789")
690SET(TEST_GID "${TEST_GID_DEFAULT_VALUE}" CACHE STRING
691    "The Group ID of the user running the test: Needed for security")
692
693SET(TEST_SECURITY "ON" CACHE BOOL
694    "Controls whether security tests should run or not")
695
696if((${TEST_UID} STREQUAL ${TEST_UID_DEFAULT_VALUE}) OR
697   (${TEST_GID}  STREQUAL ${TEST_GID_DEFAULT_VALUE}))
698    message(WARNING "TEST_UID and/or TEST_GID isn't set. "
699                    "Security Tests are not runnable "
700                    "Please specify them for example "
701                    "-DTEST_UID=1000 -DTEST_GID=1000")
702    SET(TEST_SECURITY "OFF")
703endif()
704
705add_custom_target(build_tests)
706add_dependencies(build_tests vsomeip3)
707add_dependencies(build_tests vsomeip3-e2e)
708add_dependencies(build_tests vsomeip3-sd)
709
710set(CMAKE_CTEST_COMMAND ctest -V)
711add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
712add_dependencies(check build_tests)
713
714##############################################################################
715# add test directory
716
717add_subdirectory( test EXCLUDE_FROM_ALL )
718