1 # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
4 #[=======================================================================[.rst:
8 Find ImageMagick, software suite for displaying, converting and
9 manipulating raster images.
13 Added support for ImageMagick 7.
15 This module will search for a set of ImageMagick tools specified as
16 components in the :command:`find_package` call. Typical components include,
17 but are not limited to (future versions of ImageMagick might have
18 additional components not listed here):
32 If no component is specified in the :command:`find_package` call, then it only
33 searches for the ImageMagick executable directory.
35 There are also components for the following ImageMagick APIs:
37 * ``Magick++``: ImageMagick C++ API, if found.
38 * ``MagickWand``: ImageMagick MagickWand C API, if found.
39 * ``MagickCore``: ImageMagick MagickCore low-level C API, if found.
45 .. versionadded:: 3.26
47 This module defines the following :prop_tgt:`IMPORTED` targets:
49 ``ImageMagick::Magick++``
50 ImageMagick C++ API, if found.
52 ``ImageMagick::MagickWand``
53 ImageMagick MagickWand C API, if found.
55 ``ImageMagick::MagickCore``
56 ImageMagick MagickCore low-level C API, if found.
63 TRUE if all components are found.
65 ``ImageMagick_EXECUTABLE_DIR``
66 Full path to executables directory.
68 ``ImageMagick_INCLUDE_DIRS``
69 Full paths to all include dirs.
71 ``ImageMagick_LIBRARIES``
72 Full paths to all libraries.
74 ``ImageMagick_COMPILE_OPTIONS``
75 Compile options of all libraries.
77 ``ImageMagick_VERSION_STRING``
78 The version of ImageMagick found (since CMake 2.8.8).
79 Will not work for old versions like 5.2.3.
81 ``ImageMagick_<component>_FOUND``
82 TRUE if <component> is found.
84 ``ImageMagick_<component>_EXECUTABLE``
85 Full path to <component> executable.
87 ``ImageMagick_<component>_INCLUDE_DIRS``
88 Full path to <component> include dirs.
90 ``ImageMagick_<component>_COMPILE_OPTIONS``
91 .. versionadded:: 3.26
93 Compile options of <component>.
95 ``ImageMagick_<component>_LIBRARIES``
96 .. versionadded:: 3.31
98 Full path to <component> libraries.
104 .. code-block:: cmake
106 find_package(ImageMagick COMPONENTS Magick++)
107 target_link_libraries(example PRIVATE ImageMagick::Magick++)
108 #]=======================================================================]
110 find_package(PkgConfig QUIET)
112 #---------------------------------------------------------------------
114 #---------------------------------------------------------------------
115 function(FIND_IMAGEMAGICK_API component header)
116 set(ImageMagick_${component}_FOUND FALSE PARENT_SCOPE)
119 pkg_check_modules(PC_${component} QUIET ${component})
122 find_path(ImageMagick_${component}_INCLUDE_DIR
125 ${PC_${component}_INCLUDEDIR}
126 ${PC_${component}_INCLUDE_DIRS}
128 ${ImageMagick_INCLUDE_DIRS}
129 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ImageMagick\\Current;BinPath]/include"
131 ImageMagick ImageMagick-6 ImageMagick-7
132 DOC "Path to the ImageMagick arch-independent include dir."
135 find_path(ImageMagick_${component}_ARCH_INCLUDE_DIR
137 magick/magick-baseconfig.h
138 MagickCore/magick-baseconfig.h
140 ${PC_${component}_INCLUDEDIR}
141 ${PC_${component}_INCLUDE_DIRS}
143 ${ImageMagick_INCLUDE_DIRS}
144 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ImageMagick\\Current;BinPath]/include"
146 ImageMagick ImageMagick-6 ImageMagick-7
147 DOC "Path to the ImageMagick arch-specific include dir."
150 find_library(ImageMagick_${component}_LIBRARY
153 ${PC_${component}_LIBDIR}
154 ${PC_${component}_LIB_DIRS}
156 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ImageMagick\\Current;BinPath]/lib"
157 DOC "Path to the ImageMagick Magick++ library."
161 # old version have only indep dir
162 if(ImageMagick_${component}_INCLUDE_DIR AND ImageMagick_${component}_LIBRARY)
163 set(ImageMagick_${component}_FOUND TRUE PARENT_SCOPE)
165 # Construct per-component include directories.
166 set(ImageMagick_${component}_INCLUDE_DIRS
167 ${ImageMagick_${component}_INCLUDE_DIR}
169 if(ImageMagick_${component}_ARCH_INCLUDE_DIR)
170 list(APPEND ImageMagick_${component}_INCLUDE_DIRS
171 ${ImageMagick_${component}_ARCH_INCLUDE_DIR})
173 list(REMOVE_DUPLICATES ImageMagick_${component}_INCLUDE_DIRS)
174 set(ImageMagick_${component}_INCLUDE_DIRS
175 ${ImageMagick_${component}_INCLUDE_DIRS} PARENT_SCOPE)
177 set(ImageMagick_${component}_LIBRARIES
178 ${ImageMagick_${component}_LIBRARY}
180 set(ImageMagick_${component}_LIBRARIES
181 ${ImageMagick_${component}_LIBRARIES} PARENT_SCOPE)
183 set(ImageMagick_${component}_COMPILE_OPTIONS ${PC_${component}_CFLAGS_OTHER})
185 # Add the per-component include directories to the full include dirs.
186 list(APPEND ImageMagick_INCLUDE_DIRS ${ImageMagick_${component}_INCLUDE_DIRS})
187 list(REMOVE_DUPLICATES ImageMagick_INCLUDE_DIRS)
188 set(ImageMagick_INCLUDE_DIRS ${ImageMagick_INCLUDE_DIRS} PARENT_SCOPE)
190 list(APPEND ImageMagick_LIBRARIES
191 ${ImageMagick_${component}_LIBRARY}
193 set(ImageMagick_LIBRARIES ${ImageMagick_LIBRARIES} PARENT_SCOPE)
195 list(APPEND ImageMagick_COMPILE_OPTIONS
196 ${ImageMagick_${component}_COMPILE_OPTIONS}
198 set(ImageMagick_COMPILE_OPTIONS ${ImageMagick_COMPILE_OPTIONS} PARENT_SCOPE)
200 if(NOT TARGET ImageMagick::${component})
201 add_library(ImageMagick::${component} UNKNOWN IMPORTED)
202 set_target_properties(ImageMagick::${component} PROPERTIES
203 INTERFACE_INCLUDE_DIRECTORIES "${ImageMagick_${component}_INCLUDE_DIRS}"
204 INTERFACE_COMPILE_OPTIONS "${ImageMagick_${component}_COMPILE_OPTIONS}"
205 IMPORTED_LOCATION "${ImageMagick_${component}_LIBRARY}")
210 function(FIND_IMAGEMAGICK_EXE component)
211 set(_IMAGEMAGICK_EXECUTABLE
212 ${ImageMagick_EXECUTABLE_DIR}/${component}${CMAKE_EXECUTABLE_SUFFIX})
213 if(EXISTS ${_IMAGEMAGICK_EXECUTABLE})
214 set(ImageMagick_${component}_EXECUTABLE
215 ${_IMAGEMAGICK_EXECUTABLE}
218 set(ImageMagick_${component}_FOUND TRUE PARENT_SCOPE)
220 set(ImageMagick_${component}_FOUND FALSE PARENT_SCOPE)
224 #---------------------------------------------------------------------
226 #---------------------------------------------------------------------
227 # Try to find a ImageMagick installation binary path.
228 find_path(ImageMagick_EXECUTABLE_DIR
229 NAMES mogrify${CMAKE_EXECUTABLE_SUFFIX}
231 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ImageMagick\\Current;BinPath]"
232 DOC "Path to the ImageMagick binary directory."
235 find_path(ImageMagick_EXECUTABLE_DIR
236 NAMES mogrify${CMAKE_EXECUTABLE_SUFFIX}
239 # Find each component. Search for all tools in same dir
240 # <ImageMagick_EXECUTABLE_DIR>; otherwise they should be found
241 # independently and not in a cohesive module such as this one.
242 unset(ImageMagick_REQUIRED_VARS)
243 unset(ImageMagick_DEFAULT_EXECUTABLES)
244 foreach(component ${ImageMagick_FIND_COMPONENTS}
245 # DEPRECATED: forced components for backward compatibility
246 convert mogrify import montage composite
248 if(component STREQUAL "Magick++")
249 FIND_IMAGEMAGICK_API(Magick++ Magick++.h
250 Magick++ CORE_RL_Magick++_
251 Magick++-6 Magick++-7
252 Magick++-Q8 Magick++-Q16 Magick++-Q16HDRI Magick++-Q8HDRI
253 Magick++-6.Q64 Magick++-6.Q32 Magick++-6.Q64HDRI Magick++-6.Q32HDRI
254 Magick++-6.Q16 Magick++-6.Q8 Magick++-6.Q16HDRI Magick++-6.Q8HDRI
255 Magick++-7.Q64 Magick++-7.Q32 Magick++-7.Q64HDRI Magick++-7.Q32HDRI
256 Magick++-7.Q16 Magick++-7.Q8 Magick++-7.Q16HDRI Magick++-7.Q8HDRI
258 list(APPEND ImageMagick_REQUIRED_VARS ImageMagick_Magick++_LIBRARY)
259 elseif(component STREQUAL "MagickWand")
260 FIND_IMAGEMAGICK_API(MagickWand "wand/MagickWand.h;MagickWand/MagickWand.h"
261 Wand MagickWand CORE_RL_wand_ CORE_RL_MagickWand_
262 MagickWand-6 MagickWand-7
263 MagickWand-Q16 MagickWand-Q8 MagickWand-Q16HDRI MagickWand-Q8HDRI
264 MagickWand-6.Q64 MagickWand-6.Q32 MagickWand-6.Q64HDRI MagickWand-6.Q32HDRI
265 MagickWand-6.Q16 MagickWand-6.Q8 MagickWand-6.Q16HDRI MagickWand-6.Q8HDRI
266 MagickWand-7.Q64 MagickWand-7.Q32 MagickWand-7.Q64HDRI MagickWand-7.Q32HDRI
267 MagickWand-7.Q16 MagickWand-7.Q8 MagickWand-7.Q16HDRI MagickWand-7.Q8HDRI
269 list(APPEND ImageMagick_REQUIRED_VARS ImageMagick_MagickWand_LIBRARY)
270 elseif(component STREQUAL "MagickCore")
271 FIND_IMAGEMAGICK_API(MagickCore "magick/MagickCore.h;MagickCore/MagickCore.h"
272 Magick MagickCore CORE_RL_magick_ CORE_RL_MagickCore_
273 MagickCore-6 MagickCore-7
274 MagickCore-Q16 MagickCore-Q8 MagickCore-Q16HDRI MagickCore-Q8HDRI
275 MagickCore-6.Q64 MagickCore-6.Q32 MagickCore-6.Q64HDRI MagickCore-6.Q32HDRI
276 MagickCore-6.Q16 MagickCore-6.Q8 MagickCore-6.Q16HDRI MagickCore-6.Q8HDRI
277 MagickCore-7.Q64 MagickCore-7.Q32 MagickCore-7.Q64HDRI MagickCore-7.Q32HDRI
278 MagickCore-7.Q16 MagickCore-7.Q8 MagickCore-7.Q16HDRI MagickCore-7.Q8HDRI
280 list(APPEND ImageMagick_REQUIRED_VARS ImageMagick_MagickCore_LIBRARY)
282 if(ImageMagick_EXECUTABLE_DIR)
283 FIND_IMAGEMAGICK_EXE(${component})
286 if(ImageMagick_FIND_COMPONENTS)
287 list(FIND ImageMagick_FIND_COMPONENTS ${component} is_requested)
288 if(is_requested GREATER -1)
289 list(APPEND ImageMagick_REQUIRED_VARS ImageMagick_${component}_EXECUTABLE)
291 elseif(ImageMagick_${component}_EXECUTABLE)
292 # if no components were requested explicitly put all (default) executables
294 list(APPEND ImageMagick_DEFAULT_EXECUTABLES ImageMagick_${component}_EXECUTABLE)
299 if(NOT ImageMagick_FIND_COMPONENTS AND NOT ImageMagick_DEFAULT_EXECUTABLES)
300 # No components were requested, and none of the default components were
301 # found. Just insert mogrify into the list of the default components to
302 # find so FPHSA below has something to check
303 list(APPEND ImageMagick_REQUIRED_VARS ImageMagick_mogrify_EXECUTABLE)
304 elseif(ImageMagick_DEFAULT_EXECUTABLES)
305 list(APPEND ImageMagick_REQUIRED_VARS ${ImageMagick_DEFAULT_EXECUTABLES})
308 set(ImageMagick_INCLUDE_DIRS ${ImageMagick_INCLUDE_DIRS})
309 set(ImageMagick_LIBRARIES ${ImageMagick_LIBRARIES})
311 if(ImageMagick_mogrify_EXECUTABLE)
312 execute_process(COMMAND ${ImageMagick_mogrify_EXECUTABLE} -version
313 OUTPUT_VARIABLE imagemagick_version
315 OUTPUT_STRIP_TRAILING_WHITESPACE)
316 if(imagemagick_version MATCHES "^Version: ImageMagick ([-0-9\\.]+)")
317 set(ImageMagick_VERSION_STRING "${CMAKE_MATCH_1}")
319 unset(imagemagick_version)
322 #---------------------------------------------------------------------
323 # Standard Package Output
324 #---------------------------------------------------------------------
325 include(FindPackageHandleStandardArgs)
326 find_package_handle_standard_args(ImageMagick
327 REQUIRED_VARS ${ImageMagick_REQUIRED_VARS}
328 VERSION_VAR ImageMagick_VERSION_STRING
331 #---------------------------------------------------------------------
332 # DEPRECATED: Setting variables for backward compatibility.
333 #---------------------------------------------------------------------
334 set(IMAGEMAGICK_BINARY_PATH ${ImageMagick_EXECUTABLE_DIR}
335 CACHE PATH "Path to the ImageMagick binary directory.")
336 set(IMAGEMAGICK_CONVERT_EXECUTABLE ${ImageMagick_convert_EXECUTABLE}
337 CACHE FILEPATH "Path to ImageMagick's convert executable.")
338 set(IMAGEMAGICK_MOGRIFY_EXECUTABLE ${ImageMagick_mogrify_EXECUTABLE}
339 CACHE FILEPATH "Path to ImageMagick's mogrify executable.")
340 set(IMAGEMAGICK_IMPORT_EXECUTABLE ${ImageMagick_import_EXECUTABLE}
341 CACHE FILEPATH "Path to ImageMagick's import executable.")
342 set(IMAGEMAGICK_MONTAGE_EXECUTABLE ${ImageMagick_montage_EXECUTABLE}
343 CACHE FILEPATH "Path to ImageMagick's montage executable.")
344 set(IMAGEMAGICK_COMPOSITE_EXECUTABLE ${ImageMagick_composite_EXECUTABLE}
345 CACHE FILEPATH "Path to ImageMagick's composite executable.")
347 IMAGEMAGICK_BINARY_PATH
348 IMAGEMAGICK_CONVERT_EXECUTABLE
349 IMAGEMAGICK_MOGRIFY_EXECUTABLE
350 IMAGEMAGICK_IMPORT_EXECUTABLE
351 IMAGEMAGICK_MONTAGE_EXECUTABLE
352 IMAGEMAGICK_COMPOSITE_EXECUTABLE