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)
179 cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n>
180 file(STRINGS ${_gtkversion_hdr} _contents REGEX "#define GTK_M[A-Z]+_VERSION[ \t]+")
183 string(REGEX REPLACE ".*#define GTK_MAJOR_VERSION[ \t]+\\(([0-9]+)\\).*" "\\1" ${_OUT_major} "${_contents}")
184 string(REGEX REPLACE ".*#define GTK_MINOR_VERSION[ \t]+\\(([0-9]+)\\).*" "\\1" ${_OUT_minor} "${_contents}")
185 string(REGEX REPLACE ".*#define GTK_MICRO_VERSION[ \t]+\\(([0-9]+)\\).*" "\\1" ${_OUT_micro} "${_contents}")
187 if(NOT ${_OUT_major} MATCHES "[0-9]+")
188 message(FATAL_ERROR "Version parsing failed for GTK2_MAJOR_VERSION!")
190 if(NOT ${_OUT_minor} MATCHES "[0-9]+")
191 message(FATAL_ERROR "Version parsing failed for GTK2_MINOR_VERSION!")
193 if(NOT ${_OUT_micro} MATCHES "[0-9]+")
194 message(FATAL_ERROR "Version parsing failed for GTK2_MICRO_VERSION!")
197 set(${_OUT_major} ${${_OUT_major}} PARENT_SCOPE)
198 set(${_OUT_minor} ${${_OUT_minor}} PARENT_SCOPE)
199 set(${_OUT_micro} ${${_OUT_micro}} PARENT_SCOPE)
201 message(FATAL_ERROR "Include file ${_gtkversion_hdr} does not exist")
206 #=============================================================
207 # _GTK2_SIGCXX_GET_VERSION
208 # Internal function to parse the version number in
210 # _OUT_major = Major version number
211 # _OUT_minor = Minor version number
212 # _OUT_micro = Micro version number
213 # _sigcxxversion_hdr = Header file to parse
214 #=============================================================
216 function(_GTK2_SIGCXX_GET_VERSION _OUT_major _OUT_minor _OUT_micro _sigcxxversion_hdr)
218 cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n>
219 file(STRINGS ${_sigcxxversion_hdr} _contents REGEX "#define SIGCXX_M[A-Z]+_VERSION[ \t]+")
222 string(REGEX REPLACE ".*#define SIGCXX_MAJOR_VERSION[ \t]+([0-9]+).*" "\\1" ${_OUT_major} "${_contents}")
223 string(REGEX REPLACE ".*#define SIGCXX_MINOR_VERSION[ \t]+([0-9]+).*" "\\1" ${_OUT_minor} "${_contents}")
224 string(REGEX REPLACE ".*#define SIGCXX_MICRO_VERSION[ \t]+([0-9]+).*" "\\1" ${_OUT_micro} "${_contents}")
226 if(NOT ${_OUT_major} MATCHES "[0-9]+")
227 message(FATAL_ERROR "Version parsing failed for SIGCXX_MAJOR_VERSION!")
229 if(NOT ${_OUT_minor} MATCHES "[0-9]+")
230 message(FATAL_ERROR "Version parsing failed for SIGCXX_MINOR_VERSION!")
232 if(NOT ${_OUT_micro} MATCHES "[0-9]+")
233 message(FATAL_ERROR "Version parsing failed for SIGCXX_MICRO_VERSION!")
236 set(${_OUT_major} ${${_OUT_major}} PARENT_SCOPE)
237 set(${_OUT_minor} ${${_OUT_minor}} PARENT_SCOPE)
238 set(${_OUT_micro} ${${_OUT_micro}} PARENT_SCOPE)
240 # The header does not have the version macros; assume it is ``0.0.0``.
248 #=============================================================
249 # _GTK2_FIND_INCLUDE_DIR
250 # Internal function to find the GTK include directories
251 # _var = variable to set (_INCLUDE_DIR is appended)
252 # _hdr = header file to look for
253 #=============================================================
254 function(_GTK2_FIND_INCLUDE_DIR _var _hdr)
257 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
258 "_GTK2_FIND_INCLUDE_DIR( ${_var} ${_hdr} )")
262 # If these ever change, things will break.
263 ${GTK2_ADDITIONAL_SUFFIXES}
284 # NOTE: The following suffixes cause searching for header files in both of
287 # /usr/lib/<pkg>/include
291 foreach(_d ${_gtk_packages})
292 list(APPEND _suffixes ${_d})
293 list(APPEND _suffixes ${_d}/include) # for /usr/lib/gtk-2.0/include
297 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
298 "include suffixes = ${_suffixes}")
301 if(CMAKE_LIBRARY_ARCHITECTURE)
302 set(_gtk2_arch_dir /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE})
304 message(STATUS "Adding ${_gtk2_arch_dir} to search path for multiarch support")
307 find_path(GTK2_${_var}_INCLUDE_DIR ${_hdr}
309 ${PC_GLIB2_INCLUDEDIR}
311 ${PC_GTK2_INCLUDEDIR}
328 /usr/pkg/include/glib
329 $ENV{GTKMM_BASEPATH}/include
330 $ENV{GTKMM_BASEPATH}/lib
331 [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/include
332 [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/lib
333 [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/include
334 [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib
338 mark_as_advanced(GTK2_${_var}_INCLUDE_DIR)
340 if(GTK2_${_var}_INCLUDE_DIR)
341 set(GTK2_INCLUDE_DIRS ${GTK2_INCLUDE_DIRS} ${GTK2_${_var}_INCLUDE_DIR} PARENT_SCOPE)
346 #=============================================================
348 # Internal function to find libraries packaged with GTK2
349 # _var = library variable to create (_LIBRARY is appended)
350 #=============================================================
351 function(_GTK2_FIND_LIBRARY _var _lib _expand_vc _append_version)
354 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
355 "_GTK2_FIND_LIBRARY( ${_var} ${_lib} ${_expand_vc} ${_append_version} )")
358 # Not GTK versions per se but the versions encoded into Windows
359 # import libraries (GtkMM 2.14.1 has a gtkmm-vc80-2_4.lib for example)
360 # Also the MSVC libraries use _ for . (this is handled below)
361 set(_versions 2.20 2.18 2.16 2.14 2.12
362 2.10 2.8 2.6 2.4 2.2 2.0
363 1.20 1.18 1.16 1.14 1.12
364 1.10 1.8 1.6 1.4 1.2 1.0)
369 set(_library ${_lib})
371 if(_expand_vc AND MSVC)
372 # Add vc80/vc90/vc100 midfixes
373 if(MSVC_TOOLSET_VERSION LESS 110)
374 set(_library ${_library}-vc${MSVC_TOOLSET_VERSION})
376 # Up to gtkmm-win 2.22.0-2 there are no vc110 libraries but vc100 can be used
377 set(_library ${_library}-vc100)
379 set(_library_d ${_library}-d)
383 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
384 "After midfix addition = ${_library} and ${_library_d}")
390 foreach(_ver ${_versions})
391 list(APPEND _lib_list "${_library}-${_ver}")
392 list(APPEND _libd_list "${_library_d}-${_ver}")
395 set(_lib_list ${_library})
396 set(_libd_list ${_library_d})
400 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
401 "library list = ${_lib_list} and library debug list = ${_libd_list}")
404 # For some silly reason the MSVC libraries use _ instead of .
405 # in the version fields
406 if(_expand_vc AND MSVC)
407 set(_no_dots_lib_list)
408 set(_no_dots_libd_list)
409 foreach(_l ${_lib_list})
410 string(REPLACE "." "_" _no_dots_library ${_l})
411 list(APPEND _no_dots_lib_list ${_no_dots_library})
414 set(_no_dots_libsd_list)
415 foreach(_l ${_libd_list})
416 string(REPLACE "." "_" _no_dots_libraryd ${_l})
417 list(APPEND _no_dots_libd_list ${_no_dots_libraryd})
420 # Copy list back to original names
421 set(_lib_list ${_no_dots_lib_list})
422 set(_libd_list ${_no_dots_libd_list})
426 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
427 "While searching for GTK2_${_var}_LIBRARY, our proposed library list is ${_lib_list}")
430 find_library(GTK2_${_var}_LIBRARY_RELEASE
435 $ENV{GTKMM_BASEPATH}/lib
436 [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/lib
437 [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib
440 if(_expand_vc AND MSVC)
442 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
443 "While searching for GTK2_${_var}_LIBRARY_DEBUG our proposed library list is ${_libd_list}")
446 find_library(GTK2_${_var}_LIBRARY_DEBUG
449 $ENV{GTKMM_BASEPATH}/lib
450 [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/lib
451 [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib
455 select_library_configurations(GTK2_${_var})
457 set(GTK2_${_var}_LIBRARY ${GTK2_${_var}_LIBRARY} PARENT_SCOPE)
458 set(GTK2_${_var}_FOUND ${GTK2_${_var}_FOUND} PARENT_SCOPE)
460 if(GTK2_${_var}_FOUND)
461 set(GTK2_LIBRARIES ${GTK2_LIBRARIES} ${GTK2_${_var}_LIBRARY})
462 set(GTK2_LIBRARIES ${GTK2_LIBRARIES} PARENT_SCOPE)
466 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
467 "GTK2_${_var}_LIBRARY_RELEASE = \"${GTK2_${_var}_LIBRARY_RELEASE}\"")
468 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
469 "GTK2_${_var}_LIBRARY_DEBUG = \"${GTK2_${_var}_LIBRARY_DEBUG}\"")
470 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
471 "GTK2_${_var}_LIBRARY = \"${GTK2_${_var}_LIBRARY}\"")
472 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
473 "GTK2_${_var}_FOUND = \"${GTK2_${_var}_FOUND}\"")
479 function(_GTK2_ADD_TARGET_DEPENDS_INTERNAL _var _property)
481 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
482 "_GTK2_ADD_TARGET_DEPENDS_INTERNAL( ${_var} ${_property} )")
485 string(TOLOWER "${_var}" _basename)
487 if (TARGET GTK2::${_basename})
488 foreach(_depend ${ARGN})
490 if (TARGET GTK2::${_depend})
491 list(APPEND _valid_depends GTK2::${_depend})
494 set_property(TARGET GTK2::${_basename} APPEND PROPERTY ${_property} "${_valid_depends}")
501 function(_GTK2_ADD_TARGET_DEPENDS _var)
503 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
504 "_GTK2_ADD_TARGET_DEPENDS( ${_var} )")
507 string(TOLOWER "${_var}" _basename)
509 if(TARGET GTK2::${_basename})
510 get_target_property(_configs GTK2::${_basename} IMPORTED_CONFIGURATIONS)
511 _GTK2_ADD_TARGET_DEPENDS_INTERNAL(${_var} INTERFACE_LINK_LIBRARIES ${ARGN})
512 foreach(_config ${_configs})
513 _GTK2_ADD_TARGET_DEPENDS_INTERNAL(${_var} IMPORTED_LINK_INTERFACE_LIBRARIES_${_config} ${ARGN})
518 function(_GTK2_ADD_TARGET_INCLUDE_DIRS _var)
520 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
521 "_GTK2_ADD_TARGET_INCLUDE_DIRS( ${_var} )")
524 string(TOLOWER "${_var}" _basename)
526 if(TARGET GTK2::${_basename})
527 foreach(_include ${ARGN})
528 set_property(TARGET GTK2::${_basename} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${_include}")
533 #=============================================================
535 # Internal function to create targets for GTK2
536 # _var = target to create
537 #=============================================================
538 function(_GTK2_ADD_TARGET _var)
540 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
541 "_GTK2_ADD_TARGET( ${_var} )")
544 string(TOLOWER "${_var}" _basename)
546 cmake_parse_arguments(_${_var} "" "" "GTK2_DEPENDS;GTK2_OPTIONAL_DEPENDS;OPTIONAL_INCLUDES" ${ARGN})
548 if(GTK2_${_var}_FOUND)
549 if(NOT TARGET GTK2::${_basename})
550 # Do not create the target if dependencies are missing
551 foreach(_dep ${_${_var}_GTK2_DEPENDS})
552 if(NOT TARGET GTK2::${_dep})
557 add_library(GTK2::${_basename} UNKNOWN IMPORTED)
559 if(GTK2_${_var}_LIBRARY_RELEASE)
560 set_property(TARGET GTK2::${_basename} APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
561 set_property(TARGET GTK2::${_basename} PROPERTY IMPORTED_LOCATION_RELEASE "${GTK2_${_var}_LIBRARY_RELEASE}" )
564 if(GTK2_${_var}_LIBRARY_DEBUG)
565 set_property(TARGET GTK2::${_basename} APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
566 set_property(TARGET GTK2::${_basename} PROPERTY IMPORTED_LOCATION_DEBUG "${GTK2_${_var}_LIBRARY_DEBUG}" )
569 if(GTK2_${_var}_INCLUDE_DIR)
570 set_property(TARGET GTK2::${_basename} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${GTK2_${_var}_INCLUDE_DIR}")
573 if(GTK2_${_var}CONFIG_INCLUDE_DIR AND NOT "x${GTK2_${_var}CONFIG_INCLUDE_DIR}" STREQUAL "x${GTK2_${_var}_INCLUDE_DIR}")
574 set_property(TARGET GTK2::${_basename} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${GTK2_${_var}CONFIG_INCLUDE_DIR}")
578 set_property(TARGET GTK2::${_basename} PROPERTY INTERFACE_COMPILE_DEFINITIONS "${GTK2_DEFINITIONS}")
581 if(_${_var}_GTK2_DEPENDS)
582 _GTK2_ADD_TARGET_DEPENDS(${_var} ${_${_var}_GTK2_DEPENDS} ${_${_var}_GTK2_OPTIONAL_DEPENDS})
585 if(_${_var}_OPTIONAL_INCLUDES)
586 foreach(_D ${_${_var}_OPTIONAL_INCLUDES})
588 _GTK2_ADD_TARGET_INCLUDE_DIRS(${_var} ${_D})
594 set(GTK2_TARGETS ${GTK2_TARGETS} GTK2::${_basename})
595 set(GTK2_TARGETS ${GTK2_TARGETS} PARENT_SCOPE)
597 if(GTK2_USE_IMPORTED_TARGETS)
598 set(GTK2_${_var}_LIBRARY GTK2::${_basename} PARENT_SCOPE)
606 #=============================================================
613 set(GTK2_INCLUDE_DIRS)
616 set(GTK2_DEFINITIONS)
618 if(NOT GTK2_FIND_COMPONENTS)
619 # Assume they only want GTK
620 set(GTK2_FIND_COMPONENTS gtk)
623 # Retrieve LIBDIR from the GTK2 and GLIB2 pkg-config files, which are
624 # used to compute the arch-specific include prefixes. While at it,
625 # also retrieve their INCLUDEDIR, to accommodate non-standard layouts.
626 find_package(PkgConfig QUIET)
628 pkg_check_modules(PC_GTK2 QUIET gtk+-2.0)
630 pkg_get_variable(PC_GTK2_INCLUDEDIR gtk+-2.0 includedir)
631 pkg_get_variable(PC_GTK2_LIBDIR gtk+-2.0 libdir)
633 pkg_check_modules(PC_GLIB2 QUIET glib-2.0)
635 pkg_get_variable(PC_GLIB2_INCLUDEDIR glib-2.0 includedir)
636 pkg_get_variable(PC_GLIB2_LIBDIR glib-2.0 libdir)
641 # If specified, enforce version number
643 if(GTK2_FIND_VERSION)
644 set(GTK2_FAILED_VERSION_CHECK true)
646 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] "
647 "Searching for version ${GTK2_FIND_VERSION}")
649 _GTK2_FIND_INCLUDE_DIR(GTK gtk/gtk.h)
650 if(GTK2_GTK_INCLUDE_DIR)
651 _GTK2_GET_VERSION(GTK2_MAJOR_VERSION
654 ${GTK2_GTK_INCLUDE_DIR}/gtk/gtkversion.h)
656 ${GTK2_MAJOR_VERSION}.${GTK2_MINOR_VERSION}.${GTK2_PATCH_VERSION})
657 if(GTK2_FIND_VERSION_EXACT)
658 if(GTK2_VERSION VERSION_EQUAL GTK2_FIND_VERSION)
659 set(GTK2_FAILED_VERSION_CHECK false)
662 if(GTK2_VERSION VERSION_EQUAL GTK2_FIND_VERSION OR
663 GTK2_VERSION VERSION_GREATER GTK2_FIND_VERSION)
664 set(GTK2_FAILED_VERSION_CHECK false)
668 # If we can't find the GTK include dir, we can't do version checking
669 if(GTK2_FIND_REQUIRED AND NOT GTK2_FIND_QUIETLY)
670 message(FATAL_ERROR "Could not find GTK2 include directory")
675 if(GTK2_FAILED_VERSION_CHECK)
676 if(GTK2_FIND_REQUIRED AND NOT GTK2_FIND_QUIETLY)
677 if(GTK2_FIND_VERSION_EXACT)
678 message(FATAL_ERROR "GTK2 version check failed. Version ${GTK2_VERSION} was found, version ${GTK2_FIND_VERSION} is needed exactly.")
680 message(FATAL_ERROR "GTK2 version check failed. Version ${GTK2_VERSION} was found, at least version ${GTK2_FIND_VERSION} is required")
684 # If the version check fails, exit out of the module here
690 # On MSVC, according to https://wiki.gnome.org/gtkmm/MSWindows, the /vd2 flag needs to be
691 # passed to the compiler in order to use gtkmm
694 foreach(_GTK2_component ${GTK2_FIND_COMPONENTS})
695 if(_GTK2_component STREQUAL "gtkmm")
696 set(GTK2_DEFINITIONS "/vd2")
697 elseif(_GTK2_component STREQUAL "glademm")
698 set(GTK2_DEFINITIONS "/vd2")
704 # Find all components
707 find_package(Freetype QUIET)
708 if(FREETYPE_INCLUDE_DIR_ft2build AND FREETYPE_INCLUDE_DIR_freetype2)
709 list(APPEND GTK2_INCLUDE_DIRS ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2})
712 foreach(_GTK2_component ${GTK2_FIND_COMPONENTS})
713 if(_GTK2_component STREQUAL "gtk")
714 # Left for compatibility with previous versions.
715 _GTK2_FIND_INCLUDE_DIR(FONTCONFIG fontconfig/fontconfig.h)
716 _GTK2_FIND_INCLUDE_DIR(X11 X11/Xlib.h)
718 _GTK2_FIND_INCLUDE_DIR(GLIB glib.h)
719 _GTK2_FIND_INCLUDE_DIR(GLIBCONFIG glibconfig.h)
720 _GTK2_FIND_LIBRARY (GLIB glib false true)
721 _GTK2_ADD_TARGET (GLIB)
723 _GTK2_FIND_INCLUDE_DIR(GOBJECT glib-object.h)
724 _GTK2_FIND_LIBRARY (GOBJECT gobject false true)
725 _GTK2_ADD_TARGET (GOBJECT GTK2_DEPENDS glib)
727 _GTK2_FIND_INCLUDE_DIR(ATK atk/atk.h)
728 _GTK2_FIND_LIBRARY (ATK atk false true)
729 _GTK2_ADD_TARGET (ATK GTK2_DEPENDS gobject glib)
731 _GTK2_FIND_LIBRARY (GIO gio false true)
732 _GTK2_ADD_TARGET (GIO GTK2_DEPENDS gobject glib)
734 _GTK2_FIND_LIBRARY (GTHREAD gthread false true)
735 _GTK2_ADD_TARGET (GTHREAD GTK2_DEPENDS glib)
737 _GTK2_FIND_LIBRARY (GMODULE gmodule false true)
738 _GTK2_ADD_TARGET (GMODULE GTK2_DEPENDS glib)
740 _GTK2_FIND_INCLUDE_DIR(GDK_PIXBUF gdk-pixbuf/gdk-pixbuf.h)
741 _GTK2_FIND_LIBRARY (GDK_PIXBUF gdk_pixbuf false true)
742 _GTK2_ADD_TARGET (GDK_PIXBUF GTK2_DEPENDS gobject glib)
744 _GTK2_FIND_INCLUDE_DIR(CAIRO cairo.h)
745 _GTK2_FIND_LIBRARY (CAIRO cairo false false)
746 _GTK2_ADD_TARGET (CAIRO)
748 _GTK2_FIND_INCLUDE_DIR(HARFBUZZ hb.h)
749 _GTK2_FIND_LIBRARY (HARFBUZZ harfbuzz false false)
750 _GTK2_ADD_TARGET (HARFBUZZ)
752 _GTK2_FIND_INCLUDE_DIR(PANGO pango/pango.h)
753 _GTK2_FIND_LIBRARY (PANGO pango false true)
754 _GTK2_ADD_TARGET (PANGO GTK2_DEPENDS gobject glib
755 GTK2_OPTIONAL_DEPENDS harfbuzz)
757 _GTK2_FIND_LIBRARY (PANGOCAIRO pangocairo false true)
758 _GTK2_ADD_TARGET (PANGOCAIRO GTK2_DEPENDS pango cairo gobject glib)
760 _GTK2_FIND_LIBRARY (PANGOFT2 pangoft2 false true)
761 _GTK2_ADD_TARGET (PANGOFT2 GTK2_DEPENDS pango gobject glib
762 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}
763 ${GTK2_FONTCONFIG_INCLUDE_DIR}
764 ${GTK2_X11_INCLUDE_DIR})
766 _GTK2_FIND_LIBRARY (PANGOXFT pangoxft false true)
767 _GTK2_ADD_TARGET (PANGOXFT GTK2_DEPENDS pangoft2 pango gobject glib
768 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}
769 ${GTK2_FONTCONFIG_INCLUDE_DIR}
770 ${GTK2_X11_INCLUDE_DIR})
772 _GTK2_FIND_INCLUDE_DIR(GDK gdk/gdk.h)
773 _GTK2_FIND_INCLUDE_DIR(GDKCONFIG gdkconfig.h)
776 _GTK2_FIND_LIBRARY (GDK gdk-quartz false true)
778 _GTK2_FIND_LIBRARY (GDK gdk-x11 false true)
780 _GTK2_FIND_LIBRARY (GDK gdk-win32 false true)
782 _GTK2_ADD_TARGET (GDK GTK2_DEPENDS pango gdk_pixbuf gobject glib
783 GTK2_OPTIONAL_DEPENDS pangocairo cairo)
785 _GTK2_FIND_INCLUDE_DIR(GTK gtk/gtk.h)
788 _GTK2_FIND_LIBRARY (GTK gtk-quartz false true)
790 _GTK2_FIND_LIBRARY (GTK gtk-x11 false true)
792 _GTK2_FIND_LIBRARY (GTK gtk-win32 false true)
794 _GTK2_ADD_TARGET (GTK GTK2_DEPENDS gdk atk pangoft2 pango gdk_pixbuf gthread gobject glib
795 GTK2_OPTIONAL_DEPENDS gio pangocairo cairo)
797 elseif(_GTK2_component STREQUAL "gtkmm")
799 _GTK2_FIND_INCLUDE_DIR(SIGC++ sigc++/sigc++.h)
800 _GTK2_FIND_INCLUDE_DIR(SIGC++CONFIG sigc++config.h)
801 _GTK2_FIND_LIBRARY (SIGC++ sigc true true)
802 _GTK2_ADD_TARGET (SIGC++)
803 # Since sigc++ 2.5.1 c++11 support is required
804 if(GTK2_SIGC++CONFIG_INCLUDE_DIR)
805 _GTK2_SIGCXX_GET_VERSION(GTK2_SIGC++_VERSION_MAJOR
806 GTK2_SIGC++_VERSION_MINOR
807 GTK2_SIGC++_VERSION_MICRO
808 ${GTK2_SIGC++CONFIG_INCLUDE_DIR}/sigc++config.h)
809 if(NOT ${GTK2_SIGC++_VERSION_MAJOR}.${GTK2_SIGC++_VERSION_MINOR}.${GTK2_SIGC++_VERSION_MICRO} VERSION_LESS 2.5.1)
810 # These are the features needed by clients in order to include the
812 set_property(TARGET GTK2::sigc++
813 PROPERTY INTERFACE_COMPILE_FEATURES cxx_alias_templates
816 cxx_deleted_functions
819 cxx_right_angle_brackets
820 cxx_rvalue_references
821 cxx_variadic_templates)
825 _GTK2_FIND_INCLUDE_DIR(GLIBMM glibmm.h)
826 _GTK2_FIND_INCLUDE_DIR(GLIBMMCONFIG glibmmconfig.h)
827 _GTK2_FIND_LIBRARY (GLIBMM glibmm true true)
828 _GTK2_ADD_TARGET (GLIBMM GTK2_DEPENDS gobject sigc++ glib)
830 _GTK2_FIND_INCLUDE_DIR(GIOMM giomm.h)
831 _GTK2_FIND_INCLUDE_DIR(GIOMMCONFIG giommconfig.h)
832 _GTK2_FIND_LIBRARY (GIOMM giomm true true)
833 _GTK2_ADD_TARGET (GIOMM GTK2_DEPENDS gio glibmm gobject sigc++ glib)
835 _GTK2_FIND_INCLUDE_DIR(ATKMM atkmm.h)
836 _GTK2_FIND_INCLUDE_DIR(ATKMMCONFIG atkmmconfig.h)
837 _GTK2_FIND_LIBRARY (ATKMM atkmm true true)
838 _GTK2_ADD_TARGET (ATKMM GTK2_DEPENDS atk glibmm gobject sigc++ glib)
840 _GTK2_FIND_INCLUDE_DIR(CAIROMM cairomm/cairomm.h)
841 _GTK2_FIND_INCLUDE_DIR(CAIROMMCONFIG cairommconfig.h)
842 _GTK2_FIND_LIBRARY (CAIROMM cairomm true true)
843 _GTK2_ADD_TARGET (CAIROMM GTK2_DEPENDS cairo sigc++
844 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}
845 ${GTK2_FONTCONFIG_INCLUDE_DIR}
846 ${GTK2_X11_INCLUDE_DIR})
848 _GTK2_FIND_INCLUDE_DIR(PANGOMM pangomm.h)
849 _GTK2_FIND_INCLUDE_DIR(PANGOMMCONFIG pangommconfig.h)
850 _GTK2_FIND_LIBRARY (PANGOMM pangomm true true)
851 _GTK2_ADD_TARGET (PANGOMM GTK2_DEPENDS glibmm sigc++ pango gobject glib
852 GTK2_OPTIONAL_DEPENDS cairomm pangocairo cairo
853 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}
854 ${GTK2_FONTCONFIG_INCLUDE_DIR}
855 ${GTK2_X11_INCLUDE_DIR})
857 _GTK2_FIND_INCLUDE_DIR(GDKMM gdkmm.h)
858 _GTK2_FIND_INCLUDE_DIR(GDKMMCONFIG gdkmmconfig.h)
859 _GTK2_FIND_LIBRARY (GDKMM gdkmm true true)
860 _GTK2_ADD_TARGET (GDKMM GTK2_DEPENDS pangomm gtk glibmm sigc++ gdk atk pangoft2 gdk_pixbuf pango gobject glib
861 GTK2_OPTIONAL_DEPENDS giomm cairomm gio pangocairo cairo
862 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}
863 ${GTK2_FONTCONFIG_INCLUDE_DIR}
864 ${GTK2_X11_INCLUDE_DIR})
866 _GTK2_FIND_INCLUDE_DIR(GTKMM gtkmm.h)
867 _GTK2_FIND_INCLUDE_DIR(GTKMMCONFIG gtkmmconfig.h)
868 _GTK2_FIND_LIBRARY (GTKMM gtkmm true true)
869 _GTK2_ADD_TARGET (GTKMM GTK2_DEPENDS atkmm gdkmm pangomm gtk glibmm sigc++ gdk atk pangoft2 gdk_pixbuf pango gthread gobject glib
870 GTK2_OPTIONAL_DEPENDS giomm cairomm gio pangocairo cairo
871 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}
872 ${GTK2_FONTCONFIG_INCLUDE_DIR}
873 ${GTK2_X11_INCLUDE_DIR})
875 elseif(_GTK2_component STREQUAL "glade")
877 _GTK2_FIND_INCLUDE_DIR(GLADE glade/glade.h)
878 _GTK2_FIND_LIBRARY (GLADE glade false true)
879 _GTK2_ADD_TARGET (GLADE GTK2_DEPENDS gtk gdk atk gio pangoft2 gdk_pixbuf pango gobject glib
880 GTK2_OPTIONAL_DEPENDS pangocairo cairo
881 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}
882 ${GTK2_FONTCONFIG_INCLUDE_DIR}
883 ${GTK2_X11_INCLUDE_DIR})
885 elseif(_GTK2_component STREQUAL "glademm")
887 _GTK2_FIND_INCLUDE_DIR(GLADEMM libglademm.h)
888 _GTK2_FIND_INCLUDE_DIR(GLADEMMCONFIG libglademmconfig.h)
889 _GTK2_FIND_LIBRARY (GLADEMM glademm true true)
890 _GTK2_ADD_TARGET (GLADEMM GTK2_DEPENDS gtkmm glade atkmm gdkmm giomm pangomm glibmm sigc++ gtk gdk atk pangoft2 gdk_pixbuf pango gthread gobject glib
891 GTK2_OPTIONAL_DEPENDS giomm cairomm gio pangocairo cairo
892 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}
893 ${GTK2_FONTCONFIG_INCLUDE_DIR}
894 ${GTK2_X11_INCLUDE_DIR})
897 message(FATAL_ERROR "Unknown GTK2 component ${_component}")
902 # Solve for the GTK2 version if we haven't already
904 if(NOT GTK2_FIND_VERSION AND GTK2_GTK_INCLUDE_DIR)
905 _GTK2_GET_VERSION(GTK2_MAJOR_VERSION
908 ${GTK2_GTK_INCLUDE_DIR}/gtk/gtkversion.h)
909 set(GTK2_VERSION ${GTK2_MAJOR_VERSION}.${GTK2_MINOR_VERSION}.${GTK2_PATCH_VERSION})
913 # Try to enforce components
916 set(_GTK2_did_we_find_everything true) # This gets set to GTK2_FOUND
918 include(FindPackageHandleStandardArgs)
920 foreach(_GTK2_component ${GTK2_FIND_COMPONENTS})
921 string(TOUPPER ${_GTK2_component} _COMPONENT_UPPER)
923 set(GTK2_${_COMPONENT_UPPER}_FIND_QUIETLY ${GTK2_FIND_QUIETLY})
925 set(FPHSA_NAME_MISMATCHED 1)
926 if(_GTK2_component STREQUAL "gtk")
927 find_package_handle_standard_args(GTK2_${_COMPONENT_UPPER} "Some or all of the gtk libraries were not found."
932 GTK2_GDKCONFIG_INCLUDE_DIR
935 GTK2_GLIB_INCLUDE_DIR
936 GTK2_GLIBCONFIG_INCLUDE_DIR
939 elseif(_GTK2_component STREQUAL "gtkmm")
940 find_package_handle_standard_args(GTK2_${_COMPONENT_UPPER} "Some or all of the gtkmm libraries were not found."
942 GTK2_GTKMM_INCLUDE_DIR
943 GTK2_GTKMMCONFIG_INCLUDE_DIR
945 GTK2_GDKMM_INCLUDE_DIR
946 GTK2_GDKMMCONFIG_INCLUDE_DIR
949 GTK2_GLIBMM_INCLUDE_DIR
950 GTK2_GLIBMMCONFIG_INCLUDE_DIR
953 FREETYPE_INCLUDE_DIR_ft2build
954 FREETYPE_INCLUDE_DIR_freetype2
956 elseif(_GTK2_component STREQUAL "glade")
957 find_package_handle_standard_args(GTK2_${_COMPONENT_UPPER} "The glade library was not found."
959 GTK2_GLADE_INCLUDE_DIR
961 elseif(_GTK2_component STREQUAL "glademm")
962 find_package_handle_standard_args(GTK2_${_COMPONENT_UPPER} "The glademm library was not found."
964 GTK2_GLADEMM_INCLUDE_DIR
965 GTK2_GLADEMMCONFIG_INCLUDE_DIR
968 unset(FPHSA_NAME_MISMATCHED)
970 if(NOT GTK2_${_COMPONENT_UPPER}_FOUND)
971 set(_GTK2_did_we_find_everything false)
975 if(GTK2_USE_IMPORTED_TARGETS)
976 set(GTK2_LIBRARIES ${GTK2_TARGETS})
980 if(_GTK2_did_we_find_everything AND NOT GTK2_VERSION_CHECK_FAILED)
983 # Unset our variables.
984 set(GTK2_FOUND false)
986 set(GTK2_VERSION_MAJOR)
987 set(GTK2_VERSION_MINOR)
988 set(GTK2_VERSION_PATCH)
989 set(GTK2_INCLUDE_DIRS)
992 set(GTK2_DEFINITIONS)
995 if(GTK2_INCLUDE_DIRS)
996 list(REMOVE_DUPLICATES GTK2_INCLUDE_DIRS)