cmake: add format file

Helps to keep the CMake stuff consistent.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
main
Rosen Penev 2 years ago
parent 590f615320
commit 0f85d5a0e9

@ -0,0 +1,17 @@
with section("format"):
# How wide to allow formatted cmake files
line_width = 150
# How many spaces to tab for indent
tab_size = 2
# If true, separate flow control names from their parentheses with a space
separate_ctrl_name_with_space = False
# If true, separate function names from parentheses with a space
separate_fn_name_with_space = False
# If a statement is wrapped to more than one line, than dangle the closing
# parenthesis on its own line.
dangle_parens = True

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

@ -1,57 +1,62 @@
add_executable( exiv2 add_executable(
exiv2.cpp exiv2
exiv2app.hpp exiv2.cpp
actions.cpp actions.hpp exiv2app.hpp
getopt.cpp getopt.hpp actions.cpp
app_utils.cpp app_utils.hpp actions.hpp
getopt.cpp
getopt.hpp
app_utils.cpp
app_utils.hpp
) )
target_include_directories(exiv2 PRIVATE ${PROJECT_SOURCE_DIR}/src) # To find i18n.hpp target_include_directories(exiv2 PRIVATE ${PROJECT_SOURCE_DIR}/src) # To find i18n.hpp
set_target_properties( exiv2 PROPERTIES set_target_properties(exiv2 PROPERTIES COMPILE_FLAGS ${EXTRA_COMPILE_FLAGS} XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=Debug] "YES")
COMPILE_FLAGS ${EXTRA_COMPILE_FLAGS} if(MSVC)
XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=Debug] "YES" set_target_properties(exiv2 PROPERTIES LINK_FLAGS "/ignore:4099") # Ignore missing PDBs
)
if (MSVC)
set_target_properties(exiv2 PROPERTIES LINK_FLAGS "/ignore:4099") # Ignore missing PDBs
endif() endif()
target_link_libraries( exiv2 PRIVATE exiv2lib ) target_link_libraries(exiv2 PRIVATE exiv2lib)
if( EXIV2_ENABLE_NLS ) if(EXIV2_ENABLE_NLS)
target_link_libraries(exiv2 PRIVATE ${Intl_LIBRARIES}) target_link_libraries(exiv2 PRIVATE ${Intl_LIBRARIES})
target_include_directories(exiv2 PRIVATE ${Intl_INCLUDE_DIRS}) target_include_directories(exiv2 PRIVATE ${Intl_INCLUDE_DIRS})
endif() endif()
target_link_libraries(exiv2 PRIVATE std::filesystem) target_link_libraries(exiv2 PRIVATE std::filesystem)
if(MSVC OR MINGW) if(MSVC OR MINGW)
# Trick to get properly UTF-8 encoded argv # Trick to get properly UTF-8 encoded argv More info at: https://github.com/huangqinjin/wmain
# More info at: https://github.com/huangqinjin/wmain add_library(wmain STATIC wmain.cpp)
add_library(wmain STATIC wmain.cpp) target_link_libraries(exiv2 PRIVATE wmain)
target_link_libraries(exiv2 PRIVATE wmain)
endif() endif()
if (MSVC) if(MSVC)
target_link_options(wmain INTERFACE /WHOLEARCHIVE:$<TARGET_FILE:wmain>) target_link_options(wmain INTERFACE /WHOLEARCHIVE:$<TARGET_FILE:wmain>)
target_link_options(exiv2 PRIVATE "/ENTRY:wWinMainCRTStartup") target_link_options(exiv2 PRIVATE "/ENTRY:wWinMainCRTStartup")
endif() endif()
if (MINGW) if(MINGW)
target_compile_options(exiv2 PRIVATE -municode) target_compile_options(exiv2 PRIVATE -municode)
target_link_options(exiv2 PRIVATE -municode) target_link_options(exiv2 PRIVATE -municode)
endif() endif()
if (USING_CONAN AND WIN32 AND EXISTS ${PROJECT_BINARY_DIR}/conanDlls) if(USING_CONAN
# In case of using conan recipes with their 'shared' option turned on, we will have dlls of AND WIN32
# the 3rd party dependencies in the conanDlls folder. AND EXISTS ${PROJECT_BINARY_DIR}/conanDlls
)
# In case of using conan recipes with their 'shared' option turned on, we will have dlls of the 3rd party dependencies in the conanDlls folder.
# Copy 3rd party DLLs the bin folder. [build step] add_custom_command(
add_custom_command(TARGET exiv2 POST_BUILD TARGET exiv2
COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_BINARY_DIR}/conanDlls ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_BINARY_DIR}/conanDlls ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
COMMENT "Copy 3rd party DLLs the bin folder"
)
# Copy 3rd party DLLs the bin folder. [install step] # Copy 3rd party DLLs the bin folder. [install step]
install(DIRECTORY ${PROJECT_BINARY_DIR}/conanDlls/ DESTINATION bin) install(DIRECTORY ${PROJECT_BINARY_DIR}/conanDlls/ DESTINATION bin)
endif() endif()
install(TARGETS exiv2 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) install(TARGETS exiv2 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})

