浏览代码

ENH: Updated FindImageMagick to:
- Find newer additions such as animate, compare, etc.
- Find development api: Magick++, MagickCore, MagickWand
- Use FindPackageHandleStandardArgs to output standard messages.

Miguel A. Figueroa-Villanueva 17 年之前
父节点
当前提交
363727f600
共有 1 个文件被更改,包括 173 次插入60 次删除
  1. 173 60
      Modules/FindImageMagick.cmake

+ 173 - 60
Modules/FindImageMagick.cmake

@@ -1,77 +1,190 @@
-# - Find Image Magick
-# This module finds if ImageMagick tools are installed and determines 
-# where the executables are. This code sets the following variables:
+# - Find the ImageMagick binary suite.
+# This module will search for a set of ImageMagick tools specified
+# as components in the FIND_PACKAGE call. Typical components include,
+# but are not limited to (future versions of ImageMagick might have
+# additional components not listed here):
 #
-#  IMAGEMAGICK_CONVERT_EXECUTABLE   = 
-#     the full path to the 'convert' utility 
-#  IMAGEMAGICK_MOGRIFY_EXECUTABLE   = 
-#     the full path to the 'mogrify' utility 
-#  IMAGEMAGICK_IMPORT_EXECUTABLE    = 
-#     the full path to the 'import'  utility 
-#  IMAGEMAGICK_MONTAGE_EXECUTABLE   = 
-#     the full path to the 'montage' utility 
-#  IMAGEMAGICK_COMPOSITE_EXECUTABLE = 
-#     the full path to the 'composite' utility 
+#  animate
+#  compare
+#  composite
+#  conjure
+#  convert
+#  display
+#  identify
+#  import
+#  mogrify
+#  montage
+#  stream
 #
+# If no component is specified in the FIND_PACKAGE call, then it only
+# searches for the ImageMagick executable directory. This code defines
+# the following variables:
+#
+#  ImageMagick_FOUND                  - TRUE if all components are found.
+#  ImageMagick_EXECUTABLE_DIR         - Full path to executables directory.
+#  ImageMagick_<component>_FOUND      - TRUE if <component> is found.
+#  ImageMagick_<component>_EXECUTABLE - Full path to <component> executable.
+#
+# There are also components for the following ImageMagick APIs:
+#
+#  Magick++
+#  MagickWand
+#  Magick
+#
+# For these components the following variables are set:
+#
+#  ImageMagick_FOUND                    - TRUE if all components are found.
+#  ImageMagick_INCLUDE_DIRS             - Full paths to all include dirs.
+#  ImageMagick_LIBRARIES                - Full paths to all libraries.
+#  ImageMagick_<component>_FOUND        - TRUE if <component> is found.
+#  ImageMagick_<component>_INCLUDE_DIRS - Full path to <component> include dirs.
+#  ImageMagick_<component>_LIBRARIES    - Full path to <component> libraries.
+#
+# Example Usages:
+#  FIND_PACKAGE(ImageMagick)
+#  FIND_PACKAGE(ImageMagick COMPONENTS convert)
+#  FIND_PACKAGE(ImageMagick COMPONENTS convert mogrify display)
+#  FIND_PACKAGE(ImageMagick COMPONENTS Magick++)
+#  FIND_PACKAGE(ImageMagick COMPONENTS Magick++ convert)
+#
+# Note that the standard FIND_PACKAGE features are supported
+# (i.e., QUIET, REQUIRED, etc.).
 
-IF (WIN32)
+# Copyright (c) 2007-2008,
+#  Miguel A. Figueroa-Villanueva, miguelf at ieee dot org.
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
 
-  # Try to find the ImageMagick binary path.
+#---------------------------------------------------------------------
+# Helper functions
+#---------------------------------------------------------------------
+FUNCTION(FIND_IMAGEMAGICK_API component header)
+  SET(ImageMagick_${component}_FOUND FALSE PARENT_SCOPE)
 
-  FIND_PATH(IMAGEMAGICK_BINARY_PATH mogrify.exe
-    [HKEY_LOCAL_MACHINE\\SOFTWARE\\ImageMagick\\Current;BinPath]
-    DOC "Path to the ImageMagick binary directory where all executable should be found."
-  )
+  FIND_PATH(ImageMagick_${component}_INCLUDE_DIR
+    NAMES ${header}
+    PATHS
+      ${ImageMagick_INCLUDE_DIRS}
+      "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ImageMagick\\Current;BinPath]/include"
+    PATH_SUFFIXES
+      ImageMagick
+    DOC "Path to the ImageMagick include dir."
+    )
+  FIND_LIBRARY(ImageMagick_${component}_LIBRARY
+    NAMES ${ARGN}
+    PATHS
+      "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ImageMagick\\Current;BinPath]/lib"
+    DOC "Path to the ImageMagick Magick++ library."
+    )
 
