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# 28# There are also components for the following ImageMagick APIs: 29# 30# Magick++ 31# MagickWand 32# MagickCore 33# 34# For these components the following variables are set: 35# 36# ImageMagick_FOUND - TRUE if all components are found. 37# ImageMagick_INCLUDE_DIRS - Full paths to all include dirs. 38# ImageMagick_LIBRARIES - Full paths to all libraries. 39# ImageMagick_<component>_FOUND - TRUE if <component> is found. 40# ImageMagick_<component>_INCLUDE_DIRS - Full path to <component> include dirs. 41# ImageMagick_<component>_LIBRARIES - Full path to <component> libraries. 42# 43# Example Usages: 44# FIND_PACKAGE(ImageMagick) 45# FIND_PACKAGE(ImageMagick COMPONENTS convert) 46# FIND_PACKAGE(ImageMagick COMPONENTS convert mogrify display) 47# FIND_PACKAGE(ImageMagick COMPONENTS Magick++) 48# FIND_PACKAGE(ImageMagick COMPONENTS Magick++ convert) 49# 50# Note that the standard FIND_PACKAGE features are supported 51# (i.e., QUIET, REQUIRED, etc.). 52 53#============================================================================= 54# Copyright 2007-2009 Kitware, Inc. 55# Copyright 2007-2008 Miguel A. Figueroa-Villanueva <miguelf at ieee dot org> 56# 57# Distributed under the OSI-approved BSD License (the "License"); 58# see accompanying file Copyright_cmake.txt for details. 59# 60# This software is distributed WITHOUT ANY WARRANTY; without even the 61# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 62# See the License for more information. 63#============================================================================= 64# (To distributed this file outside of CMake, substitute the full 65# License text for the above reference.) 66 67find_package(PkgConfig QUIET) 68 69function(FIND_REGISTRY) 70 if (WIN32) 71 72 # If a 64-bit compile, it can only appear in "[HKLM]\\software\\ImageMagick" 73 if (CMAKE_CL_64) 74 75 GET_FILENAME_COMPONENT(IM_BIN_PATH 76 [HKEY_LOCAL_MACHINE\\SOFTWARE\\ImageMagick\\Current;BinPath] 77 ABSOLUTE CACHE) 78 79 else() 80 81 # This is dumb, but it's the only way I've been able to get this to work. CMake has no knowledge of the systems architecture. 82 # So, if we want to detect if we're running a 32-bit compile on a 64-bit OS, we need to manually check for the existence of 83 # ImageMagick in the WOW6432Node of the registry first. If that fails, assume they want the 64-bit version. 84 GET_FILENAME_COMPONENT(TESTING 85 [HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\ImageMagick\\Current;BinPath] 86 PATH) 87 88 # If the WOW6432Node reg string returns empty, assume 32-bit OS, and look in the standard reg path. 89 if (TESTING STREQUAL "") 90 91 GET_FILENAME_COMPONENT(IM_BIN_PATH 92 [HKEY_LOCAL_MACHINE\\SOFTWARE\\ImageMagick\\Current;BinPath] 93 ABSOLUTE CACHE) 94 95 # Otherwise, the WOW6432Node returned a string, assume 32-bit build on 64-bit OS and use that string. 96 else() 97 98 GET_FILENAME_COMPONENT(IM_BIN_PATH 99 [HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\ImageMagick\\Current;BinPath] 100 ABSOLUTE CACHE) 101 102 endif() 103 104 endif() 105 106 set (IMAGEMAGIC_REG_PATH ${IM_BIN_PATH} PARENT_SCOPE) 107 set (IMAGEMAGIC_REGINCLUDE_PATH ${IM_BIN_PATH}/include PARENT_SCOPE) 108 set (IMAGEMAGIC_REGLIB_PATH ${IM_BIN_PATH}/lib PARENT_SCOPE) 109 110 else() 111 112 # No registry exists for Linux. So, just set these to empty strings. 113 set (IMAGEMAGIC_REG_PATH "" PARENT_SCOPE) 114 set (IMAGEMAGIC_REGINCLUDE_PATH "" PARENT_SCOPE) 115 set (IMAGEMAGIC_REGLIB_PATH "" PARENT_SCOPE) 116 117 endif() 118endfunction() 119 120 121#--------------------------------------------------------------------- 122# Helper functions 123#--------------------------------------------------------------------- 124FUNCTION(FIND_IMAGEMAGICK_API component header) 125 SET(ImageMagick_${component}_FOUND FALSE PARENT_SCOPE) 126 127 FIND_PATH(ImageMagick_${component}_INCLUDE_DIR 128 NAMES ${header} 129 PATHS 130 ${ImageMagick_INCLUDE_DIRS} 131 ${IMAGEMAGIC_REGINCLUDE_PATH} 132 PATH_SUFFIXES 133 ImageMagick ImageMagick-6 134 DOC "Path to the ImageMagick include dir." 135 ) 136 FIND_PATH(ImageMagick_${component}_ARCH_INCLUDE_DIR 137 NAMES magick/magick-baseconfig.h 138 PATHS 139 ${ImageMagick_INCLUDE_DIRS} 140 ${IMAGEMAGIC_REGINCLUDE_PATH} 141 PATH_SUFFIXES 142 ImageMagick ImageMagick-6 143 DOC "Path to the ImageMagick arch-specific include dir." 144 ) 145 FIND_LIBRARY(ImageMagick_${component}_LIBRARY 146 NAMES ${ARGN} 147 PATHS 148 ${IMAGEMAGIC_REGLIB_PATH} 149 DOC "Path to the ImageMagick Magick++ library." 150 ) 151 152 IF(ImageMagick_${component}_INCLUDE_DIR AND ImageMagick_${component}_LIBRARY) 153 154 SET(ImageMagick_${component}_FOUND TRUE PARENT_SCOPE) 155 LIST(APPEND ImageMagick_INCLUDE_DIRS 156 ${ImageMagick_${component}_INCLUDE_DIR} 157 ) 158 IF(EXISTS ${ImageMagick_${component}_ARCH_INCLUDE_DIR}) 159 LIST(APPEND ImageMagick_INCLUDE_DIRS 160 ${ImageMagick_${component}_ARCH_INCLUDE_DIR} 161 ) 162 ENDIF(EXISTS ${ImageMagick_${component}_ARCH_INCLUDE_DIR}) 163 LIST(REMOVE_DUPLICATES ImageMagick_INCLUDE_DIRS) 164 SET(ImageMagick_INCLUDE_DIRS ${ImageMagick_INCLUDE_DIRS} PARENT_SCOPE) 165 166 LIST(APPEND ImageMagick_LIBRARIES 167 ${ImageMagick_${component}_LIBRARY} 168 ) 169 SET(ImageMagick_LIBRARIES ${ImageMagick_LIBRARIES} PARENT_SCOPE) 170 ENDIF(ImageMagick_${component}_INCLUDE_DIR AND ImageMagick_${component}_LIBRARY) 171 172ENDFUNCTION(FIND_IMAGEMAGICK_API) 173 174FUNCTION(FIND_IMAGEMAGICK_EXE component) 175 SET(_IMAGEMAGICK_EXECUTABLE 176 ${ImageMagick_EXECUTABLE_DIR}/${component}${CMAKE_EXECUTABLE_SUFFIX}) 177 IF(EXISTS ${_IMAGEMAGICK_EXECUTABLE}) 178 SET(ImageMagick_${component}_EXECUTABLE 179 ${_IMAGEMAGICK_EXECUTABLE} 180 PARENT_SCOPE 181 ) 182 SET(ImageMagick_${component}_FOUND TRUE PARENT_SCOPE) 183 ELSE(EXISTS ${_IMAGEMAGICK_EXECUTABLE}) 184 SET(ImageMagick_${component}_FOUND FALSE PARENT_SCOPE) 185 ENDIF(EXISTS ${_IMAGEMAGICK_EXECUTABLE}) 186ENDFUNCTION(FIND_IMAGEMAGICK_EXE) 187 188#--------------------------------------------------------------------- 189# Start Actual Work 190#--------------------------------------------------------------------- 191FIND_REGISTRY() 192 193# Try to find a ImageMagick installation binary path. 194FIND_PATH(ImageMagick_EXECUTABLE_DIR 195 NAMES mogrify${CMAKE_EXECUTABLE_SUFFIX} 196 PATHS 197 ${IMAGEMAGIC_REG_PATH} 198 DOC "Path to the ImageMagick binary directory." 199 NO_DEFAULT_PATH 200 ) 201FIND_PATH(ImageMagick_EXECUTABLE_DIR 202 NAMES mogrify${CMAKE_EXECUTABLE_SUFFIX} 203 ) 204 205# Find each component. Search for all tools in same dir 206# <ImageMagick_EXECUTABLE_DIR>; otherwise they should be found 207# independently and not in a cohesive module such as this one. 208SET(ImageMagick_FOUND TRUE) 209FOREACH(component ${ImageMagick_FIND_COMPONENTS} 210 # DEPRECATED: forced components for backward compatibility 211 convert mogrify import montage composite 212 ) 213 IF(component STREQUAL "Magick++") 214 FIND_IMAGEMAGICK_API(Magick++ Magick++.h 215 Magick++ CORE_RL_Magick++_ Magick++-6.Q16 Magick++-Q16 Magick++-6.Q8 Magick++-Q8 Magick++-6.Q16HDRI Magick++-Q16HDRI Magick++-6.Q8HDRI Magick++-Q8HDRI 216 ) 217 ELSEIF(component STREQUAL "MagickWand") 218 FIND_IMAGEMAGICK_API(MagickWand wand/MagickWand.h 219 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 220 ) 221 ELSEIF(component STREQUAL "MagickCore") 222 FIND_IMAGEMAGICK_API(MagickCore magick/MagickCore.h 223 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 224 ) 225 ELSE(component STREQUAL "Magick++") 226 IF(ImageMagick_EXECUTABLE_DIR) 227 FIND_IMAGEMAGICK_EXE(${component}) 228 ENDIF(ImageMagick_EXECUTABLE_DIR) 229 ENDIF(component STREQUAL "Magick++") 230 231 IF(NOT ImageMagick_${component}_FOUND) 232 LIST(FIND ImageMagick_FIND_COMPONENTS ${component} is_requested) 233 IF(is_requested GREATER -1) 234 SET(ImageMagick_FOUND FALSE) 235 ENDIF(is_requested GREATER -1) 236 ENDIF(NOT ImageMagick_${component}_FOUND) 237ENDFOREACH(component) 238 239SET(ImageMagick_INCLUDE_DIRS ${ImageMagick_INCLUDE_DIRS}) 240SET(ImageMagick_LIBRARIES ${ImageMagick_LIBRARIES}) 241 242#--------------------------------------------------------------------- 243# Standard Package Output 244#--------------------------------------------------------------------- 245INCLUDE(FindPackageHandleStandardArgs) 246FIND_PACKAGE_HANDLE_STANDARD_ARGS( 247 ImageMagick DEFAULT_MSG ImageMagick_FOUND 248 ) 249# Maintain consistency with all other variables. 250SET(ImageMagick_FOUND ${IMAGEMAGICK_FOUND}) 251 252#--------------------------------------------------------------------- 253# DEPRECATED: Setting variables for backward compatibility. 254#--------------------------------------------------------------------- 255SET(IMAGEMAGICK_BINARY_PATH ${ImageMagick_EXECUTABLE_DIR} 256 CACHE PATH "Path to the ImageMagick binary directory.") 257SET(IMAGEMAGICK_CONVERT_EXECUTABLE ${ImageMagick_convert_EXECUTABLE} 258 CACHE FILEPATH "Path to ImageMagick's convert executable.") 259SET(IMAGEMAGICK_MOGRIFY_EXECUTABLE ${ImageMagick_mogrify_EXECUTABLE} 260 CACHE FILEPATH "Path to ImageMagick's mogrify executable.") 261SET(IMAGEMAGICK_IMPORT_EXECUTABLE ${ImageMagick_import_EXECUTABLE} 262 CACHE FILEPATH "Path to ImageMagick's import executable.") 263SET(IMAGEMAGICK_MONTAGE_EXECUTABLE ${ImageMagick_montage_EXECUTABLE} 264 CACHE FILEPATH "Path to ImageMagick's montage executable.") 265SET(IMAGEMAGICK_COMPOSITE_EXECUTABLE ${ImageMagick_composite_EXECUTABLE} 266 CACHE FILEPATH "Path to ImageMagick's composite executable.") 267 268MARK_AS_ADVANCED( 269 IMAGEMAGICK_BINARY_PATH 270 IMAGEMAGICK_CONVERT_EXECUTABLE 271 IMAGEMAGICK_MOGRIFY_EXECUTABLE 272 IMAGEMAGICK_IMPORT_EXECUTABLE 273 IMAGEMAGICK_MONTAGE_EXECUTABLE 274 IMAGEMAGICK_COMPOSITE_EXECUTABLE 275 ) 276