1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-14 02:08:27 +08:00

FindImageMagick: Add ImageMagick_VERSION

This deprecates the ImageMagick_VERSION_STRING result variable.

Additionally, ImageMagick version is now determined by either mogrify
executable (if available), or from the `<magick/version.h>` header.

Issue: #27088
This commit is contained in:
Peter Kokot
2025-09-13 23:48:05 +02:00
parent b53375ea94
commit 032e829b23
5 changed files with 102 additions and 18 deletions

View File

@@ -43,6 +43,10 @@ Find Modules
* The :module:`FindIcotool` module now provides a ``Icotool_VERSION`` result
variable. The ``ICOTOOL_VERSION_STRING`` result variable is deprecated.
* The :module:`FindImageMagick` module now provides an ``ImageMagick_VERSION``
result variable. The ``ImageMagick_VERSION_STRING`` result variable is
deprecated.
* The :module:`FindJasper` module now provides a ``Jasper_VERSION`` result
variable. The ``JASPER_VERSION_STRING`` result variable is deprecated.

View File

@@ -82,11 +82,15 @@ Result Variables
This module defines the following variables:
``ImageMagick_FOUND``
Boolean indicating whether ImageMagick and all its requested components are
found.
Boolean indicating whether (the requested version of) ImageMagick and all
its requested components are found.
``ImageMagick_VERSION_STRING``
The version of ImageMagick found.
``ImageMagick_VERSION``
.. versionadded:: 4.2
The version of ImageMagick found in form of
``<major>.<minor>.<patch>-<addendum>`` (e.g., ``6.9.12-98``, where ``98``
is the addendum release number).
.. note::
@@ -131,6 +135,17 @@ The following cache variables may also be set:
``ImageMagick_EXECUTABLE_DIR``
The full path to directory containing ImageMagick executables.
Deprecated Variables
^^^^^^^^^^^^^^^^^^^^
The following variables are provided for backward compatibility:
``ImageMagick_VERSION_STRING``
.. deprecated:: 4.2
Use ``ImageMagick_VERSION``, which has the same value.
The version of ImageMagick found.
Examples
^^^^^^^^
@@ -143,6 +158,10 @@ target:
target_link_libraries(example PRIVATE ImageMagick::Magick++)
#]=======================================================================]
cmake_policy(PUSH)
cmake_policy(SET CMP0140 NEW)
cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n>
find_package(PkgConfig QUIET)
#---------------------------------------------------------------------
@@ -257,6 +276,60 @@ function(FIND_IMAGEMAGICK_EXE component)
endif()
endfunction()
function(_ImageMagick_GetVersion)
unset(version)
if(ImageMagick_mogrify_EXECUTABLE)
execute_process(
COMMAND ${ImageMagick_mogrify_EXECUTABLE} -version
OUTPUT_VARIABLE version
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(version MATCHES "^Version: ImageMagick ([-0-9.]+)")
set(version "${CMAKE_MATCH_1}")
endif()
elseif(ImageMagick_INCLUDE_DIRS)
# MagickLibSubversion was used in ImageMagick <= 6.5.
set(
regex
"^[\t ]*#[\t ]*define[\t ]+(MagickLibVersionText|MagickLibAddendum|MagickLibSubversion)[\t ]+\"([-0-9.]+)\""
)
foreach(dir IN LISTS ImageMagick_INCLUDE_DIRS)
if(EXISTS ${dir}/magick/version.h)
file(STRINGS "${dir}/magick/version.h" results REGEX "${regex}")
foreach(line ${results})
if(line MATCHES "${regex}")
if(DEFINED version)
string(APPEND version "${CMAKE_MATCH_2}")
else()
set(version "${CMAKE_MATCH_2}")
endif()
if(CMAKE_MATCH_1 STREQUAL "MagickLibAddendum")
break()
endif()
endif()
endforeach()
endif()
if(DEFINED version)
break()
endif()
endforeach()
endif()
if(DEFINED version)
set(ImageMagick_VERSION "${version}")
set(ImageMagick_VERSION_STRING "${ImageMagick_VERSION}")
endif()
return(PROPAGATE ImageMagick_VERSION ImageMagick_VERSION_STRING)
endfunction()
#---------------------------------------------------------------------
# Start Actual Work
#---------------------------------------------------------------------
@@ -344,16 +417,7 @@ endif()
set(ImageMagick_INCLUDE_DIRS ${ImageMagick_INCLUDE_DIRS})
set(ImageMagick_LIBRARIES ${ImageMagick_LIBRARIES})
if(ImageMagick_mogrify_EXECUTABLE)
execute_process(COMMAND ${ImageMagick_mogrify_EXECUTABLE} -version
OUTPUT_VARIABLE imagemagick_version
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(imagemagick_version MATCHES "^Version: ImageMagick ([-0-9\\.]+)")
set(ImageMagick_VERSION_STRING "${CMAKE_MATCH_1}")
endif()
unset(imagemagick_version)
endif()
_ImageMagick_GetVersion()
#---------------------------------------------------------------------
# Standard Package Output
@@ -361,7 +425,7 @@ endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(ImageMagick
REQUIRED_VARS ${ImageMagick_REQUIRED_VARS}
VERSION_VAR ImageMagick_VERSION_STRING
VERSION_VAR ImageMagick_VERSION
)
#---------------------------------------------------------------------
@@ -387,3 +451,5 @@ mark_as_advanced(
IMAGEMAGICK_MONTAGE_EXECUTABLE
IMAGEMAGICK_COMPOSITE_EXECUTABLE
)
cmake_policy(POP)

View File

@@ -99,7 +99,7 @@ foreach(
FREETYPE
GETTEXT GIT GNUTLS
HG HSPELL
ICOTOOL
ICOTOOL ImageMagick
JASPER
LIBLZMA LIBXML2 LIBXSLT LTTNGUST
OpenCL
@@ -122,7 +122,7 @@ foreach(
FLEX Freetype
Gettext GIF GnuTLS GNUTLS GTK2
HDF5 Hg HSPELL
Icotool
Icotool ImageMagick
Jasper JPEG
LibArchive LibLZMA LIBLZMA LibXml2 LibXslt LTTngUST
OpenCL OpenSceneGraph OPENSCENEGRAPH OpenSSL OPENSSL

View File

@@ -6,6 +6,10 @@ find_package(ImageMagick REQUIRED COMPONENTS Magick++ MagickWand)
add_executable(test_magick++ main_magick++.cxx)
target_link_libraries(test_magick++ PRIVATE ImageMagick::Magick++)
target_compile_definitions(
test_magick++
PRIVATE CMAKE_EXPECTED_IMAGEMAGICK_VERSION="${ImageMagick_VERSION}"
)
add_test(NAME test_magick++ COMMAND test_magick++)
add_executable(test_magick_wand main_magick_wand.c)

View File

@@ -1,3 +1,4 @@
#include <cstring>
#include <iostream>
#include <string>
@@ -6,5 +7,14 @@
int main()
{
Magick::InitializeMagick("");
return 0;
std::string found_version =
std::string(MagickLibVersionText) + MagickLibAddendum;
std::cout << "Found ImageMagick version " << found_version
<< ", expected version " << CMAKE_EXPECTED_IMAGEMAGICK_VERSION
<< "\n";
return std::strcmp(found_version.c_str(),
CMAKE_EXPECTED_IMAGEMAGICK_VERSION);
}