@ -1,22 +1,15 @@
# Macro for different fuzzers
macro(FUZZER name)
add_executable(${name} ${name}.cpp)
macro(fuzzer name) # 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
add_executable(${name} ${name}.cpp) # OSS-Fuzz wants full control of the sanitizer flags, and it uses the LIB_FUZZING_ENGINE option to supply its own main function.
if(EXIV2_TEAM_OSS_FUZZ)
# The EXIV2_TEAM_OSS_FUZZ option is used by the OSS-Fuzz build script: set_target_properties(${name} PROPERTIES LINK_FLAGS "${LIB_FUZZING_ENGINE}")
# https://github.com/google/oss-fuzz/tree/master/projects/exiv2/build.sh else()
# OSS-Fuzz wants full control of the sanitizer flags, and it uses set_target_properties(${name} PROPERTIES COMPILE_FLAGS "-fsanitize=fuzzer" LINK_FLAGS "-fsanitize=fuzzer")
# the LIB_FUZZING_ENGINE option to supply its own main function. endif()
if(EXIV2_TEAM_OSS_FUZZ) target_link_libraries(${name} PRIVATE exiv2lib std::filesystem)
set_target_properties(${name}
PROPERTIES
LINK_FLAGS "${LIB_FUZZING_ENGINE}")
else()
set_target_properties(${name}
PROPERTIES
COMPILE_FLAGS "-fsanitize=fuzzer"
LINK_FLAGS "-fsanitize=fuzzer")
endif()
target_link_libraries(${name} PRIVATE exiv2lib std::filesystem)
endmacro() endmacro()
fuzzer(fuzz-read-print-write) FUZZER(fuzz-read-print-write)

@ -1,38 +1,34 @@
find_package(Gettext REQUIRED) find_package(Gettext REQUIRED)
GETTEXT_CREATE_TRANSLATIONS(exiv2.pot ALL gettext_create_translations(
bs.po exiv2.pot
de.po ALL
ca.po bs.po
es.po de.po
fi.po ca.po
fr.po es.po
gl.po fi.po
ms.po fr.po
nl.po gl.po
pl.po ms.po
pt.po nl.po
ru.po pl.po
sk.po pt.po
sv.po ru.po
ug.po sk.po
uk.po sv.po
vi.po ug.po
uk.po
vi.po
) )
find_program(XGETTEXT xgettext) find_program(XGETTEXT xgettext)
add_custom_target( add_custom_target(
update-pot update-pot
COMMAND COMMAND
${XGETTEXT} -o ${CMAKE_CURRENT_SOURCE_DIR}/exiv2.pot ${XGETTEXT} -o ${CMAKE_CURRENT_SOURCE_DIR}/exiv2.pot -D ${PROJECT_SOURCE_DIR} --keyword=_ --keyword=N_
-D ${PROJECT_SOURCE_DIR} --files-from=${CMAKE_CURRENT_SOURCE_DIR}/POTFILES.in --from-code=UTF-8 --copyright-holder='Exiv2 authors'
--keyword=_ --keyword=N_ --msgid-bugs-address='https://github.com/Exiv2/exiv2/issues' --package-name=${CMAKE_PROJECT_NAME} --package-version=${CMAKE_PROJECT_VERSION}
--files-from=${CMAKE_CURRENT_SOURCE_DIR}/POTFILES.in COMMENT "Extract translatable messages to exiv2.pot"
--from-code=UTF-8
--copyright-holder='Exiv2 authors'
--msgid-bugs-address='https://github.com/Exiv2/exiv2/issues'
--package-name=${CMAKE_PROJECT_NAME}
--package-version=${CMAKE_PROJECT_VERSION}
COMMENT "Extract translatable messages to exiv2.pot"
) )

