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,13 +1,18 @@
# 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
# * 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." DESCRIPTION "Exif/IPTC/Xmp C++ metadata library and tools plus ICC Profiles, Previews and more."
LANGUAGES C CXX LANGUAGES C CXX
) )
@ -22,60 +27,56 @@ 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()
@ -83,27 +84,27 @@ 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,36 +115,48 @@ 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()
@ -163,9 +176,9 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/exiv2.pc DESTINATION ${CMAKE_INSTALL_L
# ****************************************************************************** # ******************************************************************************
# 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,24 +1,25 @@
add_executable( exiv2 add_executable(
exiv2
exiv2.cpp exiv2.cpp
exiv2app.hpp exiv2app.hpp
actions.cpp actions.hpp actions.cpp
getopt.cpp getopt.hpp actions.hpp
app_utils.cpp app_utils.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"
)
if (MSVC)
set_target_properties(exiv2 PROPERTIES LINK_FLAGS "/ignore:4099") # Ignore missing PDBs 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()
@ -26,29 +27,33 @@ 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
)
# Copy 3rd party DLLs the bin folder. [build step] # 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.
add_custom_command(TARGET exiv2 POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_BINARY_DIR}/conanDlls ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) add_custom_command(
TARGET exiv2
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)

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

@ -1,6 +1,8 @@
find_package(Gettext REQUIRED) find_package(Gettext REQUIRED)
GETTEXT_CREATE_TRANSLATIONS(exiv2.pot ALL gettext_create_translations(
exiv2.pot
ALL
bs.po bs.po
de.po de.po
ca.po ca.po
@ -25,14 +27,8 @@ 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
--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" COMMENT "Extract translatable messages to exiv2.pot"
) )