-  # Be extra-careful here: we do NOT want CMake to look in the system's PATH
-  # env var to search for convert.exe, otherwise it is going to pick
-  # Window's own convert.exe, and you may say good-bye to your disk.
+  IF(ImageMagick_${component}_INCLUDE_DIR AND ImageMagick_${component}_LIBRARY)
+    SET(ImageMagick_${component}_FOUND TRUE PARENT_SCOPE)
 
-  FIND_PROGRAM(IMAGEMAGICK_CONVERT_EXECUTABLE
-    NAMES convert
-    PATHS ${IMAGEMAGICK_BINARY_PATH}
-    NO_SYSTEM_PATH
-    DOC "Path to ImageMagick's convert executable. WARNING: note that this tool, named convert.exe, conflicts with Microsoft Window's own convert.exe, which is used to convert FAT partitions to NTFS format ! Therefore, be extra-careful and make sure the right convert.exe has been picked."
-  )
+    LIST(APPEND ImageMagick_INCLUDE_DIRS
+      ${ImageMagick_${component}_INCLUDE_DIR}
+      )
+    LIST(REMOVE_DUPLICATES ImageMagick_INCLUDE_DIRS)
+    SET(ImageMagick_INCLUDE_DIRS ${ImageMagick_INCLUDE_DIRS} PARENT_SCOPE)
 
-ELSE (WIN32)
+    LIST(APPEND ImageMagick_LIBRARIES
+      ${ImageMagick_${component}_LIBRARY}
+      )
+    SET(ImageMagick_LIBRARIES ${ImageMagick_LIBRARIES} PARENT_SCOPE)
+  ENDIF(ImageMagick_${component}_INCLUDE_DIR AND ImageMagick_${component}_LIBRARY)
+ENDFUNCTION(FIND_IMAGEMAGICK_API)
 
-  SET (IMAGEMAGICK_BINARY_PATH "")
+FUNCTION(FIND_IMAGEMAGICK_EXE component)
+  SET(_IMAGEMAGICK_EXECUTABLE
+    ${ImageMagick_EXECUTABLE_DIR}/${component}${CMAKE_EXECUTABLE_SUFFIX})
+  IF(EXISTS ${_IMAGEMAGICK_EXECUTABLE})
+    SET(ImageMagick_${component}_EXECUTABLE
+      ${_IMAGEMAGICK_EXECUTABLE}
+       PARENT_SCOPE
+       )
+    SET(ImageMagick_${component}_FOUND TRUE PARENT_SCOPE)
+  ELSE(EXISTS ${_IMAGEMAGICK_EXECUTABLE})
+    SET(ImageMagick_${component}_FOUND FALSE PARENT_SCOPE)
+  ENDIF(EXISTS ${_IMAGEMAGICK_EXECUTABLE})
+ENDFUNCTION(FIND_IMAGEMAGICK_EXE)
 
-  FIND_PROGRAM(IMAGEMAGICK_CONVERT_EXECUTABLE
-    NAMES convert
-    PATHS ${IMAGEMAGICK_BINARY_PATH}
-    DOC "Path to ImageMagick's convert executable."
+#---------------------------------------------------------------------
+# Start Actual Work
+#---------------------------------------------------------------------
+# Try to find a ImageMagick installation binary path.
+FIND_PATH(ImageMagick_EXECUTABLE_DIR
+  NAMES mogrify${CMAKE_EXECUTABLE_SUFFIX}
+  PATHS
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ImageMagick\\Current;BinPath]"
+  DOC "Path to the ImageMagick binary directory."
+  NO_DEFAULT_PATH
+  )
+FIND_PATH(ImageMagick_EXECUTABLE_DIR
+  NAMES mogrify${CMAKE_EXECUTABLE_SUFFIX}
   )
 