@ -1,103 +1,92 @@
# CMakeLists.txt for exiv2 library sample applications # CMakeLists.txt for exiv2 library sample applications
set( SAMPLES set(SAMPLES
addmoddel.cpp addmoddel.cpp
convert-test.cpp convert-test.cpp
easyaccess-test.cpp easyaccess-test.cpp
exifcomment.cpp exifcomment.cpp
exifdata-test.cpp exifdata-test.cpp
exifdata.cpp exifdata.cpp
exifprint.cpp exifprint.cpp
exifvalue.cpp exifvalue.cpp
ini-test.cpp ini-test.cpp
iotest.cpp iotest.cpp
iptceasy.cpp iptceasy.cpp
iptcprint.cpp iptcprint.cpp
iptctest.cpp iptctest.cpp
key-test.cpp key-test.cpp
largeiptc-test.cpp largeiptc-test.cpp
mmap-test.cpp mmap-test.cpp
mrwthumb.cpp mrwthumb.cpp
prevtest.cpp prevtest.cpp
stringto-test.cpp stringto-test.cpp
taglist.cpp taglist.cpp
tiff-test.cpp tiff-test.cpp
write-test.cpp write-test.cpp
write2-test.cpp write2-test.cpp
xmpparse.cpp xmpparse.cpp
xmpparser-test.cpp xmpparser-test.cpp
xmpprint.cpp xmpprint.cpp
xmpsample.cpp xmpsample.cpp
xmpdump.cpp xmpdump.cpp
) )
## #
# build samples AND add them to the APPLICATIONS list # build samples AND add them to the APPLICATIONS list
foreach(entry ${SAMPLES}) foreach(entry ${SAMPLES})
string( REPLACE ".cpp" "" target ${entry}) string(REPLACE ".cpp" "" target ${entry})
add_executable( ${target} ${target}.cpp ) add_executable(${target} ${target}.cpp)
set_target_properties(${target} PROPERTIES set_target_properties(${target} PROPERTIES COMPILE_FLAGS ${EXTRA_COMPILE_FLAGS})
COMPILE_FLAGS ${EXTRA_COMPILE_FLAGS}) list(APPEND APPLICATIONS ${target})
list(APPEND APPLICATIONS ${target}) target_include_directories(${target} PRIVATE ${PROJECT_SOURCE_DIR}/src) # To find enforce.hpp
target_include_directories(${target} PRIVATE ${PROJECT_SOURCE_DIR}/src) # To find enforce.hpp if(NOT ${target} MATCHES ".*test.*") # don't install tests
if ( NOT ${target} MATCHES ".*test.*") # don't install tests install(TARGETS ${target} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
install( TARGETS ${target} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) endif()
endif()
endforeach() endforeach()
################################### # ####################################################################################################################################################
if (MSVC) if(MSVC)
link_directories(${CMAKE_INSTALL_PREFIX}/lib) link_directories(${CMAKE_INSTALL_PREFIX}/lib)
endif() endif()
add_executable( getopt-test getopt-test.cpp ../app/getopt.cpp) add_executable(getopt-test getopt-test.cpp ../app/getopt.cpp)
list(APPEND APPLICATIONS getopt-test) list(APPEND APPLICATIONS getopt-test)
target_include_directories(getopt-test PRIVATE target_include_directories(getopt-test PRIVATE ${PROJECT_SOURCE_DIR}/app) # To find getopt.hpp
${PROJECT_SOURCE_DIR}/app
) # To find getopt.hpp
add_executable( metacopy metacopy.cpp metacopy.hpp ../app/getopt.cpp) add_executable(metacopy metacopy.cpp metacopy.hpp ../app/getopt.cpp)
list(APPEND APPLICATIONS metacopy) list(APPEND APPLICATIONS metacopy)
target_include_directories(metacopy PRIVATE target_include_directories(metacopy PRIVATE ${PROJECT_SOURCE_DIR}/app) # To find getopt.hpp
${PROJECT_SOURCE_DIR}/app
) # To find getopt.hpp
add_executable( path-test path-test.cpp ../app/getopt.cpp) add_executable(path-test path-test.cpp ../app/getopt.cpp)
list(APPEND APPLICATIONS path-test) list(APPEND APPLICATIONS path-test)
set_target_properties( path-test PROPERTIES OUTPUT_NAME path-test ) set_target_properties(path-test PROPERTIES OUTPUT_NAME path-test)
target_include_directories(path-test PRIVATE target_include_directories(path-test PRIVATE ${PROJECT_SOURCE_DIR}/app) # To find getopt.hpp
${PROJECT_SOURCE_DIR}/app
) # To find getopt.hpp
install( TARGETS metacopy RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) install(TARGETS metacopy RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
if( EXIV2_ENABLE_INIH ) if(EXIV2_ENABLE_INIH)
target_link_libraries( ini-test PRIVATE inih::libinih ) target_link_libraries(ini-test PRIVATE inih::libinih)
target_link_libraries( ini-test PRIVATE inih::inireader ) target_link_libraries(ini-test PRIVATE inih::inireader)
endif() endif()
if( EXPAT_FOUND ) if(EXPAT_FOUND)
add_executable( geotag geotag.cpp) add_executable(geotag geotag.cpp)
list(APPEND APPLICATIONS geotag) list(APPEND APPLICATIONS geotag)
target_link_libraries(geotag target_link_libraries(geotag PRIVATE exiv2-xmp ${EXPAT_LIBRARIES})
PRIVATE target_include_directories(geotag PRIVATE ${CMAKE_BINARY_DIR}) # exv_conf.h
exiv2-xmp target_include_directories(geotag PRIVATE ${PROJECT_SOURCE_DIR}/include) # <exiv2/exiv2.hpp>
${EXPAT_LIBRARIES} target_include_directories(geotag PRIVATE ${EXPAT_INCLUDE_DIR})
)
target_include_directories(geotag PRIVATE ${CMAKE_BINARY_DIR}) # exv_conf.h
target_include_directories(geotag PRIVATE ${PROJECT_SOURCE_DIR}/include) # <exiv2/exiv2.hpp>
target_include_directories(geotag PRIVATE ${EXPAT_INCLUDE_DIR})
if (WIN32)
target_compile_definitions(geotag PRIVATE XML_STATIC)
endif()
if (MSVC) if(WIN32)
set_target_properties(geotag PROPERTIES LINK_FLAGS "/ignore:4099") target_compile_definitions(geotag PRIVATE XML_STATIC)
endif() endif()
if(MSVC)
set_target_properties(geotag PROPERTIES LINK_FLAGS "/ignore:4099")
endif()
install( TARGETS geotag RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) install(TARGETS geotag RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
endif() endif()
# ****************************************************************************** # ******************************************************************************
@ -105,11 +94,11 @@ endif()
add_executable(conntest conntest.cpp) add_executable(conntest conntest.cpp)
list(APPEND APPLICATIONS conntest) list(APPEND APPLICATIONS conntest)
if (EXIV2_ENABLE_WEBREADY) if(EXIV2_ENABLE_WEBREADY)
if( EXIV2_ENABLE_CURL ) if(EXIV2_ENABLE_CURL)
target_include_directories(conntest SYSTEM PRIVATE ${CURL_INCLUDE_DIR} ) target_include_directories(conntest SYSTEM PRIVATE ${CURL_INCLUDE_DIR})
target_link_libraries(conntest PRIVATE ${CURL_LIBRARIES}) target_link_libraries(conntest PRIVATE ${CURL_LIBRARIES})
endif() endif()
endif() endif()
# ****************************************************************************** # ******************************************************************************
@ -119,23 +108,23 @@ list(APPEND APPLICATIONS remotetest)
# ****************************************************************************** # ******************************************************************************
foreach(application ${APPLICATIONS}) foreach(application ${APPLICATIONS})
target_link_libraries(${application} PRIVATE exiv2lib std::filesystem) target_link_libraries(${application} PRIVATE exiv2lib std::filesystem)
if(MSVC)
target_link_libraries(${application} PRIVATE wmain)
target_link_options(${application} PRIVATE "/ENTRY:wWinMainCRTStartup")
endif()
if(MINGW)
target_link_libraries(${application} PRIVATE wmain)
target_compile_options(${application} PRIVATE -municode)
target_link_options(${application} PRIVATE -municode)
endif()
if(EXIV2_ENABLE_PNG)
target_link_libraries(${application} PRIVATE ${ZLIB_LIBRARIES})
if(MSVC) if(MSVC)
target_link_libraries(${application} PRIVATE wmain) set_target_properties(${application} PROPERTIES LINK_FLAGS "/ignore:4099") # Ignore missing PDBs
target_link_options(${application} PRIVATE "/ENTRY:wWinMainCRTStartup")
endif()
if (MINGW)
target_link_libraries(${application} PRIVATE wmain)
target_compile_options(${application} PRIVATE -municode)
target_link_options(${application} PRIVATE -municode)
endif()
if( EXIV2_ENABLE_PNG )
target_link_libraries(${application} PRIVATE ${ZLIB_LIBRARIES} )
if (MSVC)
set_target_properties(${application} PROPERTIES LINK_FLAGS "/ignore:4099") # Ignore missing PDBs
endif()
endif() endif()
endif()
endforeach() endforeach()
# That's all Folks! # That's all Folks!
## #

@ -2,34 +2,58 @@ include(CMakePackageConfigHelpers)
include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_library(
add_library( exiv2lib_int OBJECT exiv2lib_int OBJECT
canonmn_int.cpp canonmn_int.hpp canonmn_int.cpp
casiomn_int.cpp casiomn_int.hpp canonmn_int.hpp
cr2header_int.cpp cr2header_int.hpp casiomn_int.cpp
crwimage_int.cpp crwimage_int.hpp casiomn_int.hpp
fujimn_int.cpp fujimn_int.hpp cr2header_int.cpp
helper_functions.cpp helper_functions.hpp cr2header_int.hpp
image_int.cpp image_int.hpp crwimage_int.cpp
jp2image_int.cpp jp2image_int.hpp crwimage_int.hpp
makernote_int.cpp makernote_int.hpp fujimn_int.cpp
minoltamn_int.cpp minoltamn_int.hpp fujimn_int.hpp
nikonmn_int.cpp nikonmn_int.hpp helper_functions.cpp
olympusmn_int.cpp olympusmn_int.hpp helper_functions.hpp
orfimage_int.cpp orfimage_int.hpp image_int.cpp
panasonicmn_int.cpp panasonicmn_int.hpp image_int.hpp
pentaxmn_int.cpp pentaxmn_int.hpp jp2image_int.cpp
rw2image_int.cpp rw2image_int.hpp jp2image_int.hpp
safe_op.hpp makernote_int.cpp
samsungmn_int.cpp samsungmn_int.hpp makernote_int.hpp
sigmamn_int.cpp sigmamn_int.hpp minoltamn_int.cpp
sonymn_int.cpp sonymn_int.hpp minoltamn_int.hpp
tags_int.cpp tags_int.hpp nikonmn_int.cpp
tiffcomposite_int.cpp tiffcomposite_int.hpp nikonmn_int.hpp
tiffimage_int.cpp tiffimage_int.hpp olympusmn_int.cpp
tiffvisitor_int.cpp tiffvisitor_int.hpp olympusmn_int.hpp
tifffwd_int.hpp orfimage_int.cpp
utils.hpp utils.cpp orfimage_int.hpp
panasonicmn_int.cpp
panasonicmn_int.hpp
pentaxmn_int.cpp
pentaxmn_int.hpp
rw2image_int.cpp
rw2image_int.hpp
safe_op.hpp
samsungmn_int.cpp
samsungmn_int.hpp
sigmamn_int.cpp
sigmamn_int.hpp
sonymn_int.cpp
sonymn_int.hpp
tags_int.cpp
tags_int.hpp
tiffcomposite_int.cpp
tiffcomposite_int.hpp
tiffimage_int.cpp
tiffimage_int.hpp
tiffvisitor_int.cpp
tiffvisitor_int.hpp
tifffwd_int.hpp
utils.hpp
utils.cpp
) )
set(PUBLIC_HEADERS set(PUBLIC_HEADERS
@ -76,191 +100,189 @@ set(PUBLIC_HEADERS
../include/exiv2/xmpsidecar.hpp ../include/exiv2/xmpsidecar.hpp
) )
add_library( exiv2lib add_library(
asfvideo.cpp exiv2lib
basicio.cpp asfvideo.cpp
bmffimage.cpp basicio.cpp
bmpimage.cpp bmffimage.cpp
convert.cpp bmpimage.cpp
cr2image.cpp convert.cpp
crwimage.cpp cr2image.cpp
datasets.cpp crwimage.cpp
easyaccess.cpp datasets.cpp
epsimage.cpp easyaccess.cpp
error.cpp epsimage.cpp
exif.cpp error.cpp
futils.cpp exif.cpp
fff.h futils.cpp
gifimage.cpp fff.h
http.cpp gifimage.cpp
image.cpp http.cpp
iptc.cpp image.cpp
jp2image.cpp iptc.cpp
jpgimage.cpp jp2image.cpp
metadatum.cpp jpgimage.cpp
mrwimage.cpp metadatum.cpp
orfimage.cpp mrwimage.cpp
pgfimage.cpp orfimage.cpp
photoshop.cpp pgfimage.cpp
preview.cpp photoshop.cpp
properties.cpp preview.cpp
psdimage.cpp properties.cpp
rafimage.cpp psdimage.cpp
rw2image.cpp rafimage.cpp
tags.cpp rw2image.cpp
tgaimage.cpp tags.cpp
tiffimage.cpp tgaimage.cpp
types.cpp tiffimage.cpp
value.cpp types.cpp
version.cpp value.cpp
webpimage.cpp version.cpp
xmp.cpp webpimage.cpp
xmpsidecar.cpp xmp.cpp
${PUBLIC_HEADERS} xmpsidecar.cpp
$<TARGET_OBJECTS:exiv2lib_int> ${PUBLIC_HEADERS}
$<TARGET_OBJECTS:exiv2lib_int>
) )
add_library(Exiv2::exiv2lib ALIAS exiv2lib) add_library(Exiv2::exiv2lib ALIAS exiv2lib)
generate_export_header(exiv2lib generate_export_header(
EXPORT_MACRO_NAME EXIV2API exiv2lib
EXPORT_FILE_NAME ${CMAKE_BINARY_DIR}/exiv2lib_export.h EXPORT_MACRO_NAME
STATIC_DEFINE exiv2lib_STATIC EXIV2API
EXPORT_FILE_NAME
${CMAKE_BINARY_DIR}/exiv2lib_export.h
STATIC_DEFINE
exiv2lib_STATIC
) )
# Conditional addition of sources to library targets # Conditional addition of sources to library targets
# --------------------------------------------------------- # ---------------------------------------------------------
if( EXIV2_ENABLE_PNG ) if(EXIV2_ENABLE_PNG)
set(PUBLIC_HEADERS ${PUBLIC_HEADERS} ../include/exiv2/pngimage.hpp) set(PUBLIC_HEADERS ${PUBLIC_HEADERS} ../include/exiv2/pngimage.hpp)
target_sources(exiv2lib_int PRIVATE pngchunk_int.cpp pngchunk_int.hpp) target_sources(exiv2lib_int PRIVATE pngchunk_int.cpp pngchunk_int.hpp)
target_sources(exiv2lib PRIVATE pngimage.cpp ../include/exiv2/pngimage.hpp) target_sources(exiv2lib PRIVATE pngimage.cpp ../include/exiv2/pngimage.hpp)
endif() endif()
if( EXV_ENABLE_VIDEO ) if(EXV_ENABLE_VIDEO)
set(PUBLIC_HEADERS ${PUBLIC_HEADERS} ../include/exiv2/asfvideo.hpp) set(PUBLIC_HEADERS ${PUBLIC_HEADERS} ../include/exiv2/asfvideo.hpp)
target_sources(exiv2lib PRIVATE asfvideo.cpp ../include/exiv2/asfvideo.hpp) target_sources(exiv2lib PRIVATE asfvideo.cpp ../include/exiv2/asfvideo.hpp)
set(PUBLIC_HEADERS ${PUBLIC_HEADERS} ../include/exiv2/matroskavideo.hpp) set(PUBLIC_HEADERS ${PUBLIC_HEADERS} ../include/exiv2/matroskavideo.hpp)
target_sources(exiv2lib PRIVATE matroskavideo.cpp ../include/exiv2/matroskavideo.hpp) target_sources(exiv2lib PRIVATE matroskavideo.cpp ../include/exiv2/matroskavideo.hpp)
set(PUBLIC_HEADERS ${PUBLIC_HEADERS} ../include/exiv2/quicktimevideo.hpp) set(PUBLIC_HEADERS ${PUBLIC_HEADERS} ../include/exiv2/quicktimevideo.hpp)
target_sources(exiv2lib PRIVATE quicktimevideo.cpp ../include/exiv2/quicktimevideo.hpp) target_sources(exiv2lib PRIVATE quicktimevideo.cpp ../include/exiv2/quicktimevideo.hpp)
set(PUBLIC_HEADERS ${PUBLIC_HEADERS} ../include/exiv2/riffvideo.hpp) set(PUBLIC_HEADERS ${PUBLIC_HEADERS} ../include/exiv2/riffvideo.hpp)
target_sources(exiv2lib PRIVATE riffvideo.cpp ../include/exiv2/riffvideo.hpp) target_sources(exiv2lib PRIVATE riffvideo.cpp ../include/exiv2/riffvideo.hpp)
endif() endif()
# Other library target properties # Other library target properties
# --------------------------------------------------------- # ---------------------------------------------------------
set_target_properties( exiv2lib PROPERTIES set_target_properties(
VERSION ${PROJECT_VERSION} exiv2lib
SOVERSION ${EXIV2LIB_SOVERSION} PROPERTIES VERSION ${PROJECT_VERSION}
OUTPUT_NAME exiv2 SOVERSION ${EXIV2LIB_SOVERSION}
PDB_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} OUTPUT_NAME exiv2
COMPILE_FLAGS ${EXTRA_COMPILE_FLAGS} PDB_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMPILE_FLAGS ${EXTRA_COMPILE_FLAGS}
) )
if (MSVC) if(MSVC)
set_target_properties(exiv2lib PROPERTIES LINK_FLAGS "/ignore:4099") set_target_properties(exiv2lib PROPERTIES LINK_FLAGS "/ignore:4099")
endif() endif()
set_target_properties( exiv2lib_int PROPERTIES set_target_properties(exiv2lib_int PROPERTIES POSITION_INDEPENDENT_CODE ON COMPILE_DEFINITIONS exiv2lib_EXPORTS)
POSITION_INDEPENDENT_CODE ON
COMPILE_DEFINITIONS exiv2lib_EXPORTS
)
# NOTE: Cannot use target_link_libraries on OBJECT libraries with old versions of CMake # NOTE: Cannot use target_link_libraries on OBJECT libraries with old versions of CMake
target_include_directories(exiv2lib_int PRIVATE ${ZLIB_INCLUDE_DIR}) target_include_directories(exiv2lib_int PRIVATE ${ZLIB_INCLUDE_DIR})
target_include_directories(exiv2lib SYSTEM PRIVATE target_include_directories(exiv2lib SYSTEM PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/xmpsdk/include>)
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/xmpsdk/include>
)
if (EXIV2_ENABLE_XMP OR EXIV2_ENABLE_EXTERNAL_XMP) if(EXIV2_ENABLE_XMP OR EXIV2_ENABLE_EXTERNAL_XMP)
target_include_directories(exiv2lib PRIVATE ${EXPAT_INCLUDE_DIR}) target_include_directories(exiv2lib PRIVATE ${EXPAT_INCLUDE_DIR})
target_link_libraries(exiv2lib PRIVATE EXPAT::EXPAT) target_link_libraries(exiv2lib PRIVATE EXPAT::EXPAT)
list(APPEND requires_private_list "expat") list(APPEND requires_private_list "expat")
endif() endif()
if (EXIV2_ENABLE_XMP) if(EXIV2_ENABLE_XMP)
target_sources(exiv2lib PRIVATE $<TARGET_OBJECTS:exiv2-xmp>) target_sources(exiv2lib PRIVATE $<TARGET_OBJECTS:exiv2-xmp>)
elseif(EXIV2_ENABLE_EXTERNAL_XMP) elseif(EXIV2_ENABLE_EXTERNAL_XMP)
target_link_libraries(exiv2lib PUBLIC ${XMPSDK_LIBRARY}) target_link_libraries(exiv2lib PUBLIC ${XMPSDK_LIBRARY})
target_include_directories(exiv2lib PUBLIC ${XMPSDK_INCLUDE_DIR}) target_include_directories(exiv2lib PUBLIC ${XMPSDK_INCLUDE_DIR})
target_compile_definitions(exiv2lib PUBLIC EXV_ADOBE_XMPSDK=2016) target_compile_definitions(exiv2lib PUBLIC EXV_ADOBE_XMPSDK=2016)
endif() endif()
# Use include/exiv2 to build library code # Use include/exiv2 to build library code
target_include_directories(exiv2lib PUBLIC target_include_directories(
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/exiv2> exiv2lib PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/exiv2> $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
) )
target_include_directories(exiv2lib_int PUBLIC target_include_directories(exiv2lib_int PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/exiv2>)
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/exiv2>
)
if (EXIV2_ENABLE_WEBREADY) if(EXIV2_ENABLE_WEBREADY)
if( EXIV2_ENABLE_CURL ) if(EXIV2_ENABLE_CURL)
target_include_directories(exiv2lib SYSTEM PRIVATE ${CURL_INCLUDE_DIR} ) target_include_directories(exiv2lib SYSTEM PRIVATE ${CURL_INCLUDE_DIR})
target_link_libraries(exiv2lib PRIVATE ${CURL_LIBRARIES}) target_link_libraries(exiv2lib PRIVATE ${CURL_LIBRARIES})
list(APPEND requires_private_list "libcurl") list(APPEND requires_private_list "libcurl")
endif() endif()
endif() endif()
if (WIN32) if(WIN32)
target_compile_definitions(exiv2lib PRIVATE PSAPI_VERSION=1) # to be compatible with <= WinVista (#905) target_compile_definitions(exiv2lib PRIVATE PSAPI_VERSION=1) # to be compatible with <= WinVista (#905)
# Since windows.h is included in some headers, we need to propagate this definition # Since windows.h is included in some headers, we need to propagate this definition
target_compile_definitions(exiv2lib PUBLIC WIN32_LEAN_AND_MEAN) target_compile_definitions(exiv2lib PUBLIC WIN32_LEAN_AND_MEAN)
endif() endif()
if (NOT MSVC) if(NOT MSVC)
if ( CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" ) if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
target_link_libraries( exiv2lib PRIVATE -lprocstat) target_link_libraries(exiv2lib PRIVATE -lprocstat)
endif() endif()
if (MINGW) if(MINGW)
target_link_libraries( exiv2lib PRIVATE psapi ws2_32 shell32 ) target_link_libraries(exiv2lib PRIVATE psapi ws2_32 shell32)
endif() endif()
else() else()
target_link_libraries( exiv2lib PRIVATE psapi ws2_32 shell32 ) target_link_libraries(exiv2lib PRIVATE psapi ws2_32 shell32)
endif() endif()
if( EXIV2_ENABLE_PNG ) if(EXIV2_ENABLE_PNG)
target_link_libraries( exiv2lib PRIVATE ZLIB::ZLIB) target_link_libraries(exiv2lib PRIVATE ZLIB::ZLIB)
list(APPEND requires_private_list "zlib") list(APPEND requires_private_list "zlib")
endif() endif()
if( EXIV2_ENABLE_BMFF AND BROTLI_FOUND ) if(EXIV2_ENABLE_BMFF AND BROTLI_FOUND)
target_link_libraries( exiv2lib PRIVATE ${Brotli_LIBRARIES}) target_link_libraries(exiv2lib PRIVATE ${Brotli_LIBRARIES})
target_include_directories(exiv2lib PRIVATE ${Brotli_INCLUDE_DIRS}) target_include_directories(exiv2lib PRIVATE ${Brotli_INCLUDE_DIRS})
list(APPEND requires_private_list "libbrotlidec") list(APPEND requires_private_list "libbrotlidec")
endif() endif()
if( EXIV2_ENABLE_NLS ) if(EXIV2_ENABLE_NLS)
target_link_libraries(exiv2lib PRIVATE ${Intl_LIBRARIES}) target_link_libraries(exiv2lib PRIVATE ${Intl_LIBRARIES})
target_include_directories(exiv2lib PRIVATE ${Intl_INCLUDE_DIRS}) target_include_directories(exiv2lib PRIVATE ${Intl_INCLUDE_DIRS})
target_include_directories(exiv2lib_int PRIVATE ${Intl_INCLUDE_DIRS}) target_include_directories(exiv2lib_int PRIVATE ${Intl_INCLUDE_DIRS})
if( Intl_LIBRARIES ) if(Intl_LIBRARIES)
list(APPEND libs_private_list "intl") list(APPEND libs_private_list "intl")
endif() endif()
# Definition needed for translations # Definition needed for translations
join_paths(EXV_LOCALEDIR ".." "${CMAKE_INSTALL_LOCALEDIR}") join_paths(EXV_LOCALEDIR ".." "${CMAKE_INSTALL_LOCALEDIR}")
target_compile_definitions(exiv2lib PUBLIC EXV_LOCALEDIR="${EXV_LOCALEDIR}") target_compile_definitions(exiv2lib PUBLIC EXV_LOCALEDIR="${EXV_LOCALEDIR}")
endif() endif()
if( Iconv_FOUND AND Iconv_LIBRARIES ) if(Iconv_FOUND AND Iconv_LIBRARIES)
target_link_libraries( exiv2lib PRIVATE Iconv::Iconv ) target_link_libraries(exiv2lib PRIVATE Iconv::Iconv)
list(APPEND libs_private_list "iconv") list(APPEND libs_private_list "iconv")
endif() endif()
if( EXIV2_ENABLE_INIH ) if(EXIV2_ENABLE_INIH)
target_link_libraries( exiv2lib_int PRIVATE inih::libinih ) target_link_libraries(exiv2lib_int PRIVATE inih::libinih)
target_link_libraries( exiv2lib_int PRIVATE inih::inireader ) target_link_libraries(exiv2lib_int PRIVATE inih::inireader)
target_link_libraries( exiv2lib PRIVATE inih::libinih ) target_link_libraries(exiv2lib PRIVATE inih::libinih)
target_link_libraries( exiv2lib PRIVATE inih::inireader ) target_link_libraries(exiv2lib PRIVATE inih::inireader)
list(APPEND requires_private_list "INIReader") list(APPEND requires_private_list "INIReader")
endif() endif()
@ -268,13 +290,19 @@ endif()
list(SORT libs_private_list) list(SORT libs_private_list)
string(REPLACE ";" " -l" libs_private_string "${libs_private_list}") string(REPLACE ";" " -l" libs_private_string "${libs_private_list}")
if(libs_private_string) if(libs_private_string)
string(PREPEND libs_private_string "-l") string(PREPEND libs_private_string "-l")
endif() endif()
list(SORT requires_private_list) list(SORT requires_private_list)
string(REPLACE ";" ", " requires_private_string "${requires_private_list}") string(REPLACE ";" ", " requires_private_string "${requires_private_list}")
set(libs_private_for_pc_file "${libs_private_string}" PARENT_SCOPE) set(libs_private_for_pc_file
set(requires_private_for_pc_file "${requires_private_string}" PARENT_SCOPE) "${libs_private_string}"
PARENT_SCOPE
)
set(requires_private_for_pc_file
"${requires_private_string}"
PARENT_SCOPE
)
write_basic_package_version_file(exiv2ConfigVersion.cmake COMPATIBILITY ExactVersion) write_basic_package_version_file(exiv2ConfigVersion.cmake COMPATIBILITY ExactVersion)
@ -282,25 +310,17 @@ install(TARGETS exiv2lib EXPORT exiv2Export)
include(CMakePackageConfigHelpers) include(CMakePackageConfigHelpers)
configure_package_config_file( configure_package_config_file(
../cmake/exiv2Config.cmake.in ../cmake/exiv2Config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/exiv2Config.cmake INSTALL_DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/exiv2"
${CMAKE_CURRENT_BINARY_DIR}/exiv2Config.cmake
INSTALL_DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/exiv2"
) )
install(FILES install(FILES ${PUBLIC_HEADERS} ${CMAKE_BINARY_DIR}/exv_conf.h ${CMAKE_BINARY_DIR}/exiv2lib_export.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/exiv2)
${PUBLIC_HEADERS}
${CMAKE_BINARY_DIR}/exv_conf.h
${CMAKE_BINARY_DIR}/exiv2lib_export.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/exiv2)
install(EXPORT exiv2Export
DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/exiv2"
NAMESPACE Exiv2::
)
install( install(
FILES EXPORT exiv2Export
${CMAKE_CURRENT_BINARY_DIR}/exiv2ConfigVersion.cmake DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/exiv2"
${CMAKE_CURRENT_BINARY_DIR}/exiv2Config.cmake NAMESPACE Exiv2::
DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/exiv2") )
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/exiv2ConfigVersion.cmake ${CMAKE_CURRENT_BINARY_DIR}/exiv2Config.cmake
DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/exiv2"
)

@ -1,76 +1,64 @@
# Prefer using Google supplied CMake config as built-in module is buggy before 3.23 # Prefer using Google supplied CMake config as built-in module is buggy before 3.23
find_package(GTest CONFIG) find_package(GTest CONFIG)
if(NOT GTest_FOUND) if(NOT GTest_FOUND)
find_package(GTest REQUIRED) find_package(GTest REQUIRED)
endif() endif()
# video support. # video support.
if( EXV_ENABLE_VIDEO ) if(EXV_ENABLE_VIDEO)
set(VIDEO_SUPPORT test_asfvideo.cpp test_matroskavideo.cpp test_riffVideo.cpp) set(VIDEO_SUPPORT test_asfvideo.cpp test_matroskavideo.cpp test_riffVideo.cpp)
endif() endif()
add_executable(unit_tests add_executable(
test_basicio.cpp unit_tests
test_bmpimage.cpp test_basicio.cpp
test_cr2header_int.cpp test_bmpimage.cpp
test_datasets.cpp test_cr2header_int.cpp
test_Error.cpp test_datasets.cpp
test_DateValue.cpp test_Error.cpp
test_enforce.cpp test_DateValue.cpp
test_FileIo.cpp test_enforce.cpp
test_futils.cpp test_FileIo.cpp
test_helper_functions.cpp test_futils.cpp
test_image_int.cpp test_helper_functions.cpp
test_ImageFactory.cpp test_image_int.cpp
test_jp2image.cpp test_ImageFactory.cpp
test_jp2image_int.cpp test_jp2image.cpp
test_IptcKey.cpp test_jp2image_int.cpp
test_LangAltValueRead.cpp test_IptcKey.cpp
test_Photoshop.cpp test_LangAltValueRead.cpp
test_pngimage.cpp test_Photoshop.cpp
test_safe_op.cpp test_pngimage.cpp
test_slice.cpp test_safe_op.cpp
test_tiffheader.cpp test_slice.cpp
test_types.cpp test_tiffheader.cpp
test_TimeValue.cpp test_types.cpp
test_utils.cpp test_TimeValue.cpp
test_XmpKey.cpp test_utils.cpp
${VIDEO_SUPPORT} test_XmpKey.cpp
$<TARGET_OBJECTS:exiv2lib_int> ${VIDEO_SUPPORT}
$<TARGET_OBJECTS:exiv2lib_int>
) )
target_compile_definitions(unit_tests target_compile_definitions(unit_tests PRIVATE exiv2lib_STATIC TESTDATA_PATH="${PROJECT_SOURCE_DIR}/test/data")
PRIVATE
exiv2lib_STATIC
TESTDATA_PATH="${PROJECT_SOURCE_DIR}/test/data"
)
target_link_libraries(unit_tests target_link_libraries(unit_tests PRIVATE exiv2lib GTest::gmock_main std::filesystem)
PRIVATE
exiv2lib
GTest::gmock_main
std::filesystem
)
if( EXIV2_ENABLE_INIH ) if(EXIV2_ENABLE_INIH)
target_link_libraries(unit_tests PRIVATE inih::libinih inih::inireader) target_link_libraries(unit_tests PRIVATE inih::libinih inih::inireader)
endif() endif()
# ZLIB is used in exiv2lib_int. # ZLIB is used in exiv2lib_int.
if( EXIV2_ENABLE_PNG ) if(EXIV2_ENABLE_PNG)
target_link_libraries(unit_tests PRIVATE ${ZLIB_LIBRARIES} ) target_link_libraries(unit_tests PRIVATE ${ZLIB_LIBRARIES})
endif() endif()
target_include_directories(unit_tests target_include_directories(unit_tests PRIVATE ${PROJECT_SOURCE_DIR}/src)
PRIVATE ${PROJECT_SOURCE_DIR}/src
)
set_target_properties(unit_tests PROPERTIES set_target_properties(unit_tests PROPERTIES COMPILE_FLAGS ${EXTRA_COMPILE_FLAGS})
COMPILE_FLAGS ${EXTRA_COMPILE_FLAGS}
)
if (MSVC) if(MSVC)
set_target_properties(unit_tests PROPERTIES LINK_FLAGS "/ignore:4099") set_target_properties(unit_tests PROPERTIES LINK_FLAGS "/ignore:4099")
endif() endif()
add_test(NAME unitTests COMMAND unit_tests) add_test(NAME unitTests COMMAND unit_tests)

@ -1,51 +1,46 @@
add_library(exiv2-xmp OBJECT add_library(
src/ExpatAdapter.cpp exiv2-xmp OBJECT
src/MD5.cpp src/ExpatAdapter.cpp
src/ParseRDF.cpp src/MD5.cpp
src/UnicodeConversions.cpp src/ParseRDF.cpp
src/WXMPIterator.cpp src/UnicodeConversions.cpp
src/WXMPMeta.cpp src/WXMPIterator.cpp
src/WXMPUtils.cpp src/WXMPMeta.cpp
src/XML_Node.cpp src/WXMPUtils.cpp
src/XMPCore_Impl.cpp src/XML_Node.cpp
src/XMPIterator.cpp src/XMPCore_Impl.cpp
src/XMPMeta-GetSet.cpp src/XMPIterator.cpp
src/XMPMeta-Parse.cpp src/XMPMeta-GetSet.cpp
src/XMPMeta-Serialize.cpp src/XMPMeta-Parse.cpp
src/XMPMeta.cpp src/XMPMeta-Serialize.cpp
src/XMPUtils-FileInfo.cpp src/XMPMeta.cpp
src/XMPUtils.cpp src/XMPUtils-FileInfo.cpp
include/MD5.h src/XMPUtils.cpp
include/TXMPIterator.hpp include/MD5.h
include/TXMPMeta.hpp include/TXMPIterator.hpp
include/TXMPUtils.hpp include/TXMPMeta.hpp
include/XMP_Const.h include/TXMPUtils.hpp
include/XMP_Environment.h include/XMP_Const.h
include/XMP.incl_cpp include/XMP_Environment.h
include/XMPSDK.hpp include/XMP.incl_cpp
include/XMP_Version.h include/XMPSDK.hpp
include/XMP_Version.h
) )
target_include_directories(exiv2-xmp SYSTEM target_include_directories(exiv2-xmp SYSTEM PRIVATE ${PROJECT_SOURCE_DIR}/xmpsdk/include ${EXPAT_INCLUDE_DIRS})
PRIVATE
${PROJECT_SOURCE_DIR}/xmpsdk/include
${EXPAT_INCLUDE_DIRS}
)
# Prevent a denial-service-attack related to XML entity expansion # Prevent a denial-service-attack related to XML entity expansion ("billion laughs attack"). See https://bugzilla.redhat.com/show_bug.cgi?id=888769
# ("billion laughs attack").
# See https://bugzilla.redhat.com/show_bug.cgi?id=888769
target_compile_definitions(exiv2-xmp PRIVATE BanAllEntityUsage=1) target_compile_definitions(exiv2-xmp PRIVATE BanAllEntityUsage=1)
if (WIN32) if(WIN32)
target_compile_definitions(exiv2-xmp PRIVATE XML_STATIC) target_compile_definitions(exiv2-xmp PRIVATE XML_STATIC)
endif() endif()
if (MINGW) if(MINGW)
# https://stackoverflow.com/questions/18551409/localtime-r-support-on-mingw # https://stackoverflow.com/questions/18551409/localtime-r-support-on-mingw
target_compile_definitions(exiv2-xmp PRIVATE _POSIX_THREAD_SAFE_FUNCTIONS) target_compile_definitions(exiv2-xmp PRIVATE _POSIX_THREAD_SAFE_FUNCTIONS)
endif() endif()
if (BUILD_SHARED_LIBS) if(BUILD_SHARED_LIBS)
set_property(TARGET exiv2-xmp PROPERTY POSITION_INDEPENDENT_CODE ON) set_property(TARGET exiv2-xmp PROPERTY POSITION_INDEPENDENT_CODE ON)
endif() endif()

Loading…
Cancel
Save