1# Distributed under the OSI-approved BSD 3-Clause License. See accompanying 2# file Copyright.txt or https://cmake.org/licensing for details. 3 4#[=======================================================================[.rst: 5FindGTK2 6-------- 7 8Find the GTK2 widget libraries and several of its other optional components 9like ``gtkmm``, ``glade``, and ``glademm``. 10 11Specify one or more of the following components as you call this find 12module. See example below. 13 14* ``gtk`` 15* ``gtkmm`` 16* ``glade`` 17* ``glademm`` 18 19Imported Targets 20^^^^^^^^^^^^^^^^ 21 22This module defines the following :prop_tgt:`IMPORTED` targets (subject to 23component selection): 24 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``. 32 33.. versionadded:: 3.16.7 34 Added the ``GTK2::harfbuzz`` target. 35 36Result Variables 37^^^^^^^^^^^^^^^^ 38 39The following variables will be defined for your use 40 41``GTK2_FOUND`` 42 Were all of your specified components found? 43``GTK2_INCLUDE_DIRS`` 44 All include directories 45``GTK2_LIBRARIES`` 46 All libraries 47``GTK2_TARGETS`` 48 .. versionadded:: 3.5 49 All imported targets 50``GTK2_DEFINITIONS`` 51 Additional compiler flags 52``GTK2_VERSION`` 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 60 61.. versionadded:: 3.5 62 When ``GTK2_USE_IMPORTED_TARGETS`` is set to ``TRUE``, ``GTK2_LIBRARIES`` 63 will list imported targets instead of library paths. 64 65Input Variables 66^^^^^^^^^^^^^^^ 67 68Optional variables you can define prior to calling this module: 69 70``GTK2_DEBUG`` 71 Enables verbose debugging of the module 72``GTK2_ADDITIONAL_SUFFIXES`` 73 Allows defining additional directories to search for include files 74 75Example Usage 76^^^^^^^^^^^^^ 77 78Call :command:`find_package` once. Here are some examples to pick from: 79 80Require GTK 2.6 or later: 81 82.. code-block:: cmake 83 84 find_package(GTK2 2.6 REQUIRED gtk) 85 86Require GTK 2.10 or later and Glade: 87 88.. code-block:: cmake 89 90 find_package(GTK2 2.10 REQUIRED gtk glade) 91 92Search for GTK/GTKMM 2.8 or later: 93 94.. code-block:: cmake 95 96 find_package(GTK2 2.8 COMPONENTS gtk gtkmm) 97 98Use the results: 99 100.. code-block:: cmake 101 102 if(GTK2_FOUND) 103 include_directories(${GTK2_INCLUDE_DIRS}) 104 add_executable(mygui mygui.cc) 105 target_link_libraries(mygui ${GTK2_LIBRARIES}) 106 endif() 107#]=======================================================================] 108 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 118# (i.e. MSVC) 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 127# multiarch systems. 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 145# future). 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 165 166#============================================================= 167# _GTK2_GET_VERSION 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#============================================================= 174 175include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake) 176 177function(_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]+") 179 if(_contents) 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}") 183 184 if(NOT ${_OUT_major} MATCHES "[0-9]+") 185 message(FATAL_ERROR "Version parsing failed for GTK2_MAJOR_VERSION!") 186 endif() 187 if(NOT ${_OUT_minor} MATCHES "[0-9]+") 188 message(FATAL_ERROR "Version parsing failed for GTK2_MINOR_VERSION!") 189 endif() 190 if(NOT ${_OUT_micro} MATCHES "[0-9]+") 191 message(FATAL_ERROR "Version parsing failed for GTK2_MICRO_VERSION!") 192 endif() 193 194 set(${_OUT_major} ${${_OUT_major}} PARENT_SCOPE) 195 set(${_OUT_minor} ${${_OUT_minor}} PARENT_SCOPE) 196 set(${_OUT_micro} ${${_OUT_micro}} PARENT_SCOPE) 197 else() 198 message(FATAL_ERROR "Include file ${_gtkversion_hdr} does not exist") 199 endif() 200endfunction() 201 202 203#============================================================= 204# _GTK2_SIGCXX_GET_VERSION 205# Internal function to parse the version number in 206# sigc++config.h 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#============================================================= 212 213function(_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]+") 215 if(_contents) 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}") 219 220 if(NOT ${_OUT_major} MATCHES "[0-9]+") 221 message(FATAL_ERROR "Version parsing failed for SIGCXX_MAJOR_VERSION!") 222 endif() 223 if(NOT ${_OUT_minor} MATCHES "[0-9]+") 224 message(FATAL_ERROR "Version parsing failed for SIGCXX_MINOR_VERSION!") 225 endif() 226 if(NOT ${_OUT_micro} MATCHES "[0-9]+") 227 message(FATAL_ERROR "Version parsing failed for SIGCXX_MICRO_VERSION!") 228 endif() 229 230 set(${_OUT_major} ${${_OUT_major}} PARENT_SCOPE) 231 set(${_OUT_minor} ${${_OUT_minor}} PARENT_SCOPE) 232 set(${_OUT_micro} ${${_OUT_micro}} PARENT_SCOPE) 233 else() 234 # The header does not have the version macros; assume it is ``0.0.0``. 235 set(${_OUT_major} 0) 236 set(${_OUT_minor} 0) 237 set(${_OUT_micro} 0) 238 endif() 239endfunction() 240 241 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#============================================================= 248function(_GTK2_FIND_INCLUDE_DIR _var _hdr) 249 250 if(GTK2_DEBUG) 251 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] " 252 "_GTK2_FIND_INCLUDE_DIR( ${_var} ${_hdr} )") 253 endif() 254 255 set(_gtk_packages 256 # If these ever change, things will break. 257 ${GTK2_ADDITIONAL_SUFFIXES} 258 glibmm-2.4 259 glib-2.0 260 atk-1.0 261 atkmm-1.6 262 cairo 263 cairomm-1.0 264 gdk-pixbuf-2.0 265 gdkmm-2.4 266 giomm-2.4 267 gtk-2.0 268 gtkmm-2.4 269 libglade-2.0 270 libglademm-2.4 271 harfbuzz 272 pango-1.0 273 pangomm-1.4 274 sigc++-2.0 275 ) 276 277 # 278 # NOTE: The following suffixes cause searching for header files in both of 279 # these directories: 280 # /usr/include/<pkg> 281 # /usr/lib/<pkg>/include 282 # 283 284 set(_suffixes) 285 foreach(_d ${_gtk_packages}) 286 list(APPEND _suffixes ${_d}) 287 list(APPEND _suffixes ${_d}/include) # for /usr/lib/gtk-2.0/include 288 endforeach() 289 290 if(GTK2_DEBUG) 291 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] " 292 "include suffixes = ${_suffixes}") 293 endif() 294 295 if(CMAKE_LIBRARY_ARCHITECTURE) 296 set(_gtk2_arch_dir /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}) 297 if(GTK2_DEBUG) 298 message(STATUS "Adding ${_gtk2_arch_dir} to search path for multiarch support") 299 endif() 300 endif() 301 find_path(GTK2_${_var}_INCLUDE_DIR ${_hdr} 302 PATHS 303 ${_gtk2_arch_dir} 304 /usr/local/libx32 305 /usr/local/lib64 306 /usr/local/lib 307 /usr/libx32 308 /usr/lib64 309 /usr/lib 310 /opt/gnome/include 311 /opt/gnome/lib 312 /opt/openwin/include 313 /usr/openwin/lib 314 /sw/lib 315 /opt/local/lib 316 /usr/pkg/lib 317 /usr/pkg/include/glib 318 $ENV{GTKMM_BASEPATH}/include 319 $ENV{GTKMM_BASEPATH}/lib 320 [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/include 321 [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/lib 322 [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/include 323 [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib 324 PATH_SUFFIXES 325 ${_suffixes} 326 ) 327 mark_as_advanced(GTK2_${_var}_INCLUDE_DIR) 328 329 if(GTK2_${_var}_INCLUDE_DIR) 330 set(GTK2_INCLUDE_DIRS ${GTK2_INCLUDE_DIRS} ${GTK2_${_var}_INCLUDE_DIR} PARENT_SCOPE) 331 endif() 332 333endfunction() 334 335#============================================================= 336# _GTK2_FIND_LIBRARY 337# Internal function to find libraries packaged with GTK2 338# _var = library variable to create (_LIBRARY is appended) 339#============================================================= 340function(_GTK2_FIND_LIBRARY _var _lib _expand_vc _append_version) 341 342 if(GTK2_DEBUG) 343 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] " 344 "_GTK2_FIND_LIBRARY( ${_var} ${_lib} ${_expand_vc} ${_append_version} )") 345 endif() 346 347 # Not GTK versions per se but the versions encoded into Windows 348 # import libraries (GtkMM 2.14.1 has a gtkmm-vc80-2_4.lib for example) 349 # Also the MSVC libraries use _ for . (this is handled below) 350 set(_versions 2.20 2.18 2.16 2.14 2.12 351 2.10 2.8 2.6 2.4 2.2 2.0 352 1.20 1.18 1.16 1.14 1.12 353 1.10 1.8 1.6 1.4 1.2 1.0) 354 355 set(_library) 356 set(_library_d) 357 358 set(_library ${_lib}) 359 360 if(_expand_vc AND MSVC) 361 # Add vc80/vc90/vc100 midfixes 362 if(MSVC_TOOLSET_VERSION LESS 110) 363 set(_library ${_library}-vc${MSVC_TOOLSET_VERSION}) 364 else() 365 # Up to gtkmm-win 2.22.0-2 there are no vc110 libraries but vc100 can be used 366 set(_library ${_library}-vc100) 367 endif() 368 set(_library_d ${_library}-d) 369 endif() 370 371 if(GTK2_DEBUG) 372 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] " 373 "After midfix addition = ${_library} and ${_library_d}") 374 endif() 375 376 set(_lib_list) 377 set(_libd_list) 378 if(_append_version) 379 foreach(_ver ${_versions}) 380 list(APPEND _lib_list "${_library}-${_ver}") 381 list(APPEND _libd_list "${_library_d}-${_ver}") 382 endforeach() 383 else() 384 set(_lib_list ${_library}) 385 set(_libd_list ${_library_d}) 386 endif() 387 388 if(GTK2_DEBUG) 389 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] " 390 "library list = ${_lib_list} and library debug list = ${_libd_list}") 391 endif() 392 393 # For some silly reason the MSVC libraries use _ instead of . 394 # in the version fields 395 if(_expand_vc AND MSVC) 396 set(_no_dots_lib_list) 397 set(_no_dots_libd_list) 398 foreach(_l ${_lib_list}) 399 string(REPLACE "." "_" _no_dots_library ${_l}) 400 list(APPEND _no_dots_lib_list ${_no_dots_library}) 401 endforeach() 402 # And for debug 403 set(_no_dots_libsd_list) 404 foreach(_l ${_libd_list}) 405 string(REPLACE "." "_" _no_dots_libraryd ${_l}) 406 list(APPEND _no_dots_libd_list ${_no_dots_libraryd}) 407 endforeach() 408 409 # Copy list back to original names 410 set(_lib_list ${_no_dots_lib_list}) 411 set(_libd_list ${_no_dots_libd_list}) 412 endif() 413 414 if(GTK2_DEBUG) 415 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] " 416 "While searching for GTK2_${_var}_LIBRARY, our proposed library list is ${_lib_list}") 417 endif() 418 419 find_library(GTK2_${_var}_LIBRARY_RELEASE 420 NAMES ${_lib_list} 421 PATHS 422 /opt/gnome/lib 423 /usr/openwin/lib 424 $ENV{GTKMM_BASEPATH}/lib 425 [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/lib 426 [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib 427 ) 428 429 if(_expand_vc AND MSVC) 430 if(GTK2_DEBUG) 431 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] " 432 "While searching for GTK2_${_var}_LIBRARY_DEBUG our proposed library list is ${_libd_list}") 433 endif() 434 435 find_library(GTK2_${_var}_LIBRARY_DEBUG 436 NAMES ${_libd_list} 437 PATHS 438 $ENV{GTKMM_BASEPATH}/lib 439 [HKEY_CURRENT_USER\\SOFTWARE\\gtkmm\\2.4;Path]/lib 440 [HKEY_LOCAL_MACHINE\\SOFTWARE\\gtkmm\\2.4;Path]/lib 441 ) 442 endif() 443 444 select_library_configurations(GTK2_${_var}) 445 446 set(GTK2_${_var}_LIBRARY ${GTK2_${_var}_LIBRARY} PARENT_SCOPE) 447 set(GTK2_${_var}_FOUND ${GTK2_${_var}_FOUND} PARENT_SCOPE) 448 449 if(GTK2_${_var}_FOUND) 450 set(GTK2_LIBRARIES ${GTK2_LIBRARIES} ${GTK2_${_var}_LIBRARY}) 451 set(GTK2_LIBRARIES ${GTK2_LIBRARIES} PARENT_SCOPE) 452 endif() 453 454 if(GTK2_DEBUG) 455 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] " 456 "GTK2_${_var}_LIBRARY_RELEASE = \"${GTK2_${_var}_LIBRARY_RELEASE}\"") 457 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] " 458 "GTK2_${_var}_LIBRARY_DEBUG = \"${GTK2_${_var}_LIBRARY_DEBUG}\"") 459 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] " 460 "GTK2_${_var}_LIBRARY = \"${GTK2_${_var}_LIBRARY}\"") 461 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] " 462 "GTK2_${_var}_FOUND = \"${GTK2_${_var}_FOUND}\"") 463 endif() 464 465endfunction() 466 467 468function(_GTK2_ADD_TARGET_DEPENDS_INTERNAL _var _property) 469 if(GTK2_DEBUG) 470 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] " 471 "_GTK2_ADD_TARGET_DEPENDS_INTERNAL( ${_var} ${_property} )") 472 endif() 473 474 string(TOLOWER "${_var}" _basename) 475 476 if (TARGET GTK2::${_basename}) 477 foreach(_depend ${ARGN}) 478 set(_valid_depends) 479 if (TARGET GTK2::${_depend}) 480 list(APPEND _valid_depends GTK2::${_depend}) 481 endif() 482 if (_valid_depends) 483 set_property(TARGET GTK2::${_basename} APPEND PROPERTY ${_property} "${_valid_depends}") 484 endif() 485 set(_valid_depends) 486 endforeach() 487 endif() 488endfunction() 489 490function(_GTK2_ADD_TARGET_DEPENDS _var) 491 if(GTK2_DEBUG) 492 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] " 493 "_GTK2_ADD_TARGET_DEPENDS( ${_var} )") 494 endif() 495 496 string(TOLOWER "${_var}" _basename) 497 498 if(TARGET GTK2::${_basename}) 499 get_target_property(_configs GTK2::${_basename} IMPORTED_CONFIGURATIONS) 500 _GTK2_ADD_TARGET_DEPENDS_INTERNAL(${_var} INTERFACE_LINK_LIBRARIES ${ARGN}) 501 foreach(_config ${_configs}) 502 _GTK2_ADD_TARGET_DEPENDS_INTERNAL(${_var} IMPORTED_LINK_INTERFACE_LIBRARIES_${_config} ${ARGN}) 503 endforeach() 504 endif() 505endfunction() 506 507function(_GTK2_ADD_TARGET_INCLUDE_DIRS _var) 508 if(GTK2_DEBUG) 509 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] " 510 "_GTK2_ADD_TARGET_INCLUDE_DIRS( ${_var} )") 511 endif() 512 513 string(TOLOWER "${_var}" _basename) 514 515 if(TARGET GTK2::${_basename}) 516 foreach(_include ${ARGN}) 517 set_property(TARGET GTK2::${_basename} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${_include}") 518 endforeach() 519 endif() 520endfunction() 521 522#============================================================= 523# _GTK2_ADD_TARGET 524# Internal function to create targets for GTK2 525# _var = target to create 526#============================================================= 527function(_GTK2_ADD_TARGET _var) 528 if(GTK2_DEBUG) 529 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] " 530 "_GTK2_ADD_TARGET( ${_var} )") 531 endif() 532 533 string(TOLOWER "${_var}" _basename) 534 535 cmake_parse_arguments(_${_var} "" "" "GTK2_DEPENDS;GTK2_OPTIONAL_DEPENDS;OPTIONAL_INCLUDES" ${ARGN}) 536 537 if(GTK2_${_var}_FOUND) 538 if(NOT TARGET GTK2::${_basename}) 539 # Do not create the target if dependencies are missing 540 foreach(_dep ${_${_var}_GTK2_DEPENDS}) 541 if(NOT TARGET GTK2::${_dep}) 542 return() 543 endif() 544 endforeach() 545 546 add_library(GTK2::${_basename} UNKNOWN IMPORTED) 547 548 if(GTK2_${_var}_LIBRARY_RELEASE) 549 set_property(TARGET GTK2::${_basename} APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) 550 set_property(TARGET GTK2::${_basename} PROPERTY IMPORTED_LOCATION_RELEASE "${GTK2_${_var}_LIBRARY_RELEASE}" ) 551 endif() 552 553 if(GTK2_${_var}_LIBRARY_DEBUG) 554 set_property(TARGET GTK2::${_basename} APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) 555 set_property(TARGET GTK2::${_basename} PROPERTY IMPORTED_LOCATION_DEBUG "${GTK2_${_var}_LIBRARY_DEBUG}" ) 556 endif() 557 558 if(GTK2_${_var}_INCLUDE_DIR) 559 set_property(TARGET GTK2::${_basename} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${GTK2_${_var}_INCLUDE_DIR}") 560 endif() 561 562 if(GTK2_${_var}CONFIG_INCLUDE_DIR AND NOT "x${GTK2_${_var}CONFIG_INCLUDE_DIR}" STREQUAL "x${GTK2_${_var}_INCLUDE_DIR}") 563 set_property(TARGET GTK2::${_basename} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${GTK2_${_var}CONFIG_INCLUDE_DIR}") 564 endif() 565 566 if(GTK2_DEFINITIONS) 567 set_property(TARGET GTK2::${_basename} PROPERTY INTERFACE_COMPILE_DEFINITIONS "${GTK2_DEFINITIONS}") 568 endif() 569 570 if(_${_var}_GTK2_DEPENDS) 571 _GTK2_ADD_TARGET_DEPENDS(${_var} ${_${_var}_GTK2_DEPENDS} ${_${_var}_GTK2_OPTIONAL_DEPENDS}) 572 endif() 573 574 if(_${_var}_OPTIONAL_INCLUDES) 575 foreach(_D ${_${_var}_OPTIONAL_INCLUDES}) 576 if(_D) 577 _GTK2_ADD_TARGET_INCLUDE_DIRS(${_var} ${_D}) 578 endif() 579 endforeach() 580 endif() 581 endif() 582 583 set(GTK2_TARGETS ${GTK2_TARGETS} GTK2::${_basename}) 584 set(GTK2_TARGETS ${GTK2_TARGETS} PARENT_SCOPE) 585 586 if(GTK2_USE_IMPORTED_TARGETS) 587 set(GTK2_${_var}_LIBRARY GTK2::${_basename} PARENT_SCOPE) 588 endif() 589 590 endif() 591endfunction() 592 593 594 595#============================================================= 596 597# 598# main() 599# 600 601set(GTK2_FOUND) 602set(GTK2_INCLUDE_DIRS) 603set(GTK2_LIBRARIES) 604set(GTK2_TARGETS) 605set(GTK2_DEFINITIONS) 606 607if(NOT GTK2_FIND_COMPONENTS) 608 # Assume they only want GTK 609 set(GTK2_FIND_COMPONENTS gtk) 610endif() 611 612# 613# If specified, enforce version number 614# 615if(GTK2_FIND_VERSION) 616 set(GTK2_FAILED_VERSION_CHECK true) 617 if(GTK2_DEBUG) 618 message(STATUS "[FindGTK2.cmake:${CMAKE_CURRENT_LIST_LINE}] " 619 "Searching for version ${GTK2_FIND_VERSION}") 620 endif() 621 _GTK2_FIND_INCLUDE_DIR(GTK gtk/gtk.h) 622 if(GTK2_GTK_INCLUDE_DIR) 623 _GTK2_GET_VERSION(GTK2_MAJOR_VERSION 624 GTK2_MINOR_VERSION 625 GTK2_PATCH_VERSION 626 ${GTK2_GTK_INCLUDE_DIR}/gtk/gtkversion.h) 627 set(GTK2_VERSION 628 ${GTK2_MAJOR_VERSION}.${GTK2_MINOR_VERSION}.${GTK2_PATCH_VERSION}) 629 if(GTK2_FIND_VERSION_EXACT) 630 if(GTK2_VERSION VERSION_EQUAL GTK2_FIND_VERSION) 631 set(GTK2_FAILED_VERSION_CHECK false) 632 endif() 633 else() 634 if(GTK2_VERSION VERSION_EQUAL GTK2_FIND_VERSION OR 635 GTK2_VERSION VERSION_GREATER GTK2_FIND_VERSION) 636 set(GTK2_FAILED_VERSION_CHECK false) 637 endif() 638 endif() 639 else() 640 # If we can't find the GTK include dir, we can't do version checking 641 if(GTK2_FIND_REQUIRED AND NOT GTK2_FIND_QUIETLY) 642 message(FATAL_ERROR "Could not find GTK2 include directory") 643 endif() 644 return() 645 endif() 646 647 if(GTK2_FAILED_VERSION_CHECK) 648 if(GTK2_FIND_REQUIRED AND NOT GTK2_FIND_QUIETLY) 649 if(GTK2_FIND_VERSION_EXACT) 650 message(FATAL_ERROR "GTK2 version check failed. Version ${GTK2_VERSION} was found, version ${GTK2_FIND_VERSION} is needed exactly.") 651 else() 652 message(FATAL_ERROR "GTK2 version check failed. Version ${GTK2_VERSION} was found, at least version ${GTK2_FIND_VERSION} is required") 653 endif() 654 endif() 655 656 # If the version check fails, exit out of the module here 657 return() 658 endif() 659endif() 660 661# 662# On MSVC, according to https://wiki.gnome.org/gtkmm/MSWindows, the /vd2 flag needs to be 663# passed to the compiler in order to use gtkmm 664# 665if(MSVC) 666 foreach(_GTK2_component ${GTK2_FIND_COMPONENTS}) 667 if(_GTK2_component STREQUAL "gtkmm") 668 set(GTK2_DEFINITIONS "/vd2") 669 elseif(_GTK2_component STREQUAL "glademm") 670 set(GTK2_DEFINITIONS "/vd2") 671 endif() 672 endforeach() 673endif() 674 675# 676# Find all components 677# 678 679find_package(Freetype QUIET) 680if(FREETYPE_INCLUDE_DIR_ft2build AND FREETYPE_INCLUDE_DIR_freetype2) 681 list(APPEND GTK2_INCLUDE_DIRS ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2}) 682endif() 683 684foreach(_GTK2_component ${GTK2_FIND_COMPONENTS}) 685 if(_GTK2_component STREQUAL "gtk") 686 # Left for compatibility with previous versions. 687 _GTK2_FIND_INCLUDE_DIR(FONTCONFIG fontconfig/fontconfig.h) 688 _GTK2_FIND_INCLUDE_DIR(X11 X11/Xlib.h) 689 690 _GTK2_FIND_INCLUDE_DIR(GLIB glib.h) 691 _GTK2_FIND_INCLUDE_DIR(GLIBCONFIG glibconfig.h) 692 _GTK2_FIND_LIBRARY (GLIB glib false true) 693 _GTK2_ADD_TARGET (GLIB) 694 695 _GTK2_FIND_INCLUDE_DIR(GOBJECT glib-object.h) 696 _GTK2_FIND_LIBRARY (GOBJECT gobject false true) 697 _GTK2_ADD_TARGET (GOBJECT GTK2_DEPENDS glib) 698 699 _GTK2_FIND_INCLUDE_DIR(ATK atk/atk.h) 700 _GTK2_FIND_LIBRARY (ATK atk false true) 701 _GTK2_ADD_TARGET (ATK GTK2_DEPENDS gobject glib) 702 703 _GTK2_FIND_LIBRARY (GIO gio false true) 704 _GTK2_ADD_TARGET (GIO GTK2_DEPENDS gobject glib) 705 706 _GTK2_FIND_LIBRARY (GTHREAD gthread false true) 707 _GTK2_ADD_TARGET (GTHREAD GTK2_DEPENDS glib) 708 709 _GTK2_FIND_LIBRARY (GMODULE gmodule false true) 710 _GTK2_ADD_TARGET (GMODULE GTK2_DEPENDS glib) 711 712 _GTK2_FIND_INCLUDE_DIR(GDK_PIXBUF gdk-pixbuf/gdk-pixbuf.h) 713 _GTK2_FIND_LIBRARY (GDK_PIXBUF gdk_pixbuf false true) 714 _GTK2_ADD_TARGET (GDK_PIXBUF GTK2_DEPENDS gobject glib) 715 716 _GTK2_FIND_INCLUDE_DIR(CAIRO cairo.h) 717 _GTK2_FIND_LIBRARY (CAIRO cairo false false) 718 _GTK2_ADD_TARGET (CAIRO) 719 720 _GTK2_FIND_INCLUDE_DIR(HARFBUZZ hb.h) 721 _GTK2_FIND_LIBRARY (HARFBUZZ harfbuzz false false) 722 _GTK2_ADD_TARGET (HARFBUZZ) 723 724 _GTK2_FIND_INCLUDE_DIR(PANGO pango/pango.h) 725 _GTK2_FIND_LIBRARY (PANGO pango false true) 726 _GTK2_ADD_TARGET (PANGO GTK2_DEPENDS gobject glib 727 GTK2_OPTIONAL_DEPENDS harfbuzz) 728 729 _GTK2_FIND_LIBRARY (PANGOCAIRO pangocairo false true) 730 _GTK2_ADD_TARGET (PANGOCAIRO GTK2_DEPENDS pango cairo gobject glib) 731 732 _GTK2_FIND_LIBRARY (PANGOFT2 pangoft2 false true) 733 _GTK2_ADD_TARGET (PANGOFT2 GTK2_DEPENDS pango gobject glib 734 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2} 735 ${GTK2_FONTCONFIG_INCLUDE_DIR} 736 ${GTK2_X11_INCLUDE_DIR}) 737 738 _GTK2_FIND_LIBRARY (PANGOXFT pangoxft false true) 739 _GTK2_ADD_TARGET (PANGOXFT GTK2_DEPENDS pangoft2 pango gobject glib 740 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2} 741 ${GTK2_FONTCONFIG_INCLUDE_DIR} 742 ${GTK2_X11_INCLUDE_DIR}) 743 744 _GTK2_FIND_INCLUDE_DIR(GDK gdk/gdk.h) 745 _GTK2_FIND_INCLUDE_DIR(GDKCONFIG gdkconfig.h) 746 if(UNIX) 747 if(APPLE) 748 _GTK2_FIND_LIBRARY (GDK gdk-quartz false true) 749 endif() 750 _GTK2_FIND_LIBRARY (GDK gdk-x11 false true) 751 else() 752 _GTK2_FIND_LIBRARY (GDK gdk-win32 false true) 753 endif() 754 _GTK2_ADD_TARGET (GDK GTK2_DEPENDS pango gdk_pixbuf gobject glib 755 GTK2_OPTIONAL_DEPENDS pangocairo cairo) 756 757 _GTK2_FIND_INCLUDE_DIR(GTK gtk/gtk.h) 758 if(UNIX) 759 if(APPLE) 760 _GTK2_FIND_LIBRARY (GTK gtk-quartz false true) 761 endif() 762 _GTK2_FIND_LIBRARY (GTK gtk-x11 false true) 763 else() 764 _GTK2_FIND_LIBRARY (GTK gtk-win32 false true) 765 endif() 766 _GTK2_ADD_TARGET (GTK GTK2_DEPENDS gdk atk pangoft2 pango gdk_pixbuf gthread gobject glib 767 GTK2_OPTIONAL_DEPENDS gio pangocairo cairo) 768 769 elseif(_GTK2_component STREQUAL "gtkmm") 770 771 _GTK2_FIND_INCLUDE_DIR(SIGC++ sigc++/sigc++.h) 772 _GTK2_FIND_INCLUDE_DIR(SIGC++CONFIG sigc++config.h) 773 _GTK2_FIND_LIBRARY (SIGC++ sigc true true) 774 _GTK2_ADD_TARGET (SIGC++) 775 # Since sigc++ 2.5.1 c++11 support is required 776 if(GTK2_SIGC++CONFIG_INCLUDE_DIR) 777 _GTK2_SIGCXX_GET_VERSION(GTK2_SIGC++_VERSION_MAJOR 778 GTK2_SIGC++_VERSION_MINOR 779 GTK2_SIGC++_VERSION_MICRO 780 ${GTK2_SIGC++CONFIG_INCLUDE_DIR}/sigc++config.h) 781 if(NOT ${GTK2_SIGC++_VERSION_MAJOR}.${GTK2_SIGC++_VERSION_MINOR}.${GTK2_SIGC++_VERSION_MICRO} VERSION_LESS 2.5.1) 782 # These are the features needed by clients in order to include the 783 # project headers: 784 set_property(TARGET GTK2::sigc++ 785 PROPERTY INTERFACE_COMPILE_FEATURES cxx_alias_templates 786 cxx_auto_type 787 cxx_decltype 788 cxx_deleted_functions 789 cxx_noexcept 790 cxx_nullptr 791 cxx_right_angle_brackets 792 cxx_rvalue_references 793 cxx_variadic_templates) 794 endif() 795 endif() 796 797 _GTK2_FIND_INCLUDE_DIR(GLIBMM glibmm.h) 798 _GTK2_FIND_INCLUDE_DIR(GLIBMMCONFIG glibmmconfig.h) 799 _GTK2_FIND_LIBRARY (GLIBMM glibmm true true) 800 _GTK2_ADD_TARGET (GLIBMM GTK2_DEPENDS gobject sigc++ glib) 801 802 _GTK2_FIND_INCLUDE_DIR(GIOMM giomm.h) 803 _GTK2_FIND_INCLUDE_DIR(GIOMMCONFIG giommconfig.h) 804 _GTK2_FIND_LIBRARY (GIOMM giomm true true) 805 _GTK2_ADD_TARGET (GIOMM GTK2_DEPENDS gio glibmm gobject sigc++ glib) 806 807 _GTK2_FIND_INCLUDE_DIR(ATKMM atkmm.h) 808 _GTK2_FIND_INCLUDE_DIR(ATKMMCONFIG atkmmconfig.h) 809 _GTK2_FIND_LIBRARY (ATKMM atkmm true true) 810 _GTK2_ADD_TARGET (ATKMM GTK2_DEPENDS atk glibmm gobject sigc++ glib) 811 812 _GTK2_FIND_INCLUDE_DIR(CAIROMM cairomm/cairomm.h) 813 _GTK2_FIND_INCLUDE_DIR(CAIROMMCONFIG cairommconfig.h) 814 _GTK2_FIND_LIBRARY (CAIROMM cairomm true true) 815 _GTK2_ADD_TARGET (CAIROMM GTK2_DEPENDS cairo sigc++ 816 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2} 817 ${GTK2_FONTCONFIG_INCLUDE_DIR} 818 ${GTK2_X11_INCLUDE_DIR}) 819 820 _GTK2_FIND_INCLUDE_DIR(PANGOMM pangomm.h) 821 _GTK2_FIND_INCLUDE_DIR(PANGOMMCONFIG pangommconfig.h) 822 _GTK2_FIND_LIBRARY (PANGOMM pangomm true true) 823 _GTK2_ADD_TARGET (PANGOMM GTK2_DEPENDS glibmm sigc++ pango gobject glib 824 GTK2_OPTIONAL_DEPENDS cairomm pangocairo cairo 825 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2} 826 ${GTK2_FONTCONFIG_INCLUDE_DIR} 827 ${GTK2_X11_INCLUDE_DIR}) 828 829 _GTK2_FIND_INCLUDE_DIR(GDKMM gdkmm.h) 830 _GTK2_FIND_INCLUDE_DIR(GDKMMCONFIG gdkmmconfig.h) 831 _GTK2_FIND_LIBRARY (GDKMM gdkmm true true) 832 _GTK2_ADD_TARGET (GDKMM GTK2_DEPENDS pangomm gtk glibmm sigc++ gdk atk pangoft2 gdk_pixbuf pango gobject glib 833 GTK2_OPTIONAL_DEPENDS giomm cairomm gio pangocairo cairo 834 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2} 835 ${GTK2_FONTCONFIG_INCLUDE_DIR} 836 ${GTK2_X11_INCLUDE_DIR}) 837 838 _GTK2_FIND_INCLUDE_DIR(GTKMM gtkmm.h) 839 _GTK2_FIND_INCLUDE_DIR(GTKMMCONFIG gtkmmconfig.h) 840 _GTK2_FIND_LIBRARY (GTKMM gtkmm true true) 841 _GTK2_ADD_TARGET (GTKMM GTK2_DEPENDS atkmm gdkmm pangomm gtk glibmm sigc++ gdk atk pangoft2 gdk_pixbuf pango gthread gobject glib 842 GTK2_OPTIONAL_DEPENDS giomm cairomm gio pangocairo cairo 843 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2} 844 ${GTK2_FONTCONFIG_INCLUDE_DIR} 845 ${GTK2_X11_INCLUDE_DIR}) 846 847 elseif(_GTK2_component STREQUAL "glade") 848 849 _GTK2_FIND_INCLUDE_DIR(GLADE glade/glade.h) 850 _GTK2_FIND_LIBRARY (GLADE glade false true) 851 _GTK2_ADD_TARGET (GLADE GTK2_DEPENDS gtk gdk atk gio pangoft2 gdk_pixbuf pango gobject glib 852 GTK2_OPTIONAL_DEPENDS pangocairo cairo 853 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2} 854 ${GTK2_FONTCONFIG_INCLUDE_DIR} 855 ${GTK2_X11_INCLUDE_DIR}) 856 857 elseif(_GTK2_component STREQUAL "glademm") 858 859 _GTK2_FIND_INCLUDE_DIR(GLADEMM libglademm.h) 860 _GTK2_FIND_INCLUDE_DIR(GLADEMMCONFIG libglademmconfig.h) 861 _GTK2_FIND_LIBRARY (GLADEMM glademm true true) 862 _GTK2_ADD_TARGET (GLADEMM GTK2_DEPENDS gtkmm glade atkmm gdkmm giomm pangomm glibmm sigc++ gtk gdk atk pangoft2 gdk_pixbuf pango gthread gobject glib 863 GTK2_OPTIONAL_DEPENDS giomm cairomm gio pangocairo cairo 864 OPTIONAL_INCLUDES ${FREETYPE_INCLUDE_DIR_ft2build} ${FREETYPE_INCLUDE_DIR_freetype2} 865 ${GTK2_FONTCONFIG_INCLUDE_DIR} 866 ${GTK2_X11_INCLUDE_DIR}) 867 868 else() 869 message(FATAL_ERROR "Unknown GTK2 component ${_component}") 870 endif() 871endforeach() 872 873# 874# Solve for the GTK2 version if we haven't already 875# 876if(NOT GTK2_FIND_VERSION AND GTK2_GTK_INCLUDE_DIR) 877 _GTK2_GET_VERSION(GTK2_MAJOR_VERSION 878 GTK2_MINOR_VERSION 879 GTK2_PATCH_VERSION 880 ${GTK2_GTK_INCLUDE_DIR}/gtk/gtkversion.h) 881 set(GTK2_VERSION ${GTK2_MAJOR_VERSION}.${GTK2_MINOR_VERSION}.${GTK2_PATCH_VERSION}) 882endif() 883 884# 885# Try to enforce components 886# 887 888set(_GTK2_did_we_find_everything true) # This gets set to GTK2_FOUND 889 890include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) 891 892foreach(_GTK2_component ${GTK2_FIND_COMPONENTS}) 893 string(TOUPPER ${_GTK2_component} _COMPONENT_UPPER) 894 895 set(GTK2_${_COMPONENT_UPPER}_FIND_QUIETLY ${GTK2_FIND_QUIETLY}) 896 897 set(FPHSA_NAME_MISMATCHED 1) 898 if(_GTK2_component STREQUAL "gtk") 899 FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "Some or all of the gtk libraries were not found." 900 GTK2_GTK_LIBRARY 901 GTK2_GTK_INCLUDE_DIR 902 903 GTK2_GDK_INCLUDE_DIR 904 GTK2_GDKCONFIG_INCLUDE_DIR 905 GTK2_GDK_LIBRARY 906 907 GTK2_GLIB_INCLUDE_DIR 908 GTK2_GLIBCONFIG_INCLUDE_DIR 909 GTK2_GLIB_LIBRARY 910 ) 911 elseif(_GTK2_component STREQUAL "gtkmm") 912 FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "Some or all of the gtkmm libraries were not found." 913 GTK2_GTKMM_LIBRARY 914 GTK2_GTKMM_INCLUDE_DIR 915 GTK2_GTKMMCONFIG_INCLUDE_DIR 916 917 GTK2_GDKMM_INCLUDE_DIR 918 GTK2_GDKMMCONFIG_INCLUDE_DIR 919 GTK2_GDKMM_LIBRARY 920 921 GTK2_GLIBMM_INCLUDE_DIR 922 GTK2_GLIBMMCONFIG_INCLUDE_DIR 923 GTK2_GLIBMM_LIBRARY 924 925 FREETYPE_INCLUDE_DIR_ft2build 926 FREETYPE_INCLUDE_DIR_freetype2 927 ) 928 elseif(_GTK2_component STREQUAL "glade") 929 FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "The glade library was not found." 930 GTK2_GLADE_LIBRARY 931 GTK2_GLADE_INCLUDE_DIR 932 ) 933 elseif(_GTK2_component STREQUAL "glademm") 934 FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "The glademm library was not found." 935 GTK2_GLADEMM_LIBRARY 936 GTK2_GLADEMM_INCLUDE_DIR 937 GTK2_GLADEMMCONFIG_INCLUDE_DIR 938 ) 939 endif() 940 unset(FPHSA_NAME_MISMATCHED) 941 942 if(NOT GTK2_${_COMPONENT_UPPER}_FOUND) 943 set(_GTK2_did_we_find_everything false) 944 endif() 945endforeach() 946 947if(GTK2_USE_IMPORTED_TARGETS) 948 set(GTK2_LIBRARIES ${GTK2_TARGETS}) 949endif() 950 951 952if(_GTK2_did_we_find_everything AND NOT GTK2_VERSION_CHECK_FAILED) 953 set(GTK2_FOUND true) 954else() 955 # Unset our variables. 956 set(GTK2_FOUND false) 957 set(GTK2_VERSION) 958 set(GTK2_VERSION_MAJOR) 959 set(GTK2_VERSION_MINOR) 960 set(GTK2_VERSION_PATCH) 961 set(GTK2_INCLUDE_DIRS) 962 set(GTK2_LIBRARIES) 963 set(GTK2_TARGETS) 964 set(GTK2_DEFINITIONS) 965endif() 966 967if(GTK2_INCLUDE_DIRS) 968 list(REMOVE_DUPLICATES GTK2_INCLUDE_DIRS) 969endif() 970