1# - Find the ImageMagick binary suite.
2# This module will search for a set of ImageMagick tools specified
3# as components in the FIND_PACKAGE call. Typical components include,
4# but are not limited to (future versions of ImageMagick might have
5# additional components not listed here):
6#
7#  animate
8#  compare
9#  composite
10#  conjure
11#  convert
12#  display
13#  identify
14#  import
15#  mogrify
16#  montage
17#  stream
18#
19# If no component is specified in the FIND_PACKAGE call, then it only
20# searches for the ImageMagick executable directory. This code defines
21# the following variables:
22#
23#  ImageMagick_FOUND                  - TRUE if all components are found.
24#  ImageMagick_EXECUTABLE_DIR         - Full path to executables directory.
25#  ImageMagick_<component>_FOUND      - TRUE if <component> is found.
26#  ImageMagick_<component>_EXECUTABLE - Full path to <component> executable.
27#  ImageMagick_VERSION_STRING         - the version of ImageMagick found
28#                                       (since CMake 2.8.8)
29#
30# ImageMagick_VERSION_STRING will not work for old versions like 5.2.3.
31#
32# There are also components for the following ImageMagick APIs:
33#
34#  Magick++
35#  MagickWand
36#  MagickCore
37#
38# For these components the following variables are set:
39#
40#  ImageMagick_FOUND                    - TRUE if all components are found.
41#  ImageMagick_INCLUDE_DIRS             - Full paths to all include dirs.
42#  ImageMagick_LIBRARIES                - Full paths to all libraries.
43#  ImageMagick_<component>_FOUND        - TRUE if <component> is found.
44#  ImageMagick_<component>_INCLUDE_DIRS - Full path to <component> include dirs.
45#  ImageMagick_<component>_LIBRARIES    - Full path to <component> libraries.
46#
47# Example Usages:
48#  find_package(ImageMagick)
49#  find_package(ImageMagick COMPONENTS convert)
50#  find_package(ImageMagick COMPONENTS convert mogrify display)
51#  find_package(ImageMagick COMPONENTS Magick++)
52#  find_package(ImageMagick COMPONENTS Magick++ convert)
53#
54# Note that the standard FIND_PACKAGE features are supported
55# (i.e., QUIET, REQUIRED, etc.).
56
57#=============================================================================
58# Copyright 2007-2009 Kitware, Inc.
59# Copyright 2007-2008 Miguel A. Figueroa-Villanueva <miguelf at ieee dot org>
60# Copyright 2012 Rolf Eike Beer <eike@sf-mail.de>
61# Copyright 2013 Nodar Kasradze : full (better ;) support of local install of IM
62#
63# Distributed under the OSI-approved BSD License (the "License");
64# see accompanying file Copyright.txt for details.
65#
66# This software is distributed WITHOUT ANY WARRANTY; without even the
67# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
68# See the License for more information.
69#=============================================================================
70# (To distribute this file outside of CMake, substitute the full
71#  License text for the above reference.)
72
73# Define variables
74set(ENV{PATH} "${MAGICKDIR}/bin:$ENV{PATH}")
75set(ENV{PKG_CONFIG_PATH} "${MAGICKDIR}/libdata/pkgconfig/:$ENV{PKG_CONFIG_PATH}")
76
77#---------------------------------------------------------------------
78# Helper functions
79#---------------------------------------------------------------------
80
81
82function(FIND_IMAGEMAGICK_API component header)
83  set(ImageMagick_${component}_FOUND FALSE PARENT_SCOPE)
84
85  find_path(ImageMagick_${component}_INCLUDE_DIR
86    NAMES ${header}
87    PATHS
88      ${ImageMagick_INCLUDE_DIRS}
89      "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ImageMagick\\Current;BinPath]/include"
90    PATH_SUFFIXES
91      ImageMagick ImageMagick-6
92    DOC "Path to the ImageMagick include dir."
93    )
94
95  find_library(ImageMagick_${component}_LIBRARY
96    NAMES ${ARGN}
97    PATHS
98	${CMAKE_PREFIX_PATH}/lib
99	NO_DEFAULT_PATH
100    DOC "Path to the ImageMagick Magick++ library."
101    )
102
103  find_library(ImageMagick_${component}_LIBRARY
104    NAMES ${ARGN}
105    PATHS
106      "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ImageMagick\\Current;BinPath]/lib"
107    DOC "Path to the ImageMagick Magick++ library."
108    )
109
110
111  if(ImageMagick_${component}_INCLUDE_DIR AND ImageMagick_${component}_LIBRARY)
112    set(ImageMagick_${component}_FOUND TRUE PARENT_SCOPE)
113
114    list(APPEND ImageMagick_INCLUDE_DIRS
115      ${ImageMagick_${component}_INCLUDE_DIR}
116      )
117    list(REMOVE_DUPLICATES ImageMagick_INCLUDE_DIRS)
118    set(ImageMagick_INCLUDE_DIRS ${ImageMagick_INCLUDE_DIRS} PARENT_SCOPE)
119
120    list(APPEND ImageMagick_LIBRARIES
121      ${ImageMagick_${component}_LIBRARY}
122      )
123    set(ImageMagick_LIBRARIES ${ImageMagick_LIBRARIES} PARENT_SCOPE)
124  endif()
125endfunction()
126
127function(FIND_IMAGEMAGICK_EXE component)
128
129  set(_IMAGEMAGICK_EXECUTABLE
130    ${ImageMagick_EXECUTABLE_DIR}/${component}${CMAKE_EXECUTABLE_SUFFIX})
131  if(EXISTS ${_IMAGEMAGICK_EXECUTABLE})
132    set(ImageMagick_${component}_EXECUTABLE
133      ${_IMAGEMAGICK_EXECUTABLE}
134       PARENT_SCOPE
135       )
136    set(ImageMagick_${component}_FOUND TRUE PARENT_SCOPE)
137  else()
138    set(ImageMagick_${component}_FOUND FALSE PARENT_SCOPE)
139  endif()
140endfunction()
141
142#---------------------------------------------------------------------
143# Start Actual Work
144#---------------------------------------------------------------------
145# Try to find a ImageMagick installation binary path.
146find_path(ImageMagick_EXECUTABLE_DIR
147  NAMES mogrify${CMAKE_EXECUTABLE_SUFFIX}
148  PATHS
149    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ImageMagick\\Current;BinPath]"
150  DOC "Path to the ImageMagick binary directory."
151  NO_DEFAULT_PATH
152  )
153find_path(ImageMagick_EXECUTABLE_DIR
154  NAMES mogrify${CMAKE_EXECUTABLE_SUFFIX}
155  )
156
157# Find each component. Search for all tools in same dir
158# <ImageMagick_EXECUTABLE_DIR>; otherwise they should be found
159# independently and not in a cohesive module such as this one.
160unset(ImageMagick_REQUIRED_VARS)
161unset(ImageMagick_DEFAULT_EXECUTABLES)
162foreach(component ${ImageMagick_FIND_COMPONENTS}
163    # DEPRECATED: forced components for backward compatibility
164    convert mogrify import montage composite
165    )
166  if(component STREQUAL "Magick++")
167    FIND_IMAGEMAGICK_API(Magick++ Magick++.h
168      Magick++-6 Magick++ CORE_RL_Magick++_ Magick++-6.Q16 Magick++-Q16 Magick++-6.Q8 Magick++-Q8 Magick++-6.Q16HDRI Magick++-Q16HDRI Magick++-6.Q8HDRI Magick++-Q8HDRI
169      )
170    list(APPEND ImageMagick_REQUIRED_VARS ImageMagick_Magick++_LIBRARY)
171  elseif(component STREQUAL "MagickWand")
172    FIND_IMAGEMAGICK_API(MagickWand wand/MagickWand.h
173      MagickWand-6 Wand MagickWand CORE_RL_wand_ MagickWand-6.Q16 MagickWand-Q16 MagickWand-6.Q8 MagickWand-Q8 MagickWand-6.Q16HDRI MagickWand-Q16HDRI MagickWand-6.Q8HDRI MagickWand-Q8HDRI
174      )
175    list(APPEND ImageMagick_REQUIRED_VARS ImageMagick_MagickWand_LIBRARY)
176  elseif(component STREQUAL "MagickCore")
177    FIND_IMAGEMAGICK_API(MagickCore magick/MagickCore.h
178      MagickCore-6 Magick MagickCore CORE_RL_magick_ MagickCore-6.Q16 MagickCore-Q16 MagickCore-6.Q8 MagickCore-Q8 MagickCore-6.Q16HDRI MagickCore-Q16HDRI MagickCore-6.Q8HDRI MagickCore-Q8HDRI
179      )
180    list(APPEND ImageMagick_REQUIRED_VARS ImageMagick_MagickCore_LIBRARY)
181  else()
182    if(ImageMagick_EXECUTABLE_DIR)
183      FIND_IMAGEMAGICK_EXE(${component})
184    endif()
185
186    if(ImageMagick_FIND_COMPONENTS)
187      list(FIND ImageMagick_FIND_COMPONENTS ${component} is_requested)
188      if(is_requested GREATER -1)
189        list(APPEND ImageMagick_REQUIRED_VARS ImageMagick_${component}_EXECUTABLE)
190      endif()
191    elseif(ImageMagick_${component}_EXECUTABLE)
192      # if no components were requested explicitly put all (default) executables
193      # in the list
194      list(APPEND ImageMagick_DEFAULT_EXECUTABLES ImageMagick_${component}_EXECUTABLE)
195    endif()
196  endif()
197endforeach()
198
199if(NOT ImageMagick_FIND_COMPONENTS AND NOT ImageMagick_DEFAULT_EXECUTABLES)
200  # No components were requested, and none of the default components were
201  # found. Just insert mogrify into the list of the default components to
202  # find so FPHSA below has something to check
203  list(APPEND ImageMagick_REQUIRED_VARS ImageMagick_mogrify_EXECUTABLE)
204elseif(ImageMagick_DEFAULT_EXECUTABLES)
205  list(APPEND ImageMagick_REQUIRED_VARS ${ImageMagick_DEFAULT_EXECUTABLES})
206endif()
207
208set(ImageMagick_INCLUDE_DIRS ${ImageMagick_INCLUDE_DIRS})
209set(ImageMagick_LIBRARIES ${ImageMagick_LIBRARIES})
210
211if(ImageMagick_mogrify_EXECUTABLE)
212  execute_process(COMMAND ${ImageMagick_mogrify_EXECUTABLE} -version
213                  OUTPUT_VARIABLE imagemagick_version
214                  ERROR_QUIET
215                  OUTPUT_STRIP_TRAILING_WHITESPACE)
216  if(imagemagick_version MATCHES "^Version: ImageMagick [0-9]")
217    string(REGEX REPLACE "^Version: ImageMagick ([-0-9\\.]+).*" "\\1" ImageMagick_VERSION_STRING "${imagemagick_version}")
218  endif()
219  unset(imagemagick_version)
220endif()
221
222#---------------------------------------------------------------------
223# Standard Package Output
224#---------------------------------------------------------------------
225include(FindPackageHandleStandardArgs)
226FIND_PACKAGE_HANDLE_STANDARD_ARGS(ImageMagick
227                                  REQUIRED_VARS ${ImageMagick_REQUIRED_VARS}
228                                  VERSION_VAR ImageMagick_VERSION_STRING
229  )
230# Maintain consistency with all other variables.
231set(ImageMagick_FOUND ${IMAGEMAGICK_FOUND})
232
233if (ImageMagick_FOUND)
234# run the Magick++ config program to get cxxflags
235  execute_process(
236    COMMAND sh "${ImageMagick_EXECUTABLE_DIR}/MagickCore-config" "--cxxflags"
237    OUTPUT_VARIABLE IMAGEMAGICK_CXX_FLAGS
238    RESULT_VARIABLE RET
239    ERROR_QUIET
240    )
241  if(RET EQUAL 0)
242    string(STRIP "${IMAGEMAGICK_CXX_FLAGS}" IMAGEMAGICK_CXX_FLAGS)
243    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${IMAGEMAGICK_CXX_FLAGS}")
244  else()
245#    DBG_MSG_V("MagickCore-config --cxxflags command FAILED with RET=${RET}")
246    message(WARNING "MagickCore-config --cxxflags command FAILED with RET=${RET}")
247
248    endif()
249endif()
250
251#---------------------------------------------------------------------
252# DEPRECATED: Setting variables for backward compatibility.
253#---------------------------------------------------------------------
254set(IMAGEMAGICK_BINARY_PATH          ${ImageMagick_EXECUTABLE_DIR}
255    CACHE PATH "Path to the ImageMagick binary directory.")
256set(IMAGEMAGICK_CONVERT_EXECUTABLE   ${ImageMagick_convert_EXECUTABLE}
257    CACHE FILEPATH "Path to ImageMagick's convert executable.")
258set(IMAGEMAGICK_MOGRIFY_EXECUTABLE   ${ImageMagick_mogrify_EXECUTABLE}
259    CACHE FILEPATH "Path to ImageMagick's mogrify executable.")
260set(IMAGEMAGICK_IMPORT_EXECUTABLE    ${ImageMagick_import_EXECUTABLE}
261    CACHE FILEPATH "Path to ImageMagick's import executable.")
262set(IMAGEMAGICK_MONTAGE_EXECUTABLE   ${ImageMagick_montage_EXECUTABLE}
263    CACHE FILEPATH "Path to ImageMagick's montage executable.")
264set(IMAGEMAGICK_COMPOSITE_EXECUTABLE ${ImageMagick_composite_EXECUTABLE}
265    CACHE FILEPATH "Path to ImageMagick's composite executable.")
266mark_as_advanced(
267  IMAGEMAGICK_BINARY_PATH
268  IMAGEMAGICK_CONVERT_EXECUTABLE
269  IMAGEMAGICK_MOGRIFY_EXECUTABLE
270  IMAGEMAGICK_IMPORT_EXECUTABLE
271  IMAGEMAGICK_MONTAGE_EXECUTABLE
272  IMAGEMAGICK_COMPOSITE_EXECUTABLE
273  )
274
275