diff --git a/CMakeLists.txt b/CMakeLists.txt index ce1865f..e7ba636 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) +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 + $ + $ +) -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_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() \ No newline at end of file + ) + + if(MSVC) + install(FILES + compat/minmea_compat_windows.h + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + RENAME minmea_compat.h + ) + 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() diff --git a/cmake/minmeaConfig.cmake.in b/cmake/minmeaConfig.cmake.in new file mode 100644 index 0000000..a1af469 --- /dev/null +++ b/cmake/minmeaConfig.cmake.in @@ -0,0 +1,3 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/minmeaTargets.cmake") \ No newline at end of file