Build: add GCC-13, Clang-14, Clang-15, Clang-16, Clang-17
[marnav.git] / CMakeLists.txt
blobd130bfda15bb9df952b4267363b3e71a8f100b83
1 cmake_minimum_required(VERSION 3.19)
3 project(marnav
4         VERSION 0.14.0
5         LANGUAGES CXX C
6         DESCRIPTION "Library for maritime navigation."
7         )
9 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
10 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}")
11 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
13 # compilation traits
14 set(CMAKE_CXX_STANDARD 17)
15 set(CMAKE_CXX_STANDARD_REQUIRED ON)
16 set(CMAKE_CXX_EXTENSIONS OFF)
17 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
19 ### options
20 option(ENABLE_STATIC "Enable static library" ON)
21 option(ENABLE_EXAMPLES "Enable Examples" ON)
22 option(ENABLE_TESTS "Enable Tests" ON)
23 option(ENABLE_TOOLS "Enable Tools" ON)
25 if(MSVC)
26         set(CMAKE_DEBUG_POSTFIX "d")
28         set(ENABLE_PROFILING OFF)
29         set(ENABLE_BENCHMARK OFF)
30         set(ENABLE_SANITIZER OFF)
31         set(ENABLE_TESTS_BENCHMARK OFF)
32         set(ENABLE_IWYU OFF)
34         set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
35         set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
36         set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
37         set(CMAKE_PDB_OUTPUT_DIRECTORY     "${CMAKE_BINARY_DIR}/bin")
38 else()
39         option(ENABLE_PROFILING "Enable Profiling" OFF)
40         option(ENABLE_BENCHMARK "Enable Benchmark" OFF)
41         option(ENABLE_SANITIZER "Enable Sanitizing (address, undefined)" OFF)
42         option(ENABLE_TESTS_BENCHMARK "Enable Test Benchmarks" ON)
43         option(ENABLE_IWYU "Enable include-what-you-use" OFF)
44 endif()
46 if(NOT DEFINED BUILD_SHARED_LIBS)
47         if(ENABLE_STATIC)
48                 set(BUILD_SHARED_LIBS FALSE)
49         else()
50                 set(BUILD_SHARED_LIBS TRUE)
51         endif()
52 endif()
54 if(ENABLE_TESTS)
55         set(BUILD_TESTING TRUE)
56         enable_testing()
57 else()
58         set(BUILD_TESTING FALSE)
59 endif()
61 # misc
62 include(RepoInformation)
63 include(Documentation)
64 include(CppCheck)
65 include(FetchContent)
67 if(ENABLE_TOOLS)
68         set(CXXOPTS_BUILD_EXAMPLES FALSE CACHE BOOL "" FORCE)
69         set(CXXOPTS_BUILD_TESTS FALSE CACHE BOOL "" FORCE)
70         FetchContent_Declare(cxxopts
71                 URL "${CMAKE_CURRENT_SOURCE_DIR}/extern/cxxopts"
72                 )
73         FetchContent_MakeAvailable(cxxopts)
75         set(FMT_INSTALL TRUE CACHE BOOL "" FORCE)
76         FetchContent_Declare(fmt
77                 URL "${CMAKE_CURRENT_SOURCE_DIR}/extern/fmt"
78                 )
79         FetchContent_MakeAvailable(fmt)
80 endif()
82 ### common
83 message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")
84 file(MAKE_DIRECTORY
85         ${CMAKE_CURRENT_BINARY_DIR}/doc
86         ${CMAKE_CURRENT_BINARY_DIR}/doc/coverage
87         ${CMAKE_CURRENT_BINARY_DIR}/local/include
88         )
90 ### library and tools
91 add_subdirectory(src)
93 ### examples
94 message(STATUS "Build Examples       : ${ENABLE_EXAMPLES}")
95 if(ENABLE_EXAMPLES)
96         add_subdirectory(examples)
97 endif()
99 ### testing
100 message(STATUS "Build Tests          : ${ENABLE_TESTS}")
101 message(STATUS "Build Tests Benchmark: ${ENABLE_TESTS_BENCHMARK}")
102 if(ENABLE_TESTS)
103         if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^ARM$|^aarch64$")
104                 set(gtest_disable_pthreads TRUE CACHE BOOL "" FORCE)
105         endif()
106         FetchContent_Declare(googletest
107                 URL "${CMAKE_CURRENT_SOURCE_DIR}/extern/googletest-1.11.0"
108                 )
109         FetchContent_MakeAvailable(googletest)
111         if(ENABLE_TESTS_BENCHMARK)
112                 set(BENCHMARK_ENABLE_TESTING FALSE CACHE BOOL "" FORCE)
113                 set(BENCHMARK_ENABLE_GTEST_TESTS FALSE CACHE BOOL "" FORCE)
114                 FetchContent_Declare(benchmark
115                         URL "${CMAKE_CURRENT_SOURCE_DIR}/extern/benchmark-1.6.0"
116                         )
117                 FetchContent_MakeAvailable(benchmark)
118         endif()
120         add_subdirectory(test)
121 endif()
123 ### coverage
124 if(CMAKE_BUILD_TYPE MATCHES Coverage)
125         include(CodeCoverage)
126         setup_target_for_coverage(coverage
127                 testrunner
128                 doc/coverage
129                 )
130 endif()
132 set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
133 set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
134 set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
135 set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
136 set(CPACK_PACKAGE_NAME "marnav")
137 set(CPACK_PACKAGE_VENDOR "Mario Konrad")
138 set(CPACK_PACKAGE_CONTACT "Mario Konrad <mario.konrad@gmx.net>")
139 set(CPACK_PACAKGE_DESCRIPTION "Library for maritime navigation.")
140 set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Library")
141 set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
142 set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
143 set(CPACK_MONOLITHIC_INSTALL 1)
144 #set(CPACK_PACKAGE_EXECUTABLES "??" "??")
145 set(CPACK_STRIP_FILES true)
147 # package: debian
148 set(CPACK_DEBIAN_PACKAGE_NAME ${CPACK_DEBIAN_PACKAGE_NAME})
149 set(CPACK_DEBIAN_PACKAGE_MAINTAINER ${CPACK_PACKAGE_CONTACT})
150 set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${CPACK_PACAKGE_DESCRIPTION})
151 set(CPACK_DEBIAN_PACKAGE_DEPENDS "libstdc++6 (>= 7.0)")
152 set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.3)")
153 set(CPACK_DEBIAN_PACKAGE_SECTION "misc")
154 if (CMAKE_SIZEOF_VOID_P MATCHES "8")
155         set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
156 else()
157         set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "i386")
158 endif()
160 include(CPack)