Build: build script handles configured build directory.
[marnav.git] / src / CMakeLists.txt
blob8620d22fb2f70a18350c1b351fcb9250dc111818
1 cmake_minimum_required(VERSION 3.2)
3 option(ENABLE_STATIC "Enable static library" ON)
5 ### lib: marnav
7 if(${ENABLE_STATIC})
8         set(LIBRARY_TYPE "STATIC")
9 else()
10         set(LIBRARY_TYPE "SHARED")
11 endif()
12 message(STATUS "Build library type: ${LIBRARY_TYPE}")
14 message(STATUS "Build AIS support    : ${ENABLE_AIS}")
15 message(STATUS "Build SeaTalk support: ${ENABLE_SEATALK}")
16 message(STATUS "Build IO support     : ${ENABLE_IO}")
18 configure_file(
19         ${CMAKE_CURRENT_SOURCE_DIR}/marnav/version.hpp.in
20         ${CMAKE_CURRENT_BINARY_DIR}/marnav/version.hpp
21         )
23 set(SOURCES
24         # intentionally left blank
25         )
27 if(ENABLE_SEATALK)
28         set(SOURCES ${SOURCES}
29                 marnav/seatalk/seatalk.cpp
30                 marnav/seatalk/message.cpp
31                 marnav/seatalk/message_00.cpp
32                 marnav/seatalk/message_01.cpp
33                 marnav/seatalk/message_05.cpp
34                 marnav/seatalk/message_10.cpp
35                 marnav/seatalk/message_11.cpp
36                 marnav/seatalk/message_20.cpp
37                 marnav/seatalk/message_21.cpp
38                 marnav/seatalk/message_22.cpp
39                 marnav/seatalk/message_23.cpp
40                 marnav/seatalk/message_24.cpp
41                 marnav/seatalk/message_25.cpp
42                 marnav/seatalk/message_26.cpp
43                 marnav/seatalk/message_27.cpp
44                 marnav/seatalk/message_30.cpp
45                 marnav/seatalk/message_36.cpp
46                 marnav/seatalk/message_38.cpp
47                 marnav/seatalk/message_50.cpp
48                 marnav/seatalk/message_51.cpp
49                 marnav/seatalk/message_52.cpp
50                 marnav/seatalk/message_53.cpp
51                 marnav/seatalk/message_54.cpp
52                 marnav/seatalk/message_56.cpp
53                 marnav/seatalk/message_58.cpp
54                 marnav/seatalk/message_59.cpp
55                 marnav/seatalk/message_65.cpp
56                 marnav/seatalk/message_66.cpp
57                 marnav/seatalk/message_6c.cpp
58                 marnav/seatalk/message_86.cpp
59                 marnav/seatalk/message_87.cpp
60                 marnav/seatalk/message_89.cpp
61                 )
62 endif()
64 if(ENABLE_AIS)
65         set(SOURCES ${SOURCES}
66                 marnav/ais/ais.cpp
67                 marnav/ais/angle.cpp
68                 marnav/ais/name.cpp
69                 marnav/ais/message.cpp
70                 marnav/ais/message_01.cpp
71                 marnav/ais/message_02.cpp
72                 marnav/ais/message_03.cpp
73                 marnav/ais/message_04.cpp
74                 marnav/ais/message_05.cpp
75                 marnav/ais/message_09.cpp
76                 marnav/ais/message_10.cpp
77                 marnav/ais/message_11.cpp
78                 marnav/ais/message_18.cpp
79                 marnav/ais/message_19.cpp
80                 marnav/ais/message_21.cpp
81                 marnav/ais/message_22.cpp
82                 marnav/ais/message_23.cpp
83                 marnav/ais/message_24.cpp
84                 )
85 endif()
87 if(ENABLE_IO)
88         set(SOURCES ${SOURCES}
89                 marnav/io/serial.cpp
90                 marnav/io/nmea_reader.cpp
91                 marnav/io/default_nmea_reader.cpp
92                 )
94         if(ENABLE_SEATALK)
95                 set(SOURCES ${SOURCES}
96                         marnav/io/seatalk_reader.cpp
97                         marnav/io/default_seatalk_reader.cpp
98                         )
99         endif()
100 endif()
102 add_library(marnav ${LIBRARY_TYPE}
103         marnav/math/floatingpoint.hpp
104         marnav/math/vector.hpp
105         marnav/math/matrix.hpp
106         marnav/math/quaternion.hpp
107         marnav/utils/mmsi.cpp
108         marnav/geo/angle.cpp
109         marnav/geo/position.cpp
110         marnav/geo/region.cpp
111         marnav/geo/cpa.cpp
112         marnav/geo/geodesic.cpp
113         marnav/nmea/waypoint.cpp
114         marnav/nmea/convert.cpp
115         marnav/nmea/manufacturer.cpp
116         marnav/nmea/checks.cpp
117         marnav/nmea/split.cpp
118         marnav/nmea/angle.cpp
119         marnav/nmea/string.cpp
120         marnav/nmea/name.cpp
121         marnav/nmea/io.cpp
122         marnav/nmea/date.cpp
123         marnav/nmea/time.cpp
124         marnav/nmea/checksum.cpp
125         marnav/nmea/sentence.cpp
126         marnav/nmea/detail.cpp
127         marnav/nmea/ais_helper.cpp
128         marnav/nmea/nmea.cpp
129         marnav/nmea/aam.cpp
130         marnav/nmea/alm.cpp
131         marnav/nmea/apa.cpp
132         marnav/nmea/apb.cpp
133         marnav/nmea/bod.cpp
134         marnav/nmea/bwc.cpp
135         marnav/nmea/bww.cpp
136         marnav/nmea/bwr.cpp
137         marnav/nmea/dbk.cpp
138         marnav/nmea/dbt.cpp
139         marnav/nmea/dpt.cpp
140         marnav/nmea/dsc.cpp
141         marnav/nmea/dse.cpp
142         marnav/nmea/dtm.cpp
143         marnav/nmea/fsi.cpp
144         marnav/nmea/gbs.cpp
145         marnav/nmea/gga.cpp
146         marnav/nmea/glc.cpp
147         marnav/nmea/gll.cpp
148         marnav/nmea/gns.cpp
149         marnav/nmea/grs.cpp
150         marnav/nmea/gsa.cpp
151         marnav/nmea/gst.cpp
152         marnav/nmea/gsv.cpp
153         marnav/nmea/gtd.cpp
154         marnav/nmea/hdg.cpp
155         marnav/nmea/hfb.cpp
156         marnav/nmea/hdm.cpp
157         marnav/nmea/hdt.cpp
158         marnav/nmea/hsc.cpp
159         marnav/nmea/its.cpp
160         marnav/nmea/lcd.cpp
161         marnav/nmea/msk.cpp
162         marnav/nmea/mss.cpp
163         marnav/nmea/mtw.cpp
164         marnav/nmea/mwd.cpp
165         marnav/nmea/mwv.cpp
166         marnav/nmea/osd.cpp
167         marnav/nmea/r00.cpp
168         marnav/nmea/rma.cpp
169         marnav/nmea/rmb.cpp
170         marnav/nmea/rmc.cpp
171         marnav/nmea/rot.cpp
172         marnav/nmea/rpm.cpp
173         marnav/nmea/rsa.cpp
174         marnav/nmea/rsd.cpp
175         marnav/nmea/rte.cpp
176         marnav/nmea/sfi.cpp
177         marnav/nmea/tds.cpp
178         marnav/nmea/tfi.cpp
179         marnav/nmea/tll.cpp
180         marnav/nmea/tpc.cpp
181         marnav/nmea/tpr.cpp
182         marnav/nmea/tpt.cpp
183         marnav/nmea/ttm.cpp
184         marnav/nmea/vbw.cpp
185         marnav/nmea/vdm.cpp
186         marnav/nmea/vdo.cpp
187         marnav/nmea/vdr.cpp
188         marnav/nmea/vhw.cpp
189         marnav/nmea/vlw.cpp
190         marnav/nmea/vpw.cpp
191         marnav/nmea/vtg.cpp
192         marnav/nmea/vwr.cpp
193         marnav/nmea/wcv.cpp
194         marnav/nmea/wnc.cpp
195         marnav/nmea/wpl.cpp
196         marnav/nmea/xdr.cpp
197         marnav/nmea/xte.cpp
198         marnav/nmea/xtr.cpp
199         marnav/nmea/zda.cpp
200         marnav/nmea/zdl.cpp
201         marnav/nmea/zfo.cpp
202         marnav/nmea/ztg.cpp
203         marnav/nmea/pgrme.cpp
204         marnav/nmea/pgrmm.cpp
205         marnav/nmea/pgrmz.cpp
206         ${SOURCES}
207         )
209 target_include_directories(marnav
210         PRIVATE
211                 ${CMAKE_CURRENT_SOURCE_DIR}
212                 ${CMAKE_CURRENT_BINARY_DIR}
213         )
215 target_compile_options(marnav
216         PRIVATE
217                 -pipe
218                 -ggdb
219                 -Wall
220                 -Wextra
221                 -pedantic-errors
222                 -Wold-style-cast
223         )
224 if(ENABLE_PROFILING)
225         target_compile_options(marnav
226                 PUBLIC
227                         -pg
228                 )
229 endif()
230 if(ENABLE_BENCHMARK)
231         target_compile_options(marnav
232                 PUBLIC
233                         -fno-omit-frame-pointer
234                 )
235 endif()
236 if(ENABLE_WARNING_HELL)
237         message(STATUS "Behold: entering the hell of extended warnings")
238         target_compile_options(marnav
239                 PRIVATE
240                         # some are not enabled on purpose
241                         -Wcast-align
242                         -Wcast-qual
243                         -Werror
244                         -Wdisabled-optimization
245                         -Wfloat-equal
246                         -Wformat=2
247                         -Wformat-security
248                         -Wformat-y2k
249                         -Wimport
250                         -Winit-self
251                         -Winline
252                         -Wmissing-field-initializers
253                         -Wmissing-format-attribute
254                         -Wmissing-include-dirs
255                         -Wmissing-noreturn
256                         -Woverloaded-virtual
257                         -Wpacked
258                         -Wpointer-arith
259                         -Wredundant-decls
260                         -Wstrict-aliasing=2
261                         -Wswitch
262                         -Wunreachable-code
263                         -Wunused
264                         -Wunused-parameter
265                         -Wvariadic-macros
266                         -Wwrite-strings
267                         # explicitly disabled on purpose:
268                         #-Wconversion
269                         #-Wsign-conversion
270                         #-Wstack-protector
271                         -Wno-effc++
272                         -Wno-padded
273                         -Wno-long-long
274                         -Wno-unused-function
275                         -Wno-comment
276                         -Wno-format-nonliteral
277                         -Wno-shadow
278                         -Wno-switch-enum
279                         -Wno-switch-default
280                 )
281 endif()
283 if(build_type_lower MATCHES coverage)
284         message(STATUS "Coverage: enabled")
285         target_compile_options(marnav
286                 PUBLIC
287                         --coverage
288                         -fprofile-arcs
289                         -ftest-coverage
290                         -fno-inline
291                         -fno-inline-small-functions
292                         -fno-default-inline
293                 )
294 endif()
296 set_target_properties(marnav
297         PROPERTIES VERSION "${PROJECT_VERSION}"
298         SOVERSION "${PROJECT_VERSION}"
299         )
301 install(
302         TARGETS marnav
303         LIBRARY DESTINATION lib
304         ARCHIVE DESTINATION lib
305         RUNTIME DESTINATION bin
306         )
308 install(
309         FILES
310                 ${CMAKE_CURRENT_BINARY_DIR}/marnav/version.hpp
311         DESTINATION include/marnav
312         )
314 install(
315         FILES
316                 marnav/nmea/constants.hpp
317                 marnav/nmea/talker_id.hpp
318                 marnav/nmea/sentence_id.hpp
319                 marnav/nmea/convert.hpp
320                 marnav/nmea/waypoint.hpp
321                 marnav/nmea/manufacturer.hpp
322                 marnav/nmea/angle.hpp
323                 marnav/nmea/string.hpp
324                 marnav/nmea/name.hpp
325                 marnav/nmea/io.hpp
326                 marnav/nmea/date.hpp
327                 marnav/nmea/time.hpp
328                 marnav/nmea/checksum.hpp
329                 marnav/nmea/sentence.hpp
330                 marnav/nmea/detail.hpp
331                 marnav/nmea/ais_helper.hpp
332                 marnav/nmea/nmea.hpp
333                 marnav/nmea/aam.hpp
334                 marnav/nmea/alm.hpp
335                 marnav/nmea/apa.hpp
336                 marnav/nmea/apb.hpp
337                 marnav/nmea/bod.hpp
338                 marnav/nmea/bwc.hpp
339                 marnav/nmea/bww.hpp
340                 marnav/nmea/bwr.hpp
341                 marnav/nmea/dbk.hpp
342                 marnav/nmea/dbt.hpp
343                 marnav/nmea/dpt.hpp
344                 marnav/nmea/dsc.hpp
345                 marnav/nmea/dse.hpp
346                 marnav/nmea/dtm.hpp
347                 marnav/nmea/fsi.hpp
348                 marnav/nmea/gbs.hpp
349                 marnav/nmea/gga.hpp
350                 marnav/nmea/glc.hpp
351                 marnav/nmea/gll.hpp
352                 marnav/nmea/gns.hpp
353                 marnav/nmea/grs.hpp
354                 marnav/nmea/gsa.hpp
355                 marnav/nmea/gst.hpp
356                 marnav/nmea/gsv.hpp
357                 marnav/nmea/gtd.hpp
358                 marnav/nmea/hdg.hpp
359                 marnav/nmea/hfb.hpp
360                 marnav/nmea/hdm.hpp
361                 marnav/nmea/hdt.hpp
362                 marnav/nmea/hsc.hpp
363                 marnav/nmea/its.hpp
364                 marnav/nmea/lcd.hpp
365                 marnav/nmea/msk.hpp
366                 marnav/nmea/mss.hpp
367                 marnav/nmea/mtw.hpp
368                 marnav/nmea/mwd.hpp
369                 marnav/nmea/mwv.hpp
370                 marnav/nmea/osd.hpp
371                 marnav/nmea/r00.hpp
372                 marnav/nmea/rma.hpp
373                 marnav/nmea/rmb.hpp
374                 marnav/nmea/rmc.hpp
375                 marnav/nmea/rot.hpp
376                 marnav/nmea/rpm.hpp
377                 marnav/nmea/rsa.hpp
378                 marnav/nmea/rsd.hpp
379                 marnav/nmea/rte.hpp
380                 marnav/nmea/sfi.hpp
381                 marnav/nmea/tds.hpp
382                 marnav/nmea/tfi.hpp
383                 marnav/nmea/tll.hpp
384                 marnav/nmea/tpc.hpp
385                 marnav/nmea/tpr.hpp
386                 marnav/nmea/tpt.hpp
387                 marnav/nmea/ttm.hpp
388                 marnav/nmea/vbw.hpp
389                 marnav/nmea/vdm.hpp
390                 marnav/nmea/vdo.hpp
391                 marnav/nmea/vdr.hpp
392                 marnav/nmea/vhw.hpp
393                 marnav/nmea/vlw.hpp
394                 marnav/nmea/vpw.hpp
395                 marnav/nmea/vtg.hpp
396                 marnav/nmea/vwr.hpp
397                 marnav/nmea/wcv.hpp
398                 marnav/nmea/wnc.hpp
399                 marnav/nmea/wpl.hpp
400                 marnav/nmea/xdr.hpp
401                 marnav/nmea/xte.hpp
402                 marnav/nmea/xtr.hpp
403                 marnav/nmea/zda.hpp
404                 marnav/nmea/zdl.hpp
405                 marnav/nmea/zfo.hpp
406                 marnav/nmea/ztg.hpp
407                 marnav/nmea/pgrme.hpp
408         DESTINATION include/marnav/nmea
409         )
411 if(ENABLE_AIS)
412         install(
413                 FILES
414                         marnav/ais/ais.hpp
415                         marnav/ais/angle.hpp
416                         marnav/ais/name.hpp
417                         marnav/ais/message.hpp
418                         marnav/ais/message_01.hpp
419                         marnav/ais/message_02.hpp
420                         marnav/ais/message_03.hpp
421                         marnav/ais/message_04.hpp
422                         marnav/ais/message_05.hpp
423                         marnav/ais/message_09.hpp
424                         marnav/ais/message_10.hpp
425                         marnav/ais/message_11.hpp
426                         marnav/ais/message_18.hpp
427                         marnav/ais/message_19.hpp
428                         marnav/ais/message_21.hpp
429                         marnav/ais/message_22.hpp
430                         marnav/ais/message_23.hpp
431                         marnav/ais/message_24.hpp
432                 DESTINATION include/marnav/ais
433                 )
434 endif()
436 if(ENABLE_SEATALK)
437         install(
438                 FILES
439                         marnav/seatalk/key.hpp
440                         marnav/seatalk/equipment.hpp
441                         marnav/seatalk/seatalk.hpp
442                         marnav/seatalk/message.hpp
443                         marnav/seatalk/message_00.hpp
444                         marnav/seatalk/message_01.hpp
445                         marnav/seatalk/message_05.hpp
446                         marnav/seatalk/message_10.hpp
447                         marnav/seatalk/message_11.hpp
448                         marnav/seatalk/message_20.hpp
449                         marnav/seatalk/message_21.hpp
450                         marnav/seatalk/message_22.hpp
451                         marnav/seatalk/message_23.hpp
452                         marnav/seatalk/message_24.hpp
453                         marnav/seatalk/message_25.hpp
454                         marnav/seatalk/message_26.hpp
455                         marnav/seatalk/message_27.hpp
456                         marnav/seatalk/message_30.hpp
457                         marnav/seatalk/message_36.hpp
458                         marnav/seatalk/message_38.hpp
459                         marnav/seatalk/message_50.hpp
460                         marnav/seatalk/message_51.hpp
461                         marnav/seatalk/message_52.hpp
462                         marnav/seatalk/message_53.hpp
463                         marnav/seatalk/message_54.hpp
464                         marnav/seatalk/message_56.hpp
465                         marnav/seatalk/message_58.hpp
466                         marnav/seatalk/message_59.hpp
467                         marnav/seatalk/message_65.hpp
468                         marnav/seatalk/message_66.hpp
469                         marnav/seatalk/message_6c.hpp
470                         marnav/seatalk/message_86.hpp
471                         marnav/seatalk/message_87.hpp
472                         marnav/seatalk/message_89.hpp
473                 DESTINATION include/marnav/seatalk
474                 )
475 endif()
477 install(
478         FILES
479                 marnav/utils/unused.hpp
480                 marnav/utils/unique.hpp
481                 marnav/utils/bitset.hpp
482                 marnav/utils/optional.hpp
483                 marnav/utils/mmsi.hpp
484         DESTINATION include/marnav/utils
485         )
487 install(
488         FILES
489                 marnav/math/floatingpoint.hpp
490                 marnav/math/vector.hpp
491                 marnav/math/matrix.hpp
492                 marnav/math/quaternion.hpp
493         DESTINATION include/marnav/math
494         )
496 install(
497         FILES
498                 marnav/geo/angle.hpp
499                 marnav/geo/position.hpp
500                 marnav/geo/region.hpp
501                 marnav/geo/cpa.hpp
502                 marnav/geo/geodesic.hpp
503         DESTINATION include/marnav/geo
504         )
506 if(ENABLE_IO)
507         install(
508                 FILES
509                         marnav/io/device.hpp
510                         marnav/io/serial.hpp
511                         marnav/io/nmea_reader.hpp
512                         marnav/io/default_nmea_reader.hpp
513                         marnav/io/default_nmea_serial.hpp
514                 DESTINATION include/marnav/io
515                 )
516         if(ENABLE_SEATALK)
517                 install(
518                         FILES
519                                 marnav/io/seatalk_reader.hpp
520                                 marnav/io/default_seatalk_reader.hpp
521                                 marnav/io/default_seatalk_serial.hpp
522                         DESTINATION include/marnav/io
523                         )
524         endif()
525 endif()
527 # stuff for the config and config-version files
528 set(INCLUDE_INSTALL_DIR include)
529 set(LIB_INSTALL_DIR lib)
530 include(CMakePackageConfigHelpers)
531 configure_package_config_file(
532         config.cmake.in
533         "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
534         INSTALL_DESTINATION "${LIB_INSTALL_DIR}/${PROJECT_NAME}/cmake"
535         PATH_VARS INCLUDE_INSTALL_DIR
536         )
537 write_basic_package_version_file(
538         "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
539         VERSION "${PROJECT_VERSION}"
540         COMPATIBILITY SameMajorVersion)
541 install(
542         FILES
543                 "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
544                 "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
545         DESTINATION
546                 "${LIB_INSTALL_DIR}/${PROJECT_NAME}/cmake"
547         )
549 ### bin: nmeasum
551 add_executable(nmeasum
552         nmeasum.cpp
553         )
555 target_include_directories(nmeasum PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
557 target_compile_options(nmeasum
558         PRIVATE
559                 -pipe
560                 -ggdb
561                 -Wall
562                 -Wextra
563                 -pedantic-errors
564         )
566 ### bin: nmeadump
568 if(ENABLE_AIS AND ENABLE_IO)
569         add_executable(nmeadump
570                 nmeadump.cpp
571                 )
573         target_include_directories(nmeadump
574                 PRIVATE
575                         ${CMAKE_CURRENT_SOURCE_DIR}
576                         ${CMAKE_CURRENT_SOURCE_DIR}/../extern
577                 )
579         target_compile_options(nmeadump
580                 PRIVATE
581                         -pipe
582                         -ggdb
583                         -Wall
584                         -Wextra
585                         -pedantic-errors
586                 )
588         target_link_libraries(nmeadump
589                 marnav
590                 )
591 endif()