@ -1,6 +1,6 @@
# 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
@ -31,73 +31,62 @@ set( SAMPLES
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
exiv2-xmp
${EXPAT_LIBRARIES}
)
target_include_directories(geotag PRIVATE ${CMAKE_BINARY_DIR}) # exv_conf.h 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 ${PROJECT_SOURCE_DIR}/include) # <exiv2/exiv2.hpp>
target_include_directories(geotag PRIVATE ${EXPAT_INCLUDE_DIR}) target_include_directories(geotag PRIVATE ${EXPAT_INCLUDE_DIR})
if (WIN32) if(WIN32)
target_compile_definitions(geotag PRIVATE XML_STATIC) target_compile_definitions(geotag PRIVATE XML_STATIC)
endif() endif()
if (MSVC) if(MSVC)
set_target_properties(geotag PROPERTIES LINK_FLAGS "/ignore:4099") set_target_properties(geotag PROPERTIES LINK_FLAGS "/ignore:4099")
endif() endif()
install( TARGETS geotag RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) install(TARGETS geotag RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
endif() endif()
# ****************************************************************************** # ******************************************************************************
@ -105,9 +94,9 @@ 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()
@ -124,18 +113,18 @@ foreach(application ${APPLICATIONS})
target_link_libraries(${application} PRIVATE wmain) target_link_libraries(${application} PRIVATE wmain)
target_link_options(${application} PRIVATE "/ENTRY:wWinMainCRTStartup") target_link_options(${application} PRIVATE "/ENTRY:wWinMainCRTStartup")
endif() endif()
if (MINGW) if(MINGW)
target_link_libraries(${application} PRIVATE wmain) target_link_libraries(${application} PRIVATE wmain)
target_compile_options(${application} PRIVATE -municode) target_compile_options(${application} PRIVATE -municode)
target_link_options(${application} PRIVATE -municode) target_link_options(${application} PRIVATE -municode)
endif() endif()
if( EXIV2_ENABLE_PNG ) if(EXIV2_ENABLE_PNG)
target_link_libraries(${application} PRIVATE ${ZLIB_LIBRARIES} ) target_link_libraries(${application} PRIVATE ${ZLIB_LIBRARIES})
if (MSVC) if(MSVC)
set_target_properties(${application} PROPERTIES LINK_FLAGS "/ignore:4099") # Ignore missing PDBs 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
makernote_int.cpp
makernote_int.hpp
minoltamn_int.cpp
minoltamn_int.hpp
nikonmn_int.cpp
nikonmn_int.hpp
olympusmn_int.cpp
olympusmn_int.hpp
orfimage_int.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 safe_op.hpp
samsungmn_int.cpp samsungmn_int.hpp samsungmn_int.cpp
sigmamn_int.cpp sigmamn_int.hpp samsungmn_int.hpp
sonymn_int.cpp sonymn_int.hpp sigmamn_int.cpp
tags_int.cpp tags_int.hpp sigmamn_int.hpp
tiffcomposite_int.cpp tiffcomposite_int.hpp sonymn_int.cpp
tiffimage_int.cpp tiffimage_int.hpp sonymn_int.hpp
tiffvisitor_int.cpp tiffvisitor_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 tifffwd_int.hpp
utils.hpp utils.cpp utils.hpp
utils.cpp
) )
set(PUBLIC_HEADERS set(PUBLIC_HEADERS
@ -76,7 +100,8 @@ set(PUBLIC_HEADERS
../include/exiv2/xmpsidecar.hpp ../include/exiv2/xmpsidecar.hpp
) )
add_library( exiv2lib add_library(
exiv2lib
asfvideo.cpp asfvideo.cpp
basicio.cpp basicio.cpp
bmffimage.cpp bmffimage.cpp
@ -121,22 +146,26 @@ add_library( exiv2lib
) )
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)
@ -153,36 +182,32 @@ endif()
# Other library target properties # Other library target properties
# --------------------------------------------------------- # ---------------------------------------------------------
set_target_properties( exiv2lib PROPERTIES set_target_properties(
VERSION ${PROJECT_VERSION} exiv2lib
PROPERTIES VERSION ${PROJECT_VERSION}
SOVERSION ${EXIV2LIB_SOVERSION} SOVERSION ${EXIV2LIB_SOVERSION}
OUTPUT_NAME exiv2 OUTPUT_NAME exiv2
PDB_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} PDB_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMPILE_FLAGS ${EXTRA_COMPILE_FLAGS} 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})
@ -191,59 +216,56 @@ elseif(EXIV2_ENABLE_EXTERNAL_XMP)
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
@ -251,16 +273,16 @@ if( EXIV2_ENABLE_NLS )
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()
@ -273,8 +295,14 @@ 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 install(
EXPORT exiv2Export
DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/exiv2" DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/exiv2"
NAMESPACE Exiv2:: NAMESPACE Exiv2::
) )
install( install(FILES ${CMAKE_CURRENT_BINARY_DIR}/exiv2ConfigVersion.cmake ${CMAKE_CURRENT_BINARY_DIR}/exiv2Config.cmake
FILES DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/exiv2"
${CMAKE_CURRENT_BINARY_DIR}/exiv2ConfigVersion.cmake )
${CMAKE_CURRENT_BINARY_DIR}/exiv2Config.cmake
DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/exiv2")

@ -5,11 +5,12 @@ if(NOT GTest_FOUND)
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(
unit_tests
test_basicio.cpp test_basicio.cpp
test_bmpimage.cpp test_bmpimage.cpp
test_cr2header_int.cpp test_cr2header_int.cpp
@ -39,37 +40,24 @@ add_executable(unit_tests
$<TARGET_OBJECTS:exiv2lib_int> $<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()

@ -1,4 +1,5 @@
add_library(exiv2-xmp OBJECT add_library(
exiv2-xmp OBJECT
src/ExpatAdapter.cpp src/ExpatAdapter.cpp
src/MD5.cpp src/MD5.cpp
src/ParseRDF.cpp src/ParseRDF.cpp
@ -26,26 +27,20 @@ add_library(exiv2-xmp OBJECT
include/XMP_Version.h 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