-ENDIF (WIN32)
-
-# Find mogrify, import, montage, composite
-
-FIND_PROGRAM(IMAGEMAGICK_MOGRIFY_EXECUTABLE
-  NAMES mogrify
-  PATHS ${IMAGEMAGICK_BINARY_PATH}
-  DOC "Path to ImageMagick's mogrify executable."
-)
-
-FIND_PROGRAM(IMAGEMAGICK_IMPORT_EXECUTABLE
-  NAMES import
-  PATHS ${IMAGEMAGICK_BINARY_PATH}
-  DOC "Path to ImageMagick's import executable."
-)
+# Find each component. Search for all tools in same dir
+# <ImageMagick_EXECUTABLE_DIR>; otherwise they should be found
+# independently and not in a cohesive module such as this one.
+SET(ImageMagick_FOUND TRUE)
+FOREACH(component ${ImageMagick_FIND_COMPONENTS}
+    # DEPRECATED: forced components for backward compatibility
+    convert mogrify import montage composite
+    )
+  IF(component STREQUAL "Magick++")
+    FIND_IMAGEMAGICK_API(Magick++ Magick++.h
+      Magick++ CORE_RL_Magick++_
+      )
+  ELSEIF(component STREQUAL "MagickWand")
+    FIND_IMAGEMAGICK_API(MagickWand wand/MagickWand.h
+      Wand MagickWand CORE_RL_wand_
+      )
+  ELSEIF(component STREQUAL "MagickCore")
+    FIND_IMAGEMAGICK_API(MagickCore magick/MagickCore.h
+      Magick MagickCore CORE_RL_magick_
+      )
+  ELSE(component STREQUAL "Magick++")
+    IF(ImageMagick_EXECUTABLE_DIR)
+      FIND_IMAGEMAGICK_EXE(${component})
+    ENDIF(ImageMagick_EXECUTABLE_DIR)
+  ENDIF(component STREQUAL "Magick++")
+  
+  IF(NOT ImageMagick_${component}_FOUND)
+    LIST(FIND ImageMagick_FIND_COMPONENTS ${component} is_requested)
+    IF(is_requested GREATER -1)
+      SET(ImageMagick_FOUND FALSE)
+    ENDIF(is_requested GREATER -1)
+  ENDIF(NOT ImageMagick_${component}_FOUND)
+ENDFOREACH(component)
 
-FIND_PROGRAM(IMAGEMAGICK_MONTAGE_EXECUTABLE
-  NAMES montage
-  PATHS ${IMAGEMAGICK_BINARY_PATH}
-  DOC "Path to ImageMagick's montage executable."
-)
+SET(ImageMagick_INCLUDE_DIRS ${ImageMagick_INCLUDE_DIRS})
+SET(ImageMagick_LIBRARIES ${ImageMagick_LIBRARIES})
 
-FIND_PROGRAM(IMAGEMAGICK_COMPOSITE_EXECUTABLE
-  NAMES composite
-  PATHS ${IMAGEMAGICK_BINARY_PATH}
-  DOC "Path to ImageMagick's composite executable."
-)
+#---------------------------------------------------------------------
+# Standard Package Output
+#---------------------------------------------------------------------
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(
+  ImageMagick DEFAULT_MSG ImageMagick_FOUND
+  )
+# Maintain consistency with all other variables.
+SET(ImageMagick_FOUND ${IMAGEMAGICK_FOUND})
 
+#---------------------------------------------------------------------
+# DEPRECATED: Setting variables for backward compatibility.
+#---------------------------------------------------------------------
+SET(IMAGEMAGICK_BINARY_PATH          ${ImageMagick_EXECUTABLE_DIR}
+    CACHE PATH "Path to the ImageMagick binary directory.")
+SET(IMAGEMAGICK_CONVERT_EXECUTABLE   ${ImageMagick_convert_EXECUTABLE}
+    CACHE FILEPATH "Path to ImageMagick's convert executable.")
+SET(IMAGEMAGICK_MOGRIFY_EXECUTABLE   ${ImageMagick_mogrify_EXECUTABLE}
+    CACHE FILEPATH "Path to ImageMagick's mogrify executable.")
+SET(IMAGEMAGICK_IMPORT_EXECUTABLE    ${ImageMagick_import_EXECUTABLE}
+    CACHE FILEPATH "Path to ImageMagick's import executable.")
+SET(IMAGEMAGICK_MONTAGE_EXECUTABLE   ${ImageMagick_montage_EXECUTABLE}
+    CACHE FILEPATH "Path to ImageMagick's montage executable.")
+SET(IMAGEMAGICK_COMPOSITE_EXECUTABLE ${ImageMagick_composite_EXECUTABLE}
+    CACHE FILEPATH "Path to ImageMagick's composite executable.")
 MARK_AS_ADVANCED(
   IMAGEMAGICK_BINARY_PATH
   IMAGEMAGICK_CONVERT_EXECUTABLE
@@ -79,4 +192,4 @@ MARK_AS_ADVANCED(
   IMAGEMAGICK_IMPORT_EXECUTABLE
   IMAGEMAGICK_MONTAGE_EXECUTABLE
   IMAGEMAGICK_COMPOSITE_EXECUTABLE
-)
+  )