Code

Cmake: New FindGTK2
[inkscape.git] / CMakeScripts / FindGTK2.cmake
index 06105bd0462dc1bfdfebe1baceace00deea45997..b8b88bf4d9ad6dc621ca6bae5480e6b83d6b6baa 100644 (file)
+# - FindGTK2.cmake
+# This module finds the GTK2/GTKMM widget libraries
 #
-# try to find GTK2 (and glib) and GTK2GLArea
+# Specify one or more of the following components
+# as you call this Find macro:
 #
-# GTK2_INCLUDE_DIRS  - Directories to include to use GTK2
-# GTK2_LIBRARIES     - Files to link against to use GTK2
-# GTK2_FOUND         - If false, don't try to use GTK2
-# GTK2_GL_FOUND      - If false, don't try to use GTK2's GL features
+#   gtk
+#   gtkmm
+#   glade
+#   glademm
 #
-###################################################################
+# The following variables will be defined for your use
+#   GTK2_FOUND - Were all of your specified components found?
+#   GTK2_INCLUDE_DIRS - All include directories
+#   GTK2_LIBRARIES - All libraries
 #
-#  Copyright (c) 2004 Jan Woetzel
-#  Copyright (c) 2006 Andreas Schneider <mail@cynapses.org>
+# Optional variables you can define prior to calling this module
+#   GTK2_DEBUG - Enables verbose debugging of the module
+#   GTK2_SKIP_MARK_AS_ADVANCED - Disable marking cache variables as advanced
 #
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
+#=================
+# Example Usage:
 #
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
+#  FIND_PACKAGE(GTK2 COMPONENTS gtk)
+#      or
+#  FIND_PACKAGE(GTK2 COMPONENTS gtk glade) # if you're also using glade
 #
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
+#  INCLUDE_DIRECTORIES(${GTK2_INCLUDE_DIRS})
+#  ADD_EXECUTABLE(foo foo.cc)
+#  TARGET_LINK_LIBRARIES(foo ${GTK2_LIBRARIES})
+#=================
+# 
+# Copyright (c) 2008
+#     Philip Lowman <philip@yhbt.com>
 #
-###################################################################
+# Version 0.6 (1/8/08)
+#   Added GTK2_SKIP_MARK_AS_ADVANCED option
+# Version 0.5 (12/19/08)
+#   Second release to cmake mailing list
 #
-#  Copyright (c) 2004 Jan Woetzel
-#  Copyright (c) 2006 Andreas Schneider <mail@cynapses.org>
-#  All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# * Redistributions of source code must retain the above copyright
-#   notice, this list of conditions and the following disclaimer.
-#
-# * Redistributions in binary form must reproduce the above copyright
-#   notice, this list of conditions and the following disclaimer in
-#   the documentation and/or other materials provided with the
-#   distribution.
-#
-# * Neither the name of the <ORGANIZATION> nor the names of its
-#   contributors may be used to endorse or promote products derived
-#   from this software without specific prior written permission.
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+#=============================================================
+# _GTK2_FIND_INCLUDE_DIR
+# Internal macro to find the GTK include directories
+#   _var = variable to set
+#   _hdr = header file to look for
+#=============================================================
+MACRO(_GTK2_FIND_INCLUDE_DIR _var _hdr)
+
+    IF(GTK2_DEBUG)
+        MESSAGE(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}]
+            _GTK2_FIND_INCLUDE_DIR( ${_var} ${_hdr} )")
+    ENDIF()
+
+    SET(_relatives
+        # FIXME
+        glibmm-2.4
+        glib-2.0
+        atk-1.0
+        atkmm-1.6
+        cairo
+        cairomm-1.0
+        gdkmm-2.4
+        giomm-2.4
+        gtk-2.0
+        gtkmm-2.4
+        libglade-2.0
+        libglademm-2.4
+        pango-1.0
+        pangomm-1.4
+        sigc++-2.0
+    )
+
+    SET(_suffixes)
+    FOREACH(_d ${_relatives})
+        LIST(APPEND _suffixes ${_d})
+        LIST(APPEND _suffixes ${_d}/include) # for /usr/lib/gtk-2.0/include
+    ENDFOREACH()
+
+    IF(GTK2_DEBUG)
+        MESSAGE(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] include suffixes = ${_suffixes}")
+    ENDIF()
+
+    FIND_PATH(${_var} ${_hdr}
+        PATHS
+            /usr/local/include
+            /usr/local/lib
+            /usr/include
+            /usr/lib
+            [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/include
+            [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib
+        PATH_SUFFIXES
+            ${_suffixes}
+    )
+
+    IF(${_var})
+        LIST(APPEND GTK2_INCLUDE_DIRS ${${_var}})
+        IF(NOT GTK2_SKIP_MARK_AS_ADVANCED)
+            MARK_AS_ADVANCED(${_var})
+        ENDIF()
+    ENDIF()
+ENDMACRO()
+
+#=============================================================
+# _GTK2_FIND_LIBRARY
+# Internal macro to find libraries packaged with GTK2
+#   _var = library variable to create
+#=============================================================
+MACRO(_GTK2_FIND_LIBRARY _var _lib _expand_vc _append_version)
+
+    IF(GTK2_DEBUG)
+        MESSAGE(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}]
+            _GTK2_FIND_LIBRARY( ${_var} ${_lib} ${_expand_vc} ${_append_version} )")
+    ENDIF()
+
+    # Not GTK versions per se but the versions encoded into Windows
+    # import libraries (GtkMM 2.14.1 has a gtkmm-vc80-2_4.lib for example)
+    # Also the MSVC libraries use _ for . (this is handled below)
+    SET(_versions 2.20 2.18 2.16 2.14 2.12
+                  2.10  2.8  2.6  2.4  2.2 2.0
+                  1.20 1.18 1.16 1.14 1.12
+                  1.10  1.8  1.6  1.4  1.2 1.0)
+
+    SET(_library)
+    SET(_library_d)
+
+    SET(_library ${_lib})
+
+    IF(${_expand_vc})
+        # Add vc80/vc90 midfixes
+        IF(MSVC80)
+            SET(_library   ${_library}-vc80)
+            SET(_library_d ${_library}-d)
+        ELSEIF(MSVC90)
+            SET(_library   ${_library}-vc90)
+            SET(_library_d ${_library}-d)
+        ENDIF()
+    ENDIF()
+
+    IF(GTK2_DEBUG)
+        MESSAGE(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] After midfix addition = ${_library} and ${_library_d}")
+    ENDIF()
+
+    SET(_lib_list)
+    SET(_libd_list)
+    IF(${_append_version})
+        FOREACH(_ver ${_versions})
+            LIST(APPEND _lib_list  "${_library}-${_ver}")
+            LIST(APPEND _libd_list "${_library_d}-${_ver}")
+        ENDFOREACH()
+    ELSE()
+        SET(_lib_list ${_library})
+        SET(_libd_list ${_library_d})
+    ENDIF()
+    
+    IF(GTK2_DEBUG)
+        MESSAGE(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] library list = ${_lib_list} and library debug list = ${_libd_list}")
+    ENDIF()
+
+    # For some silly reason the MSVC libraries use _ instead of .
+    # in the version fields
+    IF(${_expand_vc} AND MSVC)
+        SET(_no_dots_lib_list)
+        SET(_no_dots_libd_list)
+        FOREACH(_l ${_lib_list})
+            STRING(REPLACE "." "_" _no_dots_library ${_l})
+            LIST(APPEND _no_dots_lib_list ${_no_dots_library})
+        ENDFOREACH()
+        # And for debug
+        SET(_no_dots_libsd_list)
+        FOREACH(_l ${_libd_list})
+            STRING(REPLACE "." "_" _no_dots_libraryd ${_l})
+            LIST(APPEND _no_dots_libd_list ${_no_dots_libraryd})
+        ENDFOREACH()
+
+        # Copy list back to original names
+        SET(_lib_list ${_no_dots_lib_list})
+        SET(_libd_list ${_no_dots_libd_list})
+    ENDIF()
+
+    IF(GTK2_DEBUG)
+        MESSAGE(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] Whilst searching for ${_var} our proposed library list is ${_lib_list}")
+    ENDIF()
+
+    FIND_LIBRARY(${_var} 
+        NAMES ${_lib_list}
+        PATHS
+        [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib
+        )
+    IF(${_expand_vc} AND MSVC)
+
+        IF(GTK2_DEBUG)
+            MESSAGE(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] Whilst searching for ${_var}_DEBUG our proposed library list is ${_libd_list}")
+        ENDIF()
+
+        FIND_LIBRARY(${_var}_DEBUG
+            NAMES ${_libd_list}
+            PATHS
+            [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib
+        )
+        IF(NOT GTK2_SKIP_MARK_AS_ADVANCED)
+            MARK_AS_ADVANCED(${_var}_DEBUG)
+        ENDIF()
+    ELSE()
+        SET(${_var}_DEBUG ${${_var}})
+    ENDIF()
+
+    IF(${_var})
+        LIST(APPEND GTK2_LIBRARIES optimized ${${_var}} debug ${${_var}_DEBUG} )
+        IF(NOT GTK2_SKIP_MARK_AS_ADVANCED)
+            MARK_AS_ADVANCED(${_var})
+        ENDIF()
+    ENDIF()
+ENDMACRO()
+#=============================================================
+
 #
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
+# main()
 #
 
-IF (GTK2_LIBRARIES AND GTK2_INCLUDE_DIRS)
-  # in cache already
-  SET(GTK2_FOUND TRUE)
-ELSE (GTK2_LIBRARIES AND GTK2_INCLUDE_DIRS)
-
-    #check whether cmake version is 2.4 or greater
-    if (${CMAKE_MAJOR_VERSION} GREATER 1 AND ${CMAKE_MINOR_VERSION} GREATER 3)
-      SET(GTK2_CMAKE_24 TRUE)
-    endif (${CMAKE_MAJOR_VERSION} GREATER 1 AND ${CMAKE_MINOR_VERSION} GREATER 3)
-
-    # use pkg-config to get the directories and then use these values
-    # in the FIND_PATH() and FIND_LIBRARY() calls
-    if (GTK2_CMAKE_24)
-      include(UsePkgConfig)
-    else (GTK2_CMAKE_24)
-      find_package(PkgConfig)
-    endif (GTK2_CMAKE_24)
-    INCLUDE(UsePkgConfig)
-
-    if (GTK2_CMAKE_24)
-      pkgconfig(gtk+-2.0 _GTK2_INCLUDEDIR _GTK2_LIBDIR _GTK2_LDFLAGS _GTK2_CFLAGS)
-     MESSAGE(STATUS "DEBUG pkgconfig found: ${_GTK2_INCLUDEDIR} ${_GTK2_LIBDIR} ${_GTK2_LDFLAGS} ${_GTK2_CFLAGS}")
-    else (GTK2_CMAKE_24)
-      if (PKG_CONFIG_FOUND)
-        pkg_check_modules(_GTK2 gtk+-2.0)
-      endif (PKG_CONFIG_FOUND)
-    endif (GTK2_CMAKE_24)
-
-    FIND_PATH(GTK2_GTK_INCLUDE_PATH gtk/gtk.h
-      $ENV{GTK2_HOME}
-      ${_GTK2_INCLUDEDIR}
-      /usr/include/gtk-2.0
-      /usr/local/include/gtk-2.0
-      /opt/gnome/include/gtk-2.0
-      /opt/local/include/gtk-2.0
-      $ENV{DEVLIBS_PATH}//include//
-    )
+SET(GTK2_FOUND)
+SET(GTK2_INCLUDE_DIRS)
+SET(GTK2_LIBRARIES)
 
-    # Some Linux distributions (e.g. Red Hat) have glibconfig.h
-    # and glib.h in different directories, so we need to look
-    # for both.
-    #  - Atanas Georgiev <atanas@cs.columbia.edu>
-    if (GTK2_CMAKE_24)
-      pkgconfig(glib-2.0 _GLIB2_INCLUDEDIR _GLIB2inkDir _GLIB2_LDFLAGS _GLIB2_CFLAGS)
-      pkgconfig(gmodule-2.0 _GMODULE2_INCLUDEDIR _GMODULE2inkDir _GMODULE2_LDFLAGS _GMODULE2_CFLAGS)
-    else (GTK2_CMAKE_24)
-      if (PKG_CONFIG_FOUND)
-        pkg_check_modules(_GLIB2 glib-2.0)
-        pkg_check_modules(_GMODULE2 gmodule-2.0)
-      endif (PKG_CONFIG_FOUND)
-    endif (GTK2_CMAKE_24)
-
-    SET(GDIR /opt/gnome/lib/glib-2.0/include)
-    FIND_PATH(GTK2_GLIBCONFIG_INCLUDE_PATH glibconfig.h
-      ${_GLIB2_INCLUDEDIR}
-      /opt/gnome/lib64/glib-2.0/include
-      /opt/gnome/lib/glib-2.0/include
-      /usr/lib64/glib-2.0/include
-      /usr/lib/glib-2.0/include
-      /opt/local/lib/glib-2.0/include
-      $ENV{DEVLIBS_PATH}//include//
-    )
-    #MESSAGE(STATUS "DEBUG: GTK2_GLIBCONFIG_INCLUDE_PATH = ${GTK2_GLIBCONFIG_INCLUDE_PATH}")
-
-    FIND_PATH(GTK2_GLIB_INCLUDE_PATH glib.h
-      ${_GLIB2_INCLUDEDIR}
-      /opt/gnome/include/glib-2.0
-      /usr/include/glib-2.0
-      /opt/local/include/glib-2.0
-      $ENV{DEVLIBS_PATH}//include//
-    )
-    #MESSAGE(STATUS "DEBUG: GTK2_GLIBCONFIG_INCLUDE_PATH = ${GTK2_GLIBCONFIG_INCLUDE_PATH}")
-
-    FIND_PATH(GTK2_GTKGL_INCLUDE_PATH gtkgl/gtkglarea.h
-      ${_GLIB2_INCLUDEDIR}
-      /usr/include
-      /usr/local/include
-      /usr/openwin/share/include
-      /opt/gnome/include
-      /opt/local/include
-      $ENV{DEVLIBS_PATH}//include//
-    )
+IF(NOT GTK2_FIND_COMPONENTS)
+    MESSAGE(FATAL_ERROR "You must specify components with this module.  See the documentation at the top of FindGTK2.cmake")
+ENDIF()
 
-    if (GTK2_CMAKE_24)
-      pkgconfig(pango _PANGO_INCLUDEDIR _PANGOinkDir _PANGO_LDFLAGS _PANGO_CFLAGS)
-    else (GTK2_CMAKE_24)
-      if (PKG_CONFIG_FOUND)
-        pkg_check_modules(_PANGO pango)
-      endif (PKG_CONFIG_FOUND)
-    endif (GTK2_CMAKE_24)
-
-    FIND_PATH(GTK2_PANGO_INCLUDE_PATH pango/pango.h
-      ${_PANGO_INCLUDEDIR}
-      /opt/gnome/include/pango-1.0
-      /usr/include/pango-1.0
-      /opt/local/include/pango-1.0
-      $ENV{DEVLIBS_PATH}//include//
-    )
+FOREACH(_component ${GTK2_FIND_COMPONENTS})
+    IF(_component STREQUAL "gtk")
+        
+        _GTK2_FIND_INCLUDE_DIR(GTK2_GLIB_INCLUDE_DIR glib.h)
+        _GTK2_FIND_INCLUDE_DIR(GTK2_GLIBCONFIG_INCLUDE_DIR glibconfig.h)
+        _GTK2_FIND_LIBRARY    (GTK2_GLIB_LIBRARY glib 0 1)
 
-    if (GTK2_CMAKE_24)
-      pkgconfig(gdk-2.0 _GDK2_INCLUDEDIR _GDK2inkDir _GDK2_LDFLAGS _GDK2_CFLAGS)
-    else (GTK2_CMAKE_24)
-      if (PKG_CONFIG_FOUND)
-        pkg_check_modules(_GDK2 gdk-2.0)
-      endif (PKG_CONFIG_FOUND)
-    endif (GTK2_CMAKE_24)
-
-    FIND_PATH(GTK2_GDKCONFIG_INCLUDE_PATH gdkconfig.h
-      ${_GDK2_INCLUDEDIR}
-      /opt/gnome/lib/gtk-2.0/include
-      /opt/gnome/lib64/gtk-2.0/include
-      /usr/lib/gtk-2.0/include
-      /usr/lib64/gtk-2.0/include
-      /opt/local/lib/gtk-2.0/include
-      $ENV{DEVLIBS_PATH}//include//
-    )
+        _GTK2_FIND_INCLUDE_DIR(GTK2_GDK_INCLUDE_DIR gdk/gdk.h)
+        _GTK2_FIND_INCLUDE_DIR(GTK2_GDKCONFIG_INCLUDE_DIR gdkconfig.h)
+        _GTK2_FIND_LIBRARY    (GTK2_GDK_LIBRARY gdk-x11 0 1)
+        _GTK2_FIND_LIBRARY    (GTK2_GDK_LIBRARY gdk-win32 0 1)
 
-    if (GTK2_CMAKE_24)
-      pkgconfig(cairo _CAIRO_INCLUDEDIR _CAIROinkDir _CAIRO_LDFLAGS _CAIRO_CFLAGS)
-    else (GTK2_CMAKE_24)
-      if (PKG_CONFIG_FOUND)
-        pkg_check_modules(_CAIRO cairo)
-      endif (PKG_CONFIG_FOUND)
-    endif (GTK2_CMAKE_24)
-
-    FIND_PATH(GTK2_CAIRO_INCLUDE_PATH cairo.h
-      ${_CAIRO_INCLUDEDIR}
-      /opt/gnome/include/cairo
-      /usr/include
-      /usr/include/cairo
-      /opt/local/include/cairo
-      $ENV{DEVLIBS_PATH}//include//
-    )
-    #MESSAGE(STATUS "DEBUG: GTK2_CAIRO_INCLUDE_PATH = ${GTK2_CAIRO_INCLUDE_PATH}")
-
-    if (GTK2_CMAKE_24)
-      pkgconfig(atk _ATK_INCLUDEDIR _ATKinkDir _ATK_LDFLAGS _ATK_CFLAGS)
-    else (GTK2_CMAKE_24)
-      if (PKG_CONFIG_FOUND)
-        pkg_check_modules(_ATK atk)
-      endif (PKG_CONFIG_FOUND)
-    endif (GTK2_CMAKE_24)
-
-    FIND_PATH(GTK2_ATK_INCLUDE_PATH atk/atk.h
-      ${_ATK_INCLUDEDIR}
-      /opt/gnome/include/atk-1.0
-      /usr/include/atk-1.0
-      /opt/local/include/atk-1.0
-      $ENV{DEVLIBS_PATH}//include//
-    )
-    #MESSAGE(STATUS "DEBUG: GTK2_ATK_INCLUDE_PATH = ${GTK2_ATK_INCLUDE_PATH}")
-
-    FIND_LIBRARY(GTK2_GTKGL_LIBRARY
-      NAMES
-        gtkgl
-      PATHS
-        ${_GTK2_INCLUDEDIR}
-        /usr/lib
-        /usr/local/lib
-        /usr/openwin/lib
-        /usr/X11R6/lib
-        /opt/gnome/lib
-    )
+        _GTK2_FIND_INCLUDE_DIR(GTK2_GTK_INCLUDE_DIR gtk/gtk.h)
+        _GTK2_FIND_LIBRARY    (GTK2_GTK_LIBRARY gtk-x11 0 1)
+        _GTK2_FIND_LIBRARY    (GTK2_GTK_LIBRARY gtk-win32 0 1)
 
-    FIND_LIBRARY(GTK2_GTK_LIBRARY
-      NAMES
-        gtk-x11-2.0
-      PATHS
-        ${_GTK2_LIBDIR}
-        /usr/lib
-        /usr/local/lib
-        /usr/openwin/lib
-        /usr/X11R6/lib
-        /opt/gnome/lib
-    )
+        _GTK2_FIND_INCLUDE_DIR(GTK2_CAIRO_INCLUDE_DIR cairo.h)
+        _GTK2_FIND_LIBRARY    (GTK2_CAIRO_LIBRARY cairo 0 0)
 
-    FIND_LIBRARY(GTK2_GDK_LIBRARY
-      NAMES
-        gdk-x11-2.0
-      PATHS
-        ${_GDK2_LIBDIR}
-        /usr/lib
-        /usr/local/lib
-        /usr/openwin/lib
-        /usr/X11R6/lib
-        /opt/gnome/lib
-    )
+        _GTK2_FIND_INCLUDE_DIR(GTK2_PANGO_INCLUDE_DIR pango/pango.h)
+        _GTK2_FIND_LIBRARY    (GTK2_PANGO_LIBRARY pango 0 1)
 
-    FIND_LIBRARY(GTK2_GMODULE_LIBRARY
-      NAMES
-        gmodule-2.0
-      PATHS
-        ${_GMODULE2_LIBDIR}
-        /usr/lib
-        /usr/local/lib
-        /usr/openwin/lib
-        /usr/X11R6/lib
-        /opt/gnome/lib
-    )
+        _GTK2_FIND_INCLUDE_DIR(GTK2_ATK_INCLUDE_DIR atk/atk.h)
+        _GTK2_FIND_LIBRARY    (GTK2_ATK_LIBRARY atk 0 1)
 
-    FIND_LIBRARY(GTK2_GLIB_LIBRARY
-      NAMES
-        glib-2.0
-      PATHS
-        ${_GLIB2_LIBDIR}
-        /usr/lib
-        /usr/local/lib
-        /usr/openwin/lib
-        /usr/X11R6/lib
-        /opt/gnome/lib
-    )
+        #ELSEIF(_component STREQUAL "gdk_pixbuf")
+        #_GTK2_FIND_INCLUDE_DIR(GTK2_GDKPIXBUF_INCLUDE_DIR gdk-pixbuf/gdk-pixbuf.h)
+        #_GTK2_FIND_LIBRARY    (GTK2_GDKPIXBUF_LIBRARY gdk_pixbuf 0 1)
 
-    FIND_LIBRARY(GTK2_Xi_LIBRARY 
-      NAMES
-        Xi
-      PATHS 
-        /usr/lib
-        /usr/local/lib
-        /usr/openwin/lib
-        /usr/X11R6/lib
-        /opt/gnome/lib
-    )
+    ELSEIF(_component STREQUAL "gtkmm")
 
-    FIND_LIBRARY(GTK2_GTHREAD_LIBRARY
-      NAMES
-        gthread-2.0
-      PATHS
-        /usr/lib
-        /usr/local/lib
-        /usr/openwin/lib
-        /usr/X11R6/lib
-        /opt/gnome/lib
-    )
+        _GTK2_FIND_INCLUDE_DIR(GTK2_GLIBMM_INCLUDE_DIR glibmm.h)
+        _GTK2_FIND_INCLUDE_DIR(GTK2_GLIBMMCONFIG_INCLUDE_DIR glibmmconfig.h)
+        _GTK2_FIND_LIBRARY    (GTK2_GLIBMM_LIBRARY glibmm 1 1)
 
+        _GTK2_FIND_INCLUDE_DIR(GTK2_GDKMM_INCLUDE_DIR gdkmm.h)
+        _GTK2_FIND_INCLUDE_DIR(GTK2_GDKMMCONFIG_INCLUDE_DIR gdkmmconfig.h)
+        _GTK2_FIND_LIBRARY    (GTK2_GDKMM_LIBRARY gdkmm 1 1)
 
-    FIND_LIBRARY(GTK2_GOBJECT_LIBRARY
-      NAMES
-        gobject-2.0
-      PATHS
-        /usr/lib
-        /usr/local/lib
-        /usr/openwin/lib
-        /usr/X11R6/lib
-        /opt/gnome/lib
-    )
+        _GTK2_FIND_INCLUDE_DIR(GTK2_GTKMM_INCLUDE_DIR gtkmm.h)
+        _GTK2_FIND_INCLUDE_DIR(GTK2_GTKMMCONFIG_INCLUDE_DIR gtkmmconfig.h)
+        _GTK2_FIND_LIBRARY    (GTK2_GTKMM_LIBRARY gtkmm 1 1)
 
-    IF(GTK2_GTK_INCLUDE_PATH)
-      IF(GTK2_GLIBCONFIG_INCLUDE_PATH)
-        IF(GTK2_GLIB_INCLUDE_PATH)
-          IF(GTK2_GTK_LIBRARY)
-            IF(GTK2_GLIB_LIBRARY)
-              IF(GTK2_PANGO_INCLUDE_PATH)
-                IF(GTK2_ATK_INCLUDE_PATH)
-                  IF(GTK2_CAIRO_INCLUDE_PATH)
-                    # Assume that if gtk and glib were found, the other
-                    # supporting libraries have also been found.
-
-                    SET(GTK2_FOUND TRUE)
-
-                    SET(GTK2_INCLUDE_DIRS
-                      ${GTK2_GTK_INCLUDE_PATH}
-                      ${GTK2_GLIBCONFIG_INCLUDE_PATH}
-                      ${GTK2_GLIB_INCLUDE_PATH}
-                      ${GTK2_PANGO_INCLUDE_PATH}
-                      ${GTK2_GDKCONFIG_INCLUDE_PATH}
-                      ${GTK2_ATK_INCLUDE_PATH}
-                      ${GTK2_CAIRO_INCLUDE_PATH}
-                    )
-
-                    SET(GTK2_LIBRARIES
-                      ${GTK2_GTK_LIBRARY}
-                      ${GTK2_GDK_LIBRARY}
-                      ${GTK2_GLIB_LIBRARY}
-                    )
-                    #${GTK2_GOBJECT_LIBRARY})
-
-                    IF(GTK2_GMODULE_LIBRARY)
-                      SET(GTK2_LIBRARIES
-                        ${GTK2_LIBRARIES}
-                        ${GTK2_GMODULE_LIBRARY}
-                      )
-                    ENDIF(GTK2_GMODULE_LIBRARY)
-
-                    IF(GTK2_GTHREAD_LIBRARY)
-                      SET(GTK2_LIBRARIES
-                        ${GTK2_LIBRARIES}
-                        ${GTK2_GTHREAD_LIBRARY}
-                      )
-                    SET(GTK2_LIBRARIES ${GTK2_LIBRARIES})
-                    ENDIF(GTK2_GTHREAD_LIBRARY)
-                  ELSE(GTK2_CAIRO_INCLUDE_PATH)
-                    MESSAGE(STATUS "Can not find cairo")
-                  ENDIF(GTK2_CAIRO_INCLUDE_PATH)
-                ELSE(GTK2_ATK_INCLUDE_PATH)
-                  MESSAGE(STATUS "Can not find atk")
-                ENDIF(GTK2_ATK_INCLUDE_PATH)
-              ELSE(GTK2_PANGO_INCLUDE_PATH)
-                MESSAGE(STATUS "Can not find pango includes")
-              ENDIF(GTK2_PANGO_INCLUDE_PATH)
-            ELSE(GTK2_GLIB_LIBRARY)
-              MESSAGE(STATUS "Can not find glib lib")
-            ENDIF(GTK2_GLIB_LIBRARY)
-          ELSE(GTK2_GTK_LIBRARY)
-            MESSAGE(STATUS "Can not find gtk lib")
-          ENDIF(GTK2_GTK_LIBRARY)
-        ELSE(GTK2_GLIB_INCLUDE_PATH)
-          MESSAGE(STATUS "Can not find glib includes")
-        ENDIF(GTK2_GLIB_INCLUDE_PATH)
-      ELSE(GTK2_GLIBCONFIG_INCLUDE_PATH)
-        MESSAGE(STATUS "Can not find glibconfig")
-      ENDIF(GTK2_GLIBCONFIG_INCLUDE_PATH)
-    ELSE (GTK2_GTK_INCLUDE_PATH)
-      MESSAGE(STATUS "Can not find gtk includes")
-    ENDIF (GTK2_GTK_INCLUDE_PATH)
-
-    IF (GTK2_FOUND)
-      IF (NOT GTK2_FIND_QUIETLY)
-        MESSAGE(STATUS "Found GTK2: ${GTK2_LIBRARIES}")
-      ENDIF (NOT GTK2_FIND_QUIETLY)
-    ELSE (GTK2_FOUND)
-      IF (GTK2_FIND_REQUIRED)
-        MESSAGE(SEND_ERROR "Could NOT find GTK2")
-      ENDIF (GTK2_FIND_REQUIRED)
-    ENDIF (GTK2_FOUND)
-
-    MARK_AS_ADVANCED(
-      GTK2_GDK_LIBRARY
-      GTK2_GLIB_INCLUDE_PATH
-      GTK2_GLIB_LIBRARY
-      GTK2_GLIBCONFIG_INCLUDE_PATH
-      GTK2_GMODULE_LIBRARY
-      GTK2_GTHREAD_LIBRARY
-      GTK2_Xi_LIBRARY
-      GTK2_GTK_INCLUDE_PATH
-      GTK2_GTK_LIBRARY
-      GTK2_GTKGL_INCLUDE_PATH
-      GTK2_GTKGL_LIBRARY
-      GTK2_ATK_INCLUDE_PATH
-      GTK2_GDKCONFIG_INCLUDE_PATH
-      #GTK2_GOBJECT_LIBRARY
-      GTK2_PANGO_INCLUDE_PATH
-    )
-ENDIF (GTK2_LIBRARIES AND GTK2_INCLUDE_DIRS)
+        _GTK2_FIND_INCLUDE_DIR(GTK2_CAIROMM_INCLUDE_DIR cairomm/cairomm.h)
+        _GTK2_FIND_LIBRARY    (GTK2_CAIROMM_LIBRARY cairomm 1 1)
+
+        _GTK2_FIND_INCLUDE_DIR(GTK2_PANGOMM_INCLUDE_DIR pangomm.h)
+        _GTK2_FIND_LIBRARY    (GTK2_PANGOMM_LIBRARY pangomm 1 1)
+
+        _GTK2_FIND_INCLUDE_DIR(GTK2_SIGC++_INCLUDE_DIR sigc++/sigc++.h)
+        _GTK2_FIND_INCLUDE_DIR(GTK2_SIGC++CONFIG_INCLUDE_DIR sigc++config.h)
+        _GTK2_FIND_LIBRARY    (GTK2_SIGC++_LIBRARY sigc 1 1)
+
+        _GTK2_FIND_INCLUDE_DIR(GTK2_GIOMM_INCLUDE_DIR giomm.h)
+        _GTK2_FIND_INCLUDE_DIR(GTK2_GIOMMCONFIG_INCLUDE_DIR giommconfig.h)
+        _GTK2_FIND_LIBRARY    (GTK2_GIOMM_LIBRARY giomm 1 1)
+
+        _GTK2_FIND_INCLUDE_DIR(GTK2_ATKMM_INCLUDE_DIR atkmm.h)
+        _GTK2_FIND_LIBRARY    (GTK2_ATKMM_LIBRARY atkmm 1 1)
+
+    ELSEIF(_component STREQUAL "glade")
+
+        _GTK2_FIND_INCLUDE_DIR(GTK2_GLADE_INCLUDE_DIR glade/glade.h)
+        _GTK2_FIND_LIBRARY    (GTK2_GLADE_LIBRARY glade 0 1)
+    
+    ELSEIF(_component STREQUAL "glademm")
+
+        _GTK2_FIND_INCLUDE_DIR(GTK2_GLADEMM_INCLUDE_DIR libglademm.h)
+        _GTK2_FIND_INCLUDE_DIR(GTK2_GLADEMMCONFIG_INCLUDE_DIR libglademmconfig.h)
+        _GTK2_FIND_LIBRARY    (GTK2_GLADEMM_LIBRARY glademm 1 1)
+
+    ELSE()
+        MESSAGE(FATAL_ERROR "Unknown GTK2 component ${_component}")
+    ENDIF()
+ENDFOREACH()
+
+#
+# Try to enforce components
+#
 
-# vim:et ts=2 sw=2 comments=\:\#
+SET(_did_we_find_everything true)  # This gets set to GTK2_FOUND
+
+INCLUDE(FindPackageHandleStandardArgs)
+
+FOREACH(_component ${GTK2_FIND_COMPONENTS})
+    STRING(TOUPPER ${_component} _COMPONENT_UPPER)
+
+    IF(_component STREQUAL "gtk")
+        FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "Some or all of the gtk libraries were not found."
+            GTK2_GTK_LIBRARY
+            GTK2_GTK_INCLUDE_DIR
+
+            GTK2_GLIB_INCLUDE_DIR
+            GTK2_GLIBCONFIG_INCLUDE_DIR
+            GTK2_GLIB_LIBRARY
+
+            GTK2_GDK_INCLUDE_DIR
+            GTK2_GDKCONFIG_INCLUDE_DIR
+            GTK2_GDK_LIBRARY
+        )
+    ELSEIF(_component STREQUAL "gtkmm")
+        FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "Some or all of the gtkmm libraries were not found."
+            GTK2_GTKMM_LIBRARY
+            GTK2_GTKMM_INCLUDE_DIR
+            GTK2_GTKMMCONFIG_INCLUDE_DIR
+
+            GTK2_GLIBMM_INCLUDE_DIR
+            GTK2_GLIBMMCONFIG_INCLUDE_DIR
+            GTK2_GLIBMM_LIBRARY
+
+            GTK2_GDKMM_INCLUDE_DIR
+            GTK2_GDKMMCONFIG_INCLUDE_DIR
+            GTK2_GDKMM_LIBRARY
+        )
+    ELSEIF(_component STREQUAL "glade")
+        FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "The glade library was not found."
+            GTK2_GLADE_LIBRARY
+            GTK2_GLADE_INCLUDE_DIR
+        )
+    ELSEIF(_component STREQUAL "glademm")
+        FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "The glademm library was not found."
+            GTK2_GLADEMM_LIBRARY
+            GTK2_GLADEMM_INCLUDE_DIR
+            GTK2_GLADEMMCONFIG_INCLUDE_DIR
+        )
+    ENDIF()
+
+    IF(NOT GTK2_${_COMPONENT_UPPER}_FOUND)
+        SET(_did_we_find_everything false)
+    ENDIF()
+ENDFOREACH()
+
+SET(GTK2_FOUND ${_did_we_find_everything})