Version 0.4.0
[marnav.git] / CMakeLists.txt
blob7300615fcd7bddd396a2d92ba43cc2d9fcd1b86f
1 cmake_minimum_required(VERSION 3.2)
3 set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
4 include(GitInformation)
6 project(marnav VERSION 0.4.0 LANGUAGES CXX C)
8 ### compiler check
9 if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
10         message(STATUS "Compiler: GNU")
11 elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
12         message(STATUS "Compiler: Clang")
13 else()
14         message(FATAL_ERROR "Unsupported compiler detected: ${CMAKE_CXX_COMPILER_ID}")
15 endif()
17 ### versin handling
18 if(NOT ("${CMAKE_BUILD_TYPE}" STREQUAL "Release"))
19         set(PROJECT_VERSION "${PROJECT_VERSION}-${GIT_COMMIT_HASH_SHORT}")
20 endif()
21 message(STATUS "Project Vesion: ${PROJECT_VERSION}")
23 ### external projects
24 include(ExternalProject)
25 include(ExternGmock)
26 include(ExternBenchmark)
28 ### options
29 option(ENABLE_PROFILING "Enable Profiling" OFF)
30 option(ENABLE_BENCHMARK "Enable Benchmark" OFF)
31 option(ENABLE_WARNING_HELL "Enable Warning Hell" OFF)
32 option(ENABLE_AIS "Enable AIS support" ON)
33 option(ENABLE_SEATALK "Enable SeaTalk support" ON)
34 option(ENABLE_IO "Enable IO support" ON)
36 ### common
37 message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")
38 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
39 file(MAKE_DIRECTORY
40         ${CMAKE_CURRENT_BINARY_DIR}/doc
41         ${CMAKE_CURRENT_BINARY_DIR}/doc/coverage
42         ${CMAKE_CURRENT_BINARY_DIR}/local/include
43         )
45 ### library
46 add_subdirectory(src)
48 ### examples
49 add_subdirectory(examples)
51 ### ctags / cscope
52 find_program(CTAGS_PATH ctags)
53 find_program(CSCOPE_PATH cscope)
54 if(CTAGS_PATH AND CSCOPE_PATH)
55         message(STATUS "Found ctags: ${CTAGS_PATH}")
56         message(STATUS "Found cscope: ${CSCOPE_PATH}")
58         set_source_files_properties(cscope.files PROPERTIES GENERATED true)
59         set_source_files_properties(cscope.out PROPERTIES GENERATED true)
60         set_source_files_properties(tags PROPERTIES GENERATED true)
62         file(GLOB_RECURSE SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.?pp")
63         string(REPLACE ";" "\n" SOURCE_FILES "${SOURCE_FILES}")
64         file(WRITE "${CMAKE_BINARY_DIR}/cscope.files.in" "${SOURCE_FILES}")
65         configure_file("${CMAKE_BINARY_DIR}/cscope.files.in" "${CMAKE_BINARY_DIR}/cscope.files" COPYONLY)
67         add_custom_target(tags
68                 COMMAND ${CTAGS_PATH} --c++-kinds=+p --fields=+iaS --extra=+q -L ${CMAKE_BINARY_DIR}/cscope.files
69                 COMMAND ${CSCOPE_PATH} -b
70                 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
71                 )
72 endif()
74 ### documentation
75 find_package(Doxygen)
76 if(DOXYGEN_FOUND)
77         configure_file(
78                 ${CMAKE_CURRENT_SOURCE_DIR}/doc/main.dox.in
79                 ${CMAKE_CURRENT_BINARY_DIR}/doc/main.dox
80                 )
81         configure_file(
82                 ${CMAKE_CURRENT_SOURCE_DIR}/doxygen.conf.in
83                 ${CMAKE_CURRENT_BINARY_DIR}/doxygen.conf
84                 )
85         add_custom_target(doc
86                 COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/doxygen.conf
87                 )
88         add_dependencies(doc tags)
89 endif()
91 ### cppcheck
92 find_program(CPPCHECK_PATH cppcheck)
93 if(CPPCHECK_PATH)
94         message(STATUS "cppcheck found: ${CPPCHECK_PATH}")
95         add_custom_target(cppcheck
96                 COMMAND ${CPPCHECK_PATH} --suppressions-list=${CMAKE_CURRENT_SOURCE_DIR}/cppcheck-suppress.txt --std=c++11 --platform=unix32 -v -f --enable=all --template='{file}:{line},{severity},{id},{message}' -I ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/test 2> ${CMAKE_CURRENT_BINARY_DIR}/doc/cppcheck.txt
97                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
98         )
99 else()
100         message(STATUS "cppcheck not found, target not available.")
101 endif()
103 ### testing common stuff
104 enable_testing()
106 ### unit tests, assumes gtest (because of the program argument)
107 add_custom_target(unittest)
108 macro(run_unittest unittest_target)
109         add_custom_target(${unittest_target}_runtest
110                 COMMAND ${unittest_target} --gtest_shuffle
111                 DEPENDS ${unittest_target}
112                 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
113                 )
114         add_dependencies(unittest ${unittest_target}_runtest)
115 endmacro()
117 add_subdirectory(test)
119 ### coverage
120 if (CMAKE_BUILD_TYPE STREQUAL "Coverage")
121         include(CodeCoverage)
122         setup_target_for_coverage(coverage
123                 testrunner
124                 doc/coverage
125                 )
126 endif()
129 ### package
130 set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
131 set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
132 set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
133 set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
134 set(CPACK_PACKAGE_NAME "marnav")
135 set(CPACK_PACKAGE_VENDOR "Mario Konrad")
136 set(CPACK_PACKAGE_CONTACT "Mario Konrad <mario.konrad@gmx.net>")
137 set(CPACK_PACAKGE_DESCRIPTION "Library for maritime navigation.")
138 set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Library")
139 set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
140 set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
141 set(CPACK_MONOLITHIC_INSTALL 1)
142 #set(CPACK_PACKAGE_EXECUTABLES "??" "??")
143 set(CPACK_STRIP_FILES true)
145 # package: debian
146 set(CPACK_DEBIAN_PACKAGE_NAME ${CPACK_DEBIAN_PACKAGE_NAME})
147 set(CPACK_DEBIAN_PACKAGE_MAINTAINER ${CPACK_PACKAGE_CONTACT})
148 set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${CPACK_PACAKGE_DESCRIPTION})
149 set(CPACK_DEBIAN_PACKAGE_DEPENDS "libstdc++6 (>= 4.8)")
150 set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.3)")
151 set(CPACK_DEBIAN_PACKAGE_SECTION "misc")
152 if (CMAKE_SIZEOF_VOID_P MATCHES "8")
153         set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
154 else()
155         set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "i386")
156 endif()
158 include(CPack)