cmake_minimum_required(VERSION 3.18) project(rggb2dng VERSION 1.0.0 DESCRIPTION "Reassemble RGGB TIFF planes into a DNG raw file" HOMEPAGE_URL "https://salsa.debian.org/debian/rggb2dng" LANGUAGES CXX ) # --------------------------------------------------------------------------- # Standards and policies # --------------------------------------------------------------------------- set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # Export compile commands for clang-tidy set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # --------------------------------------------------------------------------- # Build type defaults # --------------------------------------------------------------------------- if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Build type: Debug Release RelWithDebInfo MinSizeRel" FORCE) endif() # --------------------------------------------------------------------------- # Compiler flags # --------------------------------------------------------------------------- # Common warning flags (Clang and GCC) set(RGGB2DNG_WARN_FLAGS -Wall -Wextra -Wpedantic -Wconversion -Wshadow -Wno-unused-parameter ) # --------------------------------------------------------------------------- # Dependencies # --------------------------------------------------------------------------- find_package(PkgConfig REQUIRED) # libtiff pkg_check_modules(TIFF REQUIRED libtiff-4) # libmagic (no pkg-config file on Debian; use find_library + find_path) find_library(MAGIC_LIBRARY NAMES magic REQUIRED) find_path(MAGIC_INCLUDE_DIR NAMES magic.h REQUIRED) if(NOT MAGIC_LIBRARY) message(FATAL_ERROR "libmagic not found. Install libmagic-dev.") endif() if(NOT MAGIC_INCLUDE_DIR) message(FATAL_ERROR "magic.h not found. Install libmagic-dev.") endif() message(STATUS "libtiff include dirs: ${TIFF_INCLUDE_DIRS}") message(STATUS "libtiff libraries: ${TIFF_LIBRARIES}") message(STATUS "libmagic library: ${MAGIC_LIBRARY}") message(STATUS "libmagic include dir: ${MAGIC_INCLUDE_DIR}") # --------------------------------------------------------------------------- # Version string — passed directly as a compile definition; no generated # header needed, so there is no cmake/version.hpp.in dependency. # --------------------------------------------------------------------------- add_compile_definitions(RGGB2DNG_VERSION="${PROJECT_VERSION}") # --------------------------------------------------------------------------- # Library target (shared, to allow linking by tests and main separately) # --------------------------------------------------------------------------- add_library(rggb2dng_lib STATIC src/rggb2dng.cpp ) target_include_directories(rggb2dng_lib PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src" "${MAGIC_INCLUDE_DIR}" ${TIFF_INCLUDE_DIRS} ) target_compile_options(rggb2dng_lib PRIVATE ${RGGB2DNG_WARN_FLAGS}) target_link_libraries(rggb2dng_lib PUBLIC ${TIFF_LIBRARIES} ${MAGIC_LIBRARY} ) # --------------------------------------------------------------------------- # Executable target # --------------------------------------------------------------------------- add_executable(rggb2dng src/main.cpp) target_include_directories(rggb2dng PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" ) target_compile_options(rggb2dng PRIVATE ${RGGB2DNG_WARN_FLAGS}) target_link_libraries(rggb2dng PRIVATE rggb2dng_lib) # --------------------------------------------------------------------------- # Tests # --------------------------------------------------------------------------- enable_testing() add_executable(test_rggb2dng test/test_rggb2dng.cpp) set_target_properties(test_rggb2dng PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" ) target_include_directories(test_rggb2dng PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" ${TIFF_INCLUDE_DIRS} ) target_compile_options(test_rggb2dng PRIVATE ${RGGB2DNG_WARN_FLAGS}) target_link_libraries(test_rggb2dng PRIVATE rggb2dng_lib ${TIFF_LIBRARIES} ) add_test( NAME unit_tests COMMAND "$" ) set_tests_properties(unit_tests PROPERTIES TIMEOUT 60 PASS_REGULAR_EXPRESSION "0 failed" ) # --------------------------------------------------------------------------- # clang-tidy (optional, enabled when clang-tidy is found) # --------------------------------------------------------------------------- find_program(CLANG_TIDY_EXE clang-tidy) if(CLANG_TIDY_EXE) message(STATUS "clang-tidy found: ${CLANG_TIDY_EXE}") set(CLANG_TIDY_CHECKS "-*" "bugprone-*" "clang-analyzer-*" "cppcoreguidelines-*" "modernize-*" "performance-*" "portability-*" "readability-*" "-modernize-use-trailing-return-type" "-readability-magic-numbers" "-cppcoreguidelines-avoid-magic-numbers" "-cppcoreguidelines-pro-bounds-pointer-arithmetic" ) string(JOIN "," CLANG_TIDY_CHECKS_STR ${CLANG_TIDY_CHECKS}) set_target_properties(rggb2dng rggb2dng_lib PROPERTIES CXX_CLANG_TIDY "${CLANG_TIDY_EXE};--checks=${CLANG_TIDY_CHECKS_STR}" ) else() message(STATUS "clang-tidy not found; skipping static analysis") endif() # --------------------------------------------------------------------------- # Install rules (Debian FHS layout) # --------------------------------------------------------------------------- # Install rules (Debian FHS layout) # --------------------------------------------------------------------------- include(GNUInstallDirs) install(TARGETS rggb2dng RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" ) # Man page — dh_installman will gzip it; install the raw .1 here install(FILES doc/rggb2dng.1 DESTINATION "${CMAKE_INSTALL_MANDIR}/man1" ) # Package documentation install(FILES CHANGES.md README.md DESTINATION "${CMAKE_INSTALL_DOCDIR}" ) install(FILES debian/copyright DESTINATION "${CMAKE_INSTALL_DOCDIR}" ) # --------------------------------------------------------------------------- # CPack (used by debian/rules to generate source tarball if needed) # --------------------------------------------------------------------------- set(CPACK_PACKAGE_NAME "rggb2dng") set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}") set(CPACK_PACKAGE_CONTACT "Maintainer ") set(CPACK_SOURCE_GENERATOR "TGZ;TXZ") set(CPACK_SOURCE_IGNORE_FILES "/\\.git/" "/build/" "\\.o$" "\\.a$" ) include(CPack)