# Minimum version imposed by Ubuntu:20.04 cmake_minimum_required(VERSION 3.16.3) # use TWEAK to categorize the build: # # * 1.00.0 = GM (tagged and released) # * 1.00.0.9 = 1.00.0 Development # * 1.00.0.00 = GM Preview # * 1.00.0.2 = RC2 (tagged and released) # * 1.00.0.20 = RC2 Preview # * 1.00.0.29 = RC2 Development # project( exiv2 VERSION 1.00.0.9 DESCRIPTION "Exif/IPTC/Xmp C++ metadata library and tools plus ICC Profiles, Previews and more." LANGUAGES C CXX ) # Shared Object versioning (SemVer-like: must bump major on API breakage) if(PROJECT_VERSION_MAJOR EQUAL 0) # support legacy scheme (e.g. 0.27.x -> 27) set(EXIV2LIB_SOVERSION ${PROJECT_VERSION_MINOR}) else() # restart from 30 math(EXPR EXIV2LIB_SOVERSION "30 + (${PROJECT_VERSION_MAJOR} - 1)") endif() if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif() include(cmake/mainSetup.cmake) # options and their default values option(BUILD_SHARED_LIBS "Build exiv2lib as a shared library" ON) option(EXIV2_ENABLE_XMP "Build with XMP metadata support" ON) option(EXIV2_ENABLE_EXTERNAL_XMP "Use external version of XMP" OFF) option(EXIV2_ENABLE_PNG "Build with PNG support (requires zlib)" ON) option(EXIV2_ENABLE_NLS "Build native language support (requires gettext)" OFF) option(EXIV2_ENABLE_LENSDATA "Build including Nikon lens data" ON) option(EXIV2_ENABLE_DYNAMIC_RUNTIME "Use dynamic runtime (used for static libs)" ON) option(EXIV2_ENABLE_WEBREADY "Build webready support into library" OFF) option(EXIV2_ENABLE_CURL "Use libcurl for HttpIo (WEBREADY)" OFF) option(EXIV2_ENABLE_BMFF "Build with BMFF support" ON) option(EXIV2_ENABLE_BROTLI "Use Brotli for JPEG XL compressed boxes (BMFF)" ON) option(EXIV2_ENABLE_VIDEO "Build with video support" ON) option(EXIV2_ENABLE_INIH "Use inih library" ON) option(EXIV2_BUILD_SAMPLES "Build sample applications" OFF) option(EXIV2_BUILD_EXIV2_COMMAND "Build exiv2 command-line executable" ON) option(EXIV2_BUILD_UNIT_TESTS "Build unit tests" OFF) option(EXIV2_BUILD_FUZZ_TESTS "Build fuzz tests (libFuzzer)" OFF) option(EXIV2_BUILD_DOC "Add 'doc' target to generate documentation" OFF) # Only intended to be used by Exiv2 developers/contributors option(EXIV2_TEAM_EXTRA_WARNINGS "Add more sanity checks using compiler flags" OFF) option(EXIV2_TEAM_WARNINGS_AS_ERRORS "Treat warnings as errors" OFF) option(EXIV2_TEAM_USE_SANITIZERS "Enable ASAN and UBSAN when available" OFF) # The EXIV2_TEAM_OSS_FUZZ option is used by the OSS-Fuzz build script: # # * https://github.com/google/oss-fuzz/tree/master/projects/exiv2/build.sh # option(EXIV2_TEAM_OSS_FUZZ "Build config for OSS-Fuzz" OFF) option(EXIV2_TEAM_PACKAGING "Additional stuff for generating packages" OFF) set(EXTRA_COMPILE_FLAGS " ") mark_as_advanced(EXIV2_TEAM_EXTRA_WARNINGS EXIV2_TEAM_WARNINGS_AS_ERRORS EXIV2_ENABLE_EXTERNAL_XMP EXTRA_COMPILE_FLAGS EXIV2_TEAM_USE_SANITIZERS) option(BUILD_WITH_STACK_PROTECTOR "Build with stack protector" ON) option(BUILD_WITH_CCACHE "Use ccache to speed up compilations" OFF) option(BUILD_WITH_COVERAGE "Add compiler flags to generate coverage stats" OFF) include(cmake/gcovr.cmake REQUIRED) set(PACKAGE_URL "https://exiv2.org") if(EXIV2_ENABLE_EXTERNAL_XMP) set(EXIV2_ENABLE_XMP OFF) endif() include(cmake/findDependencies.cmake REQUIRED) include(cmake/compilerFlags.cmake REQUIRED) include(cmake/generateConfigFile.cmake REQUIRED) if(EXIV2_BUILD_DOC) include(cmake/generateDoc.cmake REQUIRED) generate_documentation("${PROJECT_SOURCE_DIR}/cmake/Doxyfile.in") endif() include_directories(${CMAKE_BINARY_DIR}) # Make the exv_conf.h file visible for the full project if(EXIV2_ENABLE_XMP) add_subdirectory(xmpsdk) endif() include(cmake/compilerFlagsExiv2.cmake REQUIRED) add_subdirectory(src) if(BUILD_TESTING AND EXIV2_BUILD_UNIT_TESTS) add_subdirectory(unitTests) endif() if(EXIV2_BUILD_FUZZ_TESTS) add_subdirectory(fuzz) endif() if(EXIV2_BUILD_EXIV2_COMMAND) add_subdirectory(app) if(EXIV2_BUILD_SAMPLES) add_subdirectory(samples) get_directory_property(SAMPLES DIRECTORY samples DEFINITION APPLICATIONS) if(BUILD_TESTING AND Python3_Interpreter_FOUND) add_test( NAME bashTests WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/tests COMMAND cmake -E env EXIV2_BINDIR=${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${Python3_EXECUTABLE} runner.py --verbose bash_tests ) endif() endif() if(BUILD_TESTING AND Python3_Interpreter_FOUND) add_test( NAME bugfixTests WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/tests COMMAND cmake -E env EXIV2_BINDIR=${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${Python3_EXECUTABLE} runner.py --verbose bugfixes ) add_test( NAME lensTests WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/tests COMMAND cmake -E env EXIV2_BINDIR=${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${Python3_EXECUTABLE} runner.py --verbose lens_tests ) add_test( NAME tiffTests WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/tests COMMAND cmake -E env EXIV2_BINDIR=${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${Python3_EXECUTABLE} runner.py --verbose tiff_test ) add_test( NAME versionTests WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/tests COMMAND cmake -E env EXIV2_BINDIR=${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${Python3_EXECUTABLE} runner.py --verbose bash_tests/version_test.py ) add_test( NAME regressionTests WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/tests COMMAND cmake -E env EXIV2_BINDIR=${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${Python3_EXECUTABLE} runner.py --verbose regression_tests ) endif() endif() if(EXIV2_ENABLE_NLS) add_subdirectory(po) endif() if(EXIV2_TEAM_PACKAGING) include(cmake/packaging.cmake) endif() # Handle both relative and absolute paths (e.g. NixOS) for a relocatable package if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}") set(EXIV2_LIBDIR "${CMAKE_INSTALL_LIBDIR}") else() join_paths(EXIV2_LIBDIR "\${exec_prefix}" "${CMAKE_INSTALL_LIBDIR}") endif() if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}") set(EXIV2_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}") else() join_paths(EXIV2_INCLUDEDIR "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}") endif() configure_file(cmake/exiv2.pc.in exiv2.pc @ONLY) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/exiv2.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) # ****************************************************************************** # Man page install(FILES ${PROJECT_SOURCE_DIR}/man/man1/exiv2.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) include(cmake/printSummary.cmake) # That's all Folks! #