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 the GTK2 widget libraries and several of its other optional components
9 like ``gtkmm``, ``glade``, and ``glademm``.
11 Specify one or more of the following components as you call this find
12 module. See example below.
22 This module defines the following :prop_tgt:`IMPORTED` targets (subject to
25 ``GTK2::atk``, ``GTK2::atkmm``, ``GTK2::cairo``, ``GTK2::cairomm``,
26 ``GTK2::gdk_pixbuf``, ``GTK2::gdk``, ``GTK2::gdkmm``, ``GTK2::gio``,
27 ``GTK2::giomm``, ``GTK2::glade``, ``GTK2::glademm``, ``GTK2::glib``,
28 ``GTK2::glibmm``, ``GTK2::gmodule``, ``GTK2::gobject``, ``GTK2::gthread``,
29 ``GTK2::gtk``, ``GTK2::gtkmm``, ``GTK2::harfbuzz``, ``GTK2::pango``,
30 ``GTK2::pangocairo``, ``GTK2::pangoft2``, ``GTK2::pangomm``,
31 ``GTK2::pangoxft``, ``GTK2::sigc``.
33 .. versionadded:: 3.16.7
34 Added the ``GTK2::harfbuzz`` target.
39 The following variables will be defined for your use
42 Were all of your specified components found?
44 All include directories
51 Additional compiler flags
53 The version of GTK2 found (x.y.z)
54 ``GTK2_MAJOR_VERSION``
55 The major version of GTK2
56 ``GTK2_MINOR_VERSION``
57 The minor version of GTK2
58 ``GTK2_PATCH_VERSION``
59 The patch version of GTK2
62 When ``GTK2_USE_IMPORTED_TARGETS`` is set to ``TRUE``, ``GTK2_LIBRARIES``
63 will list imported targets instead of library paths.
68 Optional variables you can define prior to calling this module:
71 Enables verbose debugging of the module
72 ``GTK2_ADDITIONAL_SUFFIXES``
73 Allows defining additional directories to search for include files
78 Call :command:`find_package` once. Here are some examples to pick from:
80 Require GTK 2.6 or later:
84 find_package(GTK2 2.6 REQUIRED gtk)
86 Require GTK 2.10 or later and Glade:
90 find_package(GTK2 2.10 REQUIRED gtk glade)
92 Search for GTK/GTKMM 2.8 or later:
96 find_package(GTK2 2.8 COMPONENTS gtk gtkmm)
100 .. code-block:: cmake
103 include_directories(${GTK2_INCLUDE_DIRS})
104 add_executable(mygui mygui.cc)
105 target_link_libraries(mygui ${GTK2_LIBRARIES})
107 #]=======================================================================]
109 # Version 1.6 (CMake 3.0)
110 # * Create targets for each library
111 # * Do not link libfreetype
112 # Version 1.5 (CMake 2.8.12)
113 # * 14236: Detect gthread library
114 # Detect pangocairo on windows
115 # Detect pangocairo with gtk module instead of with gtkmm
116 # * 14259: Use vc100 libraries with VS 11
117 # * 14260: Export a GTK2_DEFINITIONS variable to set /vd2 when appropriate
119 # * Use the optimized/debug syntax for _LIBRARY and _LIBRARIES variables when
120 # appropriate. A new set of _RELEASE variables was also added.
121 # * Remove GTK2_SKIP_MARK_AS_ADVANCED option, as now the variables are
122 # marked as advanced by SelectLibraryConfigurations
123 # * Detect gmodule, pangoft2 and pangoxft libraries
124 # Version 1.4 (10/4/2012) (CMake 2.8.10)
125 # * 12596: Missing paths for FindGTK2 on NetBSD
126 # * 12049: Fixed detection of GTK include files in the lib folder on
128 # Version 1.3 (11/9/2010) (CMake 2.8.4)
129 # * 11429: Add support for detecting GTK2 built with Visual Studio 10.
130 # Thanks to Vincent Levesque for the patch.
131 # Version 1.2 (8/30/2010) (CMake 2.8.3)
132 # * Merge patch for detecting gdk-pixbuf library (split off
133 # from core GTK in 2.21). Thanks to Vincent Untz for the patch
134 # and Ricardo Cruz for the heads up.
135 # Version 1.1 (8/19/2010) (CMake 2.8.3)
136 # * Add support for detecting GTK2 under macports (thanks to Gary Kramlich)
137 # Version 1.0 (8/12/2010) (CMake 2.8.3)
138 # * Add support for detecting new pangommconfig.h header file
139 # (Thanks to Sune Vuorela & the Debian Project for the patch)
140 # * Add support for detecting fontconfig.h header
141 # * Call find_package(Freetype) since it's required
142 # * Add support for allowing users to add additional library directories
143 # via the GTK2_ADDITIONAL_SUFFIXES variable (kind of a future-kludge in
144 # case the GTK developers change versions on any of the directories in the
146 # Version 0.8 (1/4/2010)
147 # * Get module working under MacOSX fink by adding /sw/include, /sw/lib
148 # to PATHS and the gobject library
149 # Version 0.7 (3/22/09)
150 # * Checked into CMake CVS
151 # * Added versioning support
152 # * Module now defaults to searching for GTK if COMPONENTS not specified.
153 # * Added HKCU prior to HKLM registry key and GTKMM specific environment
154 # variable as per mailing list discussion.
155 # * Added lib64 to include search path and a few other search paths where GTK
156 # may be installed on Unix systems.
157 # * Switched to lowercase CMake commands
158 # * Prefaced internal variables with _GTK2 to prevent collision
159 # * Changed internal macros to functions
160 # * Enhanced documentation
161 # Version 0.6 (1/8/08)
162 # Added GTK2_SKIP_MARK_AS_ADVANCED option
163 # Version 0.5 (12/19/08)
164 # Second release to cmake mailing list
166 #=============================================================
168 # Internal function to parse the version number in gtkversion.h
169 # _OUT_major = Major version number
170 # _OUT_minor = Minor version number
171 # _OUT_micro = Micro version number
172 # _gtkversion_hdr = Header file to parse
173 #=============================================================
175 include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
177 function(_GTK2_GET_VERSION _OUT_major _OUT_minor _OUT_micro _gtkversion_hdr)
178 file(STRINGS ${_gtkversion_hdr} _contents REGEX "#define GTK_M[A-Z]+_VERSION[ \t]+")
180 string(REGEX REPLACE ".*#define GTK_MAJOR_VERSION[ \t]+\\(([0-9]+)\\).*" "\\1" ${_OUT_major} "${_contents}")
181 string(REGEX REPLACE ".*#define GTK_MINOR_VERSION[ \t]+\\(([0-9]+)\\).*" "\\1" ${_OUT_minor} "${_contents}")
182 string(REGEX REPLACE ".*#define GTK_MICRO_VERSION[ \t]+\\(([0-9]+)\\).*" "\\1" ${_OUT_micro} "${_contents}")
184 if(NOT ${_OUT_major} MATCHES "[0-9]+")
185 message(FATAL_ERROR "Version parsing failed for GTK2_MAJOR_VERSION!")
187 if(NOT ${_OUT_minor} MATCHES "[0-9]+")
188 message(FATAL_ERROR "Version parsing failed for GTK2_MINOR_VERSION!")
190 if(NOT ${_OUT_micro} MATCHES "[0-9]+")
191 message(FATAL_ERROR "Version parsing failed for GTK2_MICRO_VERSION!")
194 set(${_OUT_major} ${${_OUT_major}} PARENT_SCOPE)
195 set(${_OUT_minor} ${${_OUT_minor}} PARENT_SCOPE)
196 set(${_OUT_micro} ${${_OUT_micro}} PARENT_SCOPE)
198 message(FATAL_ERROR "Include file ${_gtkversion_hdr} does not exist")
203 #=============================================================
204 # _GTK2_SIGCXX_GET_VERSION
205 # Internal function to parse the version number in
207 # _OUT_major = Major version number
208 # _OUT_minor = Minor version number
209 # _OUT_micro = Micro version number
210 # _sigcxxversion_hdr = Header file to parse
211 #=============================================================
213 function(_GTK2_SIGCXX_GET_VERSION _OUT_major _OUT_minor _OUT_micro _sigcxxversion_hdr)
214 file(STRINGS ${_sigcxxversion_hdr} _contents REGEX "#define SIGCXX_M[A-Z]+_VERSION[ \t]+")
216 string(REGEX REPLACE ".*#define SIGCXX_MAJOR_VERSION[ \t]+([0-9]+).*" "\\1" ${_OUT_major} "${_contents}")
217 string(REGEX REPLACE ".*#define SIGCXX_MINOR_VERSION[ \t]+([0-9]+).*" "\\1" ${_OUT_minor} "${_contents}")
218 string(REGEX REPLACE ".*#define SIGCXX_MICRO_VERSION[ \t]+([0-9]+).*" "\\1" ${_OUT_micro} "${_contents}")
220 if(NOT ${_OUT_major} MATCHES "[0-9]+")
221 message(FATAL_ERROR "Version parsing failed for SIGCXX_MAJOR_VERSION!")
223 if(NOT ${_OUT_minor} MATCHES "[0-9]+")
224 message(FATAL_ERROR "Version parsing failed for SIGCXX_MINOR_VERSION!")
226 if(NOT ${_OUT_micro} MATCHES "[0-9]+")
227 message(FATAL_ERROR "Version parsing failed for SIGCXX_MICRO_VERSION!")
230 set(${_OUT_major} ${${_OUT_major}} PARENT_SCOPE)
231 set(${_OUT_minor} ${${_OUT_minor}} PARENT_SCOPE)
232 set(${_OUT_micro} ${${_OUT_micro}} PARENT_SCOPE)
234 # The header does not have the version macros; assume it is ``0.0.0``.
242 #=============================================================
243 # _GTK2_FIND_INCLUDE_DIR
244 # Internal function to find the GTK include directories
245 # _var = variable to set (_INCLUDE_DIR is appended)
246 # _hdr = header file to look for
247 #=============================================================
248 function(_GTK2_FIND_INCLUDE_DIR _var _hdr)
251 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
252 "_GTK2_FIND_INCLUDE_DIR( ${_var} ${_hdr} )")
256 # If these ever change, things will break.
257 ${GTK2_ADDITIONAL_SUFFIXES}
278 # NOTE: The following suffixes cause searching for header files in both of
281 # /usr/lib/<pkg>/include
285 foreach(_d ${_gtk_packages})
286 list(APPEND _suffixes ${_d})
287 list(APPEND _suffixes ${_d}/include) # for /usr/lib/gtk-2.0/include
291 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
292 "include suffixes = ${_suffixes}")
295 if(CMAKE_LIBRARY_ARCHITECTURE)
296 set(_gtk2_arch_dir /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE})
298 message(STATUS "Adding ${_gtk2_arch_dir} to search path for multiarch support")
301 find_path(GTK2_${_var}_INCLUDE_DIR ${_hdr}
318 /usr/pkg/include/glib
319 $ENV{GTKMM_BASEPATH}/include
320 $ENV{GTKMM_BASEPATH}/lib
321 [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/include
322 [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/lib
323 [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/include
324 [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib
328 mark_as_advanced(GTK2_${_var}_INCLUDE_DIR)
330 if(GTK2_${_var}_INCLUDE_DIR)
331 set(GTK2_INCLUDE_DIRS ${GTK2_INCLUDE_DIRS} ${GTK2_${_var}_INCLUDE_DIR} PARENT_SCOPE)
336 #=============================================================
338 # Internal function to find libraries packaged with GTK2
339 # _var = library variable to create (_LIBRARY is appended)
340 #=============================================================
341 function(_GTK2_FIND_LIBRARY _var _lib _expand_vc _append_version)
344 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
345 "_GTK2_FIND_LIBRARY( ${_var} ${_lib} ${_expand_vc} ${_append_version} )")
348 # Not GTK versions per se but the versions encoded into Windows
349 # import libraries (GtkMM 2.14.1 has a gtkmm-vc80-2_4.lib for example)
350 # Also the MSVC libraries use _ for . (this is handled below)
351 set(_versions 2.20 2.18 2.16 2.14 2.12
352 2.10 2.8 2.6 2.4 2.2 2.0
353 1.20 1.18 1.16 1.14 1.12
354 1.10 1.8 1.6 1.4 1.2 1.0)
359 set(_library ${_lib})
361 if(_expand_vc AND MSVC)
362 # Add vc80/vc90/vc100 midfixes
363 if(MSVC_TOOLSET_VERSION LESS 110)
364 set(_library ${_library}-vc${MSVC_TOOLSET_VERSION})
366 # Up to gtkmm-win 2.22.0-2 there are no vc110 libraries but vc100 can be used
367 set(_library ${_library}-vc100)
369 set(_library_d ${_library}-d)
373 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
374 "After midfix addition = ${_library} and ${_library_d}")
380 foreach(_ver ${_versions})
381 list(APPEND _lib_list "${_library}-${_ver}")
382 list(APPEND _libd_list "${_library_d}-${_ver}")
385 set(_lib_list ${_library})
386 set(_libd_list ${_library_d})
390 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
391 "library list = ${_lib_list} and library debug list = ${_libd_list}")
394 # For some silly reason the MSVC libraries use _ instead of .
395 # in the version fields
396 if(_expand_vc AND MSVC)
397 set(_no_dots_lib_list)
398 set(_no_dots_libd_list)
399 foreach(_l ${_lib_list})
400 string(REPLACE "." "_" _no_dots_library ${_l})
401 list(APPEND _no_dots_lib_list ${_no_dots_library})
404 set(_no_dots_libsd_list)
405 foreach(_l ${_libd_list})
406 string(REPLACE "." "_" _no_dots_libraryd ${_l})
407 list(APPEND _no_dots_libd_list ${_no_dots_libraryd})
410 # Copy list back to original names
411 set(_lib_list ${_no_dots_lib_list})
412 set(_libd_list ${_no_dots_libd_list})
416 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
417 "While searching for GTK2_${_var}_LIBRARY, our proposed library list is ${_lib_list}")
420 find_library(GTK2_${_var}_LIBRARY_RELEASE
425 $ENV{GTKMM_BASEPATH}/lib
426 [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/lib
427 [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib
430 if(_expand_vc AND MSVC)
432 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
433 "While searching for GTK2_${_var}_LIBRARY_DEBUG our proposed library list is ${_libd_list}")
436 find_library(GTK2_${_var}_LIBRARY_DEBUG
439 $ENV{GTKMM_BASEPATH}/lib
440 [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/lib
441 [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib
445 select_library_configurations(GTK2_${_var})
447 set(GTK2_${_var}_LIBRARY ${GTK2_${_var}_LIBRARY} PARENT_SCOPE)
448 set(GTK2_${_var}_FOUND ${GTK2_${_var}_FOUND} PARENT_SCOPE)
450 if(GTK2_${_var}_FOUND)
451 set(GTK2_LIBRARIES ${GTK2_LIBRARIES} ${GTK2_${_var}_LIBRARY})
452 set(GTK2_LIBRARIES ${GTK2_LIBRARIES} PARENT_SCOPE)
456 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
457 "GTK2_${_var}_LIBRARY_RELEASE = \"${GTK2_${_var}_LIBRARY_RELEASE}\"")
458 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
459 "GTK2_${_var}_LIBRARY_DEBUG = \"${GTK2_${_var}_LIBRARY_DEBUG}\"")
460 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
461 "GTK2_${_var}_LIBRARY = \"${GTK2_${_var}_LIBRARY}\"")
462 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
463 "GTK2_${_var}_FOUND = \"${GTK2_${_var}_FOUND}\"")
469 function(_GTK2_ADD_TARGET_DEPENDS_INTERNAL _var _property)
471 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
472 "_GTK2_ADD_TARGET_DEPENDS_INTERNAL( ${_var} ${_property} )")
475 string(TOLOWER "${_var}" _basename)
477 if (TARGET GTK2::${_basename})
478 foreach(_depend ${ARGN})
480 if (TARGET GTK2::${_depend})
481 list(APPEND _valid_depends GTK2::${_depend})
484 set_property(TARGET GTK2::${_basename} APPEND PROPERTY ${_property} "${_valid_depends}")
491 function(_GTK2_ADD_TARGET_DEPENDS _var)
493 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
494 "_GTK2_ADD_TARGET_DEPENDS( ${_var} )")
497 string(TOLOWER "${_var}" _basename)
499 if(TARGET GTK2::${_basename})
500 get_target_property(_configs GTK2::${_basename} IMPORTED_CONFIGURATIONS)
501 _GTK2_ADD_TARGET_DEPENDS_INTERNAL(${_var} INTERFACE_LINK_LIBRARIES ${ARGN})
502 foreach(_config ${_configs})
503 _GTK2_ADD_TARGET_DEPENDS_INTERNAL(${_var} IMPORTED_LINK_INTERFACE_LIBRARIES_${_config} ${ARGN})
508 function(_GTK2_ADD_TARGET_INCLUDE_DIRS _var)
510 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
511 "_GTK2_ADD_TARGET_INCLUDE_DIRS( ${_var} )")
514 string(TOLOWER "${_var}" _basename)
516 if(TARGET GTK2::${_basename})
517 foreach(_include ${ARGN})
518 set_property(TARGET GTK2::${_basename} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${_include}")
523 #=============================================================
525 # Internal function to create targets for GTK2
526 # _var = target to create
527 #=============================================================
528 function(_GTK2_ADD_TARGET _var)
530 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
531 "_GTK2_ADD_TARGET( ${_var} )")
534 string(TOLOWER "${_var}" _basename)
536 cmake_parse_arguments(_${_var} "" "" "GTK2_DEPENDS;GTK2_OPTIONAL_DEPENDS;OPTIONAL_INCLUDES" ${ARGN})
538 if(GTK2_${_var}_FOUND)
539 if(NOT TARGET GTK2::${_basename})
540 # Do not create the target if dependencies are missing
541 foreach(_dep ${_${_var}_GTK2_DEPENDS})
542 if(NOT TARGET GTK2::${_dep})
547 add_library(GTK2::${_basename} UNKNOWN IMPORTED)
549 if(GTK2_${_var}_LIBRARY_RELEASE)
550 set_property(TARGET GTK2::${_basename} APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
551 set_property(TARGET GTK2::${_basename} PROPERTY IMPORTED_LOCATION_RELEASE "${GTK2_${_var}_LIBRARY_RELEASE}" )
554 if(GTK2_${_var}_LIBRARY_DEBUG)
555 set_property(TARGET GTK2::${_basename} APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
556 set_property(TARGET GTK2::${_basename} PROPERTY IMPORTED_LOCATION_DEBUG "${GTK2_${_var}_LIBRARY_DEBUG}" )
559 if(GTK2_${_var}_INCLUDE_DIR)
560 set_property(TARGET GTK2::${_basename} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${GTK2_${_var}_INCLUDE_DIR}")
563 if(GTK2_${_var}CONFIG_INCLUDE_DIR AND NOT "x${GTK2_${_var}CONFIG_INCLUDE_DIR}" STREQUAL "x${GTK2_${_var}_INCLUDE_DIR}")
564 set_property(TARGET GTK2::${_basename} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${GTK2_${_var}CONFIG_INCLUDE_DIR}")
568 set_property(TARGET GTK2::${_basename} PROPERTY INTERFACE_COMPILE_DEFINITIONS "${GTK2_DEFINITIONS}")
571 if(_${_var}_GTK2_DEPENDS)
572 _GTK2_ADD_TARGET_DEPENDS(${_var} ${_${_var}_GTK2_DEPENDS} ${_${_var}_GTK2_OPTIONAL_DEPENDS})
575 if(_${_var}_OPTIONAL_INCLUDES)
576 foreach(_D ${_${_var}_OPTIONAL_INCLUDES})
578 _GTK2_ADD_TARGET_INCLUDE_DIRS(${_var} ${_D})
584 set(GTK2_TARGETS ${GTK2_TARGETS} GTK2::${_basename})
585 set(GTK2_TARGETS ${GTK2_TARGETS} PARENT_SCOPE)
587 if(GTK2_USE_IMPORTED_TARGETS)
588 set(GTK2_${_var}_LIBRARY GTK2::${_basename} PARENT_SCOPE)
596 #=============================================================
603 set(GTK2_INCLUDE_DIRS)
606 set(GTK2_DEFINITIONS)
608 if(NOT GTK2_FIND_COMPONENTS)
609 # Assume they only want GTK
610 set(GTK2_FIND_COMPONENTS gtk)
614 # If specified, enforce version number
616 if(GTK2_FIND_VERSION)
617 set(GTK2_FAILED_VERSION_CHECK true)
619 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
620 "Searching for version ${GTK2_FIND_VERSION}")
622 _GTK2_FIND_INCLUDE_DIR(GTK gtk/gtk.h)
623 if(GTK2_GTK_INCLUDE_DIR)
624 _GTK2_GET_VERSION(GTK2_MAJOR_VERSION
627 ${GTK2_GTK_INCLUDE_DIR}/gtk/gtkversion.h)
629 ${GTK2_MAJOR_VERSION}.${GTK2_MINOR_VERSION}.${GTK2_PATCH_VERSION})
630 if(GTK2_FIND_VERSION_EXACT)
631 if(GTK2_VERSION VERSION_EQUAL GTK2_FIND_VERSION)
632 set(GTK2_FAILED_VERSION_CHECK false)
635 if(GTK2_VERSION VERSION_EQUAL GTK2_FIND_VERSION OR
636 GTK2_VERSION VERSION_GREATER GTK2_FIND_VERSION)
637 set(GTK2_FAILED_VERSION_CHECK false)
641 # If we can't find the GTK include dir, we can't do version checking
642 if(GTK2_FIND_REQUIRED AND NOT GTK2_FIND_QUIETLY)
643 message(FATAL_ERROR "Could not find GTK2 include directory")
648 if(GTK2_FAILED_VERSION_CHECK)
649 if(GTK2_FIND_REQUIRED AND NOT GTK2_FIND_QUIETLY)
650 if(GTK2_FIND_VERSION_EXACT)
651 message(FATAL_ERROR "GTK2 version check failed. Version ${GTK2_VERSION} was found, version ${GTK2_FIND_VERSION} is needed exactly.")
653 message(FATAL_ERROR "GTK2 version check failed. Version ${GTK2_VERSION} was found, at least version ${GTK2_FIND_VERSION} is required")
657 # If the version check fails, exit out of the module here
663 # On MSVC, according to https://wiki.gnome.org/gtkmm/MSWindows, the /vd2 flag needs to be
664 # passed to the compiler in order to use gtkmm
667 foreach(_GTK2_component ${GTK2_FIND_COMPONENTS})
668 if(_GTK2_component STREQUAL "gtkmm")
669 set(GTK2_DEFINITIONS "/vd2")
670 elseif(_GTK2_component STREQUAL "glademm")
671 set(GTK2_DEFINITIONS "/vd2")
677 # Find all components
680 find_package(Freetype QUIET)
681 if(FREETYPE_INCLUDE_DIR_ft2build AND FREETYPE_INCLUDE_DIR_freetype2)
682 list(APPEND GTK2_INCLUDE_DIRS ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2})
685 foreach(_GTK2_component ${GTK2_FIND_COMPONENTS})
686 if(_GTK2_component STREQUAL "gtk")
687 # Left for compatibility with previous versions.
688 _GTK2_FIND_INCLUDE_DIR(FONTCONFIG fontconfig/fontconfig.h)
689 _GTK2_FIND_INCLUDE_DIR(X11 X11/Xlib.h)
691 _GTK2_FIND_INCLUDE_DIR(GLIB glib.h)
692 _GTK2_FIND_INCLUDE_DIR(GLIBCONFIG glibconfig.h)
693 _GTK2_FIND_LIBRARY (GLIB glib false true)
694 _GTK2_ADD_TARGET (GLIB)
696 _GTK2_FIND_INCLUDE_DIR(GOBJECT glib-object.h)
697 _GTK2_FIND_LIBRARY (GOBJECT gobject false true)
698 _GTK2_ADD_TARGET (GOBJECT GTK2_DEPENDS glib)
700 _GTK2_FIND_INCLUDE_DIR(ATK atk/atk.h)
701 _GTK2_FIND_LIBRARY (ATK atk false true)
702 _GTK2_ADD_TARGET (ATK GTK2_DEPENDS gobject glib)
704 _GTK2_FIND_LIBRARY (GIO gio false true)
705 _GTK2_ADD_TARGET (GIO GTK2_DEPENDS gobject glib)
707 _GTK2_FIND_LIBRARY (GTHREAD gthread false true)
708 _GTK2_ADD_TARGET (GTHREAD GTK2_DEPENDS glib)
710 _GTK2_FIND_LIBRARY (GMODULE gmodule false true)
711 _GTK2_ADD_TARGET (GMODULE GTK2_DEPENDS glib)
713 _GTK2_FIND_INCLUDE_DIR(GDK_PIXBUF gdk-pixbuf/gdk-pixbuf.h)
714 _GTK2_FIND_LIBRARY (GDK_PIXBUF gdk_pixbuf false true)
715 _GTK2_ADD_TARGET (GDK_PIXBUF GTK2_DEPENDS gobject glib)
717 _GTK2_FIND_INCLUDE_DIR(CAIRO cairo.h)
718 _GTK2_FIND_LIBRARY (CAIRO cairo false false)
719 _GTK2_ADD_TARGET (CAIRO)
721 _GTK2_FIND_INCLUDE_DIR(HARFBUZZ hb.h)
722 _GTK2_FIND_LIBRARY (HARFBUZZ harfbuzz false false)
723 _GTK2_ADD_TARGET (HARFBUZZ)
725 _GTK2_FIND_INCLUDE_DIR(PANGO pango/pango.h)
726 _GTK2_FIND_LIBRARY (PANGO pango false true)
727 _GTK2_ADD_TARGET (PANGO GTK2_DEPENDS gobject glib
728 GTK2_OPTIONAL_DEPENDS harfbuzz)
730 _GTK2_FIND_LIBRARY (PANGOCAIRO pangocairo false true)
731 _GTK2_ADD_TARGET (PANGOCAIRO GTK2_DEPENDS pango cairo gobject glib)
733 _GTK2_FIND_LIBRARY (PANGOFT2 pangoft2 false true)
734 _GTK2_ADD_TARGET (PANGOFT2 GTK2_DEPENDS pango gobject glib
735 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}
736 ${GTK2_FONTCONFIG_INCLUDE_DIR}
737 ${GTK2_X11_INCLUDE_DIR})
739 _GTK2_FIND_LIBRARY (PANGOXFT pangoxft false true)
740 _GTK2_ADD_TARGET (PANGOXFT GTK2_DEPENDS pangoft2 pango gobject glib
741 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}
742 ${GTK2_FONTCONFIG_INCLUDE_DIR}
743 ${GTK2_X11_INCLUDE_DIR})
745 _GTK2_FIND_INCLUDE_DIR(GDK gdk/gdk.h)
746 _GTK2_FIND_INCLUDE_DIR(GDKCONFIG gdkconfig.h)
749 _GTK2_FIND_LIBRARY (GDK gdk-quartz false true)
751 _GTK2_FIND_LIBRARY (GDK gdk-x11 false true)
753 _GTK2_FIND_LIBRARY (GDK gdk-win32 false true)
755 _GTK2_ADD_TARGET (GDK GTK2_DEPENDS pango gdk_pixbuf gobject glib
756 GTK2_OPTIONAL_DEPENDS pangocairo cairo)
758 _GTK2_FIND_INCLUDE_DIR(GTK gtk/gtk.h)
761 _GTK2_FIND_LIBRARY (GTK gtk-quartz false true)
763 _GTK2_FIND_LIBRARY (GTK gtk-x11 false true)
765 _GTK2_FIND_LIBRARY (GTK gtk-win32 false true)
767 _GTK2_ADD_TARGET (GTK GTK2_DEPENDS gdk atk pangoft2 pango gdk_pixbuf gthread gobject glib
768 GTK2_OPTIONAL_DEPENDS gio pangocairo cairo)
770 elseif(_GTK2_component STREQUAL "gtkmm")
772 _GTK2_FIND_INCLUDE_DIR(SIGC++ sigc++/sigc++.h)
773 _GTK2_FIND_INCLUDE_DIR(SIGC++CONFIG sigc++config.h)
774 _GTK2_FIND_LIBRARY (SIGC++ sigc true true)
775 _GTK2_ADD_TARGET (SIGC++)
776 # Since sigc++ 2.5.1 c++11 support is required
777 if(GTK2_SIGC++CONFIG_INCLUDE_DIR)
778 _GTK2_SIGCXX_GET_VERSION(GTK2_SIGC++_VERSION_MAJOR
779 GTK2_SIGC++_VERSION_MINOR
780 GTK2_SIGC++_VERSION_MICRO
781 ${GTK2_SIGC++CONFIG_INCLUDE_DIR}/sigc++config.h)
782 if(NOT ${GTK2_SIGC++_VERSION_MAJOR}.${GTK2_SIGC++_VERSION_MINOR}.${GTK2_SIGC++_VERSION_MICRO} VERSION_LESS 2.5.1)
783 # These are the features needed by clients in order to include the
785 set_property(TARGET GTK2::sigc++
786 PROPERTY INTERFACE_COMPILE_FEATURES cxx_alias_templates
789 cxx_deleted_functions
792 cxx_right_angle_brackets
793 cxx_rvalue_references
794 cxx_variadic_templates)
798 _GTK2_FIND_INCLUDE_DIR(GLIBMM glibmm.h)
799 _GTK2_FIND_INCLUDE_DIR(GLIBMMCONFIG glibmmconfig.h)
800 _GTK2_FIND_LIBRARY (GLIBMM glibmm true true)
801 _GTK2_ADD_TARGET (GLIBMM GTK2_DEPENDS gobject sigc++ glib)
803 _GTK2_FIND_INCLUDE_DIR(GIOMM giomm.h)
804 _GTK2_FIND_INCLUDE_DIR(GIOMMCONFIG giommconfig.h)
805 _GTK2_FIND_LIBRARY (GIOMM giomm true true)
806 _GTK2_ADD_TARGET (GIOMM GTK2_DEPENDS gio glibmm gobject sigc++ glib)
808 _GTK2_FIND_INCLUDE_DIR(ATKMM atkmm.h)
809 _GTK2_FIND_INCLUDE_DIR(ATKMMCONFIG atkmmconfig.h)
810 _GTK2_FIND_LIBRARY (ATKMM atkmm true true)
811 _GTK2_ADD_TARGET (ATKMM GTK2_DEPENDS atk glibmm gobject sigc++ glib)
813 _GTK2_FIND_INCLUDE_DIR(CAIROMM cairomm/cairomm.h)
814 _GTK2_FIND_INCLUDE_DIR(CAIROMMCONFIG cairommconfig.h)
815 _GTK2_FIND_LIBRARY (CAIROMM cairomm true true)
816 _GTK2_ADD_TARGET (CAIROMM GTK2_DEPENDS cairo sigc++
817 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}
818 ${GTK2_FONTCONFIG_INCLUDE_DIR}
819 ${GTK2_X11_INCLUDE_DIR})
821 _GTK2_FIND_INCLUDE_DIR(PANGOMM pangomm.h)
822 _GTK2_FIND_INCLUDE_DIR(PANGOMMCONFIG pangommconfig.h)
823 _GTK2_FIND_LIBRARY (PANGOMM pangomm true true)
824 _GTK2_ADD_TARGET (PANGOMM GTK2_DEPENDS glibmm sigc++ pango gobject glib
825 GTK2_OPTIONAL_DEPENDS cairomm pangocairo cairo
826 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}
827 ${GTK2_FONTCONFIG_INCLUDE_DIR}
828 ${GTK2_X11_INCLUDE_DIR})
830 _GTK2_FIND_INCLUDE_DIR(GDKMM gdkmm.h)
831 _GTK2_FIND_INCLUDE_DIR(GDKMMCONFIG gdkmmconfig.h)
832 _GTK2_FIND_LIBRARY (GDKMM gdkmm true true)
833 _GTK2_ADD_TARGET (GDKMM GTK2_DEPENDS pangomm gtk glibmm sigc++ gdk atk pangoft2 gdk_pixbuf pango gobject glib
834 GTK2_OPTIONAL_DEPENDS giomm cairomm gio pangocairo cairo
835 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}
836 ${GTK2_FONTCONFIG_INCLUDE_DIR}
837 ${GTK2_X11_INCLUDE_DIR})
839 _GTK2_FIND_INCLUDE_DIR(GTKMM gtkmm.h)
840 _GTK2_FIND_INCLUDE_DIR(GTKMMCONFIG gtkmmconfig.h)
841 _GTK2_FIND_LIBRARY (GTKMM gtkmm true true)
842 _GTK2_ADD_TARGET (GTKMM GTK2_DEPENDS atkmm gdkmm pangomm gtk glibmm sigc++ gdk atk pangoft2 gdk_pixbuf pango gthread gobject glib
843 GTK2_OPTIONAL_DEPENDS giomm cairomm gio pangocairo cairo
844 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}
845 ${GTK2_FONTCONFIG_INCLUDE_DIR}
846 ${GTK2_X11_INCLUDE_DIR})
848 elseif(_GTK2_component STREQUAL "glade")
850 _GTK2_FIND_INCLUDE_DIR(GLADE glade/glade.h)
851 _GTK2_FIND_LIBRARY (GLADE glade false true)
852 _GTK2_ADD_TARGET (GLADE GTK2_DEPENDS gtk gdk atk gio pangoft2 gdk_pixbuf pango gobject glib
853 GTK2_OPTIONAL_DEPENDS pangocairo cairo
854 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}
855 ${GTK2_FONTCONFIG_INCLUDE_DIR}
856 ${GTK2_X11_INCLUDE_DIR})
858 elseif(_GTK2_component STREQUAL "glademm")
860 _GTK2_FIND_INCLUDE_DIR(GLADEMM libglademm.h)
861 _GTK2_FIND_INCLUDE_DIR(GLADEMMCONFIG libglademmconfig.h)
862 _GTK2_FIND_LIBRARY (GLADEMM glademm true true)
863 _GTK2_ADD_TARGET (GLADEMM GTK2_DEPENDS gtkmm glade atkmm gdkmm giomm pangomm glibmm sigc++ gtk gdk atk pangoft2 gdk_pixbuf pango gthread gobject glib
864 GTK2_OPTIONAL_DEPENDS giomm cairomm gio pangocairo cairo
865 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}
866 ${GTK2_FONTCONFIG_INCLUDE_DIR}
867 ${GTK2_X11_INCLUDE_DIR})
870 message(FATAL_ERROR "Unknown GTK2 component ${_component}")
875 # Solve for the GTK2 version if we haven't already
877 if(NOT GTK2_FIND_VERSION AND GTK2_GTK_INCLUDE_DIR)
878 _GTK2_GET_VERSION(GTK2_MAJOR_VERSION
881 ${GTK2_GTK_INCLUDE_DIR}/gtk/gtkversion.h)
882 set(GTK2_VERSION ${GTK2_MAJOR_VERSION}.${GTK2_MINOR_VERSION}.${GTK2_PATCH_VERSION})
886 # Try to enforce components
889 set(_GTK2_did_we_find_everything true) # This gets set to GTK2_FOUND
891 include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
893 foreach(_GTK2_component ${GTK2_FIND_COMPONENTS})
894 string(TOUPPER ${_GTK2_component} _COMPONENT_UPPER)
896 set(GTK2_${_COMPONENT_UPPER}_FIND_QUIETLY ${GTK2_FIND_QUIETLY})
898 set(FPHSA_NAME_MISMATCHED 1)
899 if(_GTK2_component STREQUAL "gtk")
900 FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "Some or all of the gtk libraries were not found."
905 GTK2_GDKCONFIG_INCLUDE_DIR
908 GTK2_GLIB_INCLUDE_DIR
909 GTK2_GLIBCONFIG_INCLUDE_DIR
912 elseif(_GTK2_component STREQUAL "gtkmm")
913 FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "Some or all of the gtkmm libraries were not found."
915 GTK2_GTKMM_INCLUDE_DIR
916 GTK2_GTKMMCONFIG_INCLUDE_DIR
918 GTK2_GDKMM_INCLUDE_DIR
919 GTK2_GDKMMCONFIG_INCLUDE_DIR
922 GTK2_GLIBMM_INCLUDE_DIR
923 GTK2_GLIBMMCONFIG_INCLUDE_DIR
926 FREETYPE_INCLUDE_DIR_ft2build
927 FREETYPE_INCLUDE_DIR_freetype2
929 elseif(_GTK2_component STREQUAL "glade")
930 FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "The glade library was not found."
932 GTK2_GLADE_INCLUDE_DIR
934 elseif(_GTK2_component STREQUAL "glademm")
935 FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "The glademm library was not found."
937 GTK2_GLADEMM_INCLUDE_DIR
938 GTK2_GLADEMMCONFIG_INCLUDE_DIR
941 unset(FPHSA_NAME_MISMATCHED)
943 if(NOT GTK2_${_COMPONENT_UPPER}_FOUND)
944 set(_GTK2_did_we_find_everything false)
948 if(GTK2_USE_IMPORTED_TARGETS)
949 set(GTK2_LIBRARIES ${GTK2_TARGETS})
953 if(_GTK2_did_we_find_everything AND NOT GTK2_VERSION_CHECK_FAILED)
956 # Unset our variables.
957 set(GTK2_FOUND false)
959 set(GTK2_VERSION_MAJOR)
960 set(GTK2_VERSION_MINOR)
961 set(GTK2_VERSION_PATCH)
962 set(GTK2_INCLUDE_DIRS)
965 set(GTK2_DEFINITIONS)
968 if(GTK2_INCLUDE_DIRS)
969 list(REMOVE_DUPLICATES GTK2_INCLUDE_DIRS)