Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
150 changes: 120 additions & 30 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,48 +1,138 @@
cmake_minimum_required(VERSION 3.3)
cmake_minimum_required(VERSION 3.10)

project(minmea)
project(minmea
VERSION 1.0.0
LANGUAGES C
)

option(MINMEA_ENABLE_TESTING "Enable building and running unit tests" ON)
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)

# -------------------------------------------------
# Options
# -------------------------------------------------
option(MINMEA_BUILD_EXAMPLES "Build example program" ON)
option(MINMEA_ENABLE_TESTING "Build and run tests" ON)
option(MINMEA_INSTALL "Enable installation rules" ON)

# -------------------------------------------------
# Library
# -------------------------------------------------
add_library(minmea minmea.c minmea.h)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -Wextra -Werror -std=c99")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_POSIX_C_SOURCE=199309L -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_DARWIN_C_SOURCE")
add_library(minmea::minmea ALIAS minmea)

set(minmea_SRCS minmea.c minmea.h)
add_library(minmea ${minmea_SRCS})
target_compile_features(minmea PRIVATE c_std_99)

if(MSVC)
target_compile_options(minmea PRIVATE /W4)
target_compile_definitions(minmea PRIVATE MINMEA_INCLUDE_COMPAT)
else()
target_compile_options(minmea PRIVATE -Wall -Wextra)
endif()

if(NOT WIN32)
target_compile_definitions(minmea PRIVATE
_POSIX_C_SOURCE=199309L
_BSD_SOURCE
_DEFAULT_SOURCE
_DARWIN_C_SOURCE
)
endif()

add_executable(example example.c)
target_link_libraries(example minmea)
target_include_directories(minmea
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

if (MINMEA_ENABLE_TESTING)
# -------------------------------------------------
# Example
# -------------------------------------------------
if(MINMEA_BUILD_EXAMPLES)
add_executable(example example.c)
target_link_libraries(example PRIVATE minmea)
endif()

# -------------------------------------------------
# Tests
# -------------------------------------------------
if(MINMEA_ENABLE_TESTING AND PROJECT_IS_TOP_LEVEL)
enable_testing()
find_package(Threads REQUIRED) # Workaround for https://github.com/libcheck/check/issues/48#issuecomment-322965461
find_package(PkgConfig)

find_package(Threads REQUIRED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(CHECK REQUIRED check)
link_directories(${CHECK_LIBRARY_DIRS})

add_executable(tests tests.c)
target_link_libraries(tests minmea ${CHECK_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
target_include_directories(tests PUBLIC ${CHECK_INCLUDE_DIRS})
target_compile_options(tests PUBLIC ${CHECK_CFLAGS_OTHER})

add_test(NAME tests COMMAND $<TARGET_FILE:tests>)
target_link_libraries(tests PRIVATE
minmea
Threads::Threads
${CHECK_LIBRARIES}
)

target_include_directories(tests PRIVATE
${CHECK_INCLUDE_DIRS}
)

target_compile_options(tests PRIVATE
${CHECK_CFLAGS_OTHER}
)

add_test(NAME tests COMMAND tests)

# Optional static analysis hook (kept simple)
add_test(
NAME clang_static_analysis
COMMAND scan-build make
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND scan-build --status-bugs ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}
)
list(APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure")
endif()

include(GNUInstallDirs)
# -------------------------------------------------
# Installation + Export
# -------------------------------------------------
if(MINMEA_INSTALL)
install(TARGETS minmea
EXPORT minmeaTargets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

install(TARGETS minmea
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}")
install(FILES minmea.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
if(MSVC)
install(FILES compat/minmea_compat_windows.h
install(FILES minmea.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
RENAME minmea_compat.h)
endif()
)

if(MSVC)
install(FILES
compat/minmea_compat_windows.h
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/compat"
)
endif()

install(EXPORT minmeaTargets
FILE minmeaTargets.cmake
NAMESPACE minmea::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/minmea
)

# Package config
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/minmeaConfigVersion.cmake"
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion
)

configure_package_config_file(
"${CMAKE_CURRENT_LIST_DIR}/cmake/minmeaConfig.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/minmeaConfig.cmake"
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/minmea
)

install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/minmeaConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/minmeaConfigVersion.cmake"
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/minmea
)
endif()
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ Minmea runs out-of-the-box under most Unix-compatible systems. Support for non-U
(including native Windows builds under MSVC) is provided via compatibility headers:

1. Define `MINMEA_INCLUDE_COMPAT` in the build environment.
2. Add appropriate compatibility header from under `compat/` directory as `minmea_compat.h`.
2. Add appropriate compatibility header from under `compat/` directory.

If your GPS receiver outputs very long sentences, consider increasing `MINMEA_MAX_SENTENCE_LENGTH`
in your build environment.
Expand Down
3 changes: 3 additions & 0 deletions cmake/minmeaConfig.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
@PACKAGE_INIT@

include("${CMAKE_CURRENT_LIST_DIR}/minmeaTargets.cmake")
2 changes: 1 addition & 1 deletion compat/minmea_compat_windows.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

#if defined(_MSC_VER)

#if !defined(HAVE_STRUCT_TIMESPEC)
#if _MSC_VER < 1900
struct timespec {
time_t tv_sec;
long tv_nsec;
Expand Down
2 changes: 1 addition & 1 deletion minmea.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ extern "C" {
#include <time.h>
#include <math.h>
#ifdef MINMEA_INCLUDE_COMPAT
#include <minmea_compat.h>
#include <compat/minmea_compat_windows.h>
#endif

#ifndef MINMEA_MAX_SENTENCE_LENGTH
Expand Down
Loading