395b8ea6b36fec05b5f4bf000aed314bda0ccc34
[WebKit-https.git] / Source / cmake / FindGTK.cmake
1 # - Try to find GTK+ 3.x or 4.x
2 #
3 # Copyright (C) 2012 Raphael Kubo da Costa <rakuco@webkit.org>
4 # Copyright (C) 2013, 2015, 2020 Igalia S.L.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1.  Redistributions of source code must retain the above copyright
10 #     notice, this list of conditions and the following disclaimer.
11 # 2.  Redistributions in binary form must reproduce the above copyright
12 #     notice, this list of conditions and the following disclaimer in the
13 #     documentation and/or other materials provided with the distribution.
14 #
15 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS
16 # IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
17 # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS
19 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
27 #[=======================================================================[.rst:
28 FindGTK
29 -------
30
31 Find GTK headers and libraries.
32
33 Imported Targets
34 ^^^^^^^^^^^^^^^^
35
36 ``GTK::GTK``
37   The GTK library, if found.
38
39 Result Variables
40 ^^^^^^^^^^^^^^^^
41
42 This will define the following variables in your project:
43
44 ``GTK_FOUND``
45   true if (the requested version of) GTK is available.
46 ``GTK_4``
47   whether GTK 4 was detected
48 ``GTK_3``
49   whether GTK 3 was detected
50 ``GTK_VERSION``
51   the version of GTK.
52 ``GTK_SUPPORTS_BROADWAY``
53   true if the Broadway target is built into GTK.
54 ``GTK_SUPPORTS_QUARTZ``
55   true if the Quartz target is built into GTK.
56 ``GTK_SUPPORTS_WAYLAND``
57   true if the Wayland target is built into GTK.
58 ``GTK_SUPPORTS_WIN32``
59   true if the Windows target is built into GTK.
60 ``GTK_SUPPORTS_X11``
61   true if the X11 target is built into GTK.
62
63 #]=======================================================================]
64
65 if (NOT DEFINED GTK_FIND_VERSION)
66     message(FATAL_ERROR "No GTK version specified")
67 endif ()
68
69 if (GTK_FIND_VERSION VERSION_LESS 3.90)
70     set(GTK_PC_MODULE "gtk+-3.0")
71     set(GTK_4 FALSE)
72     set(GTK_3 TRUE)
73 else ()
74     set(GTK_PC_MODULE "gtk4")
75     set(GTK_4 TRUE)
76     set(GTK_3 FALSE)
77 endif ()
78
79 find_package(PkgConfig QUIET)
80 pkg_check_modules(GTK IMPORTED_TARGET ${GTK_PC_MODULE})
81
82 set(GTK_VERSION_OK TRUE)
83 if (GTK_VERSION)
84     if (GTK_FIND_VERSION_EXACT)
85         if (NOT("${GTK_FIND_VERSION}" VERSION_EQUAL "${GTK_VERSION}"))
86             set(GTK_VERSION_OK FALSE)
87         endif ()
88     else ()
89         if ("${GTK_VERSION}" VERSION_LESS "${GTK_FIND_VERSION}")
90             set(GTK_VERSION_OK FALSE)
91         endif ()
92     endif ()
93 endif ()
94
95 # Set all the GTK_SUPPORTS_<target> variables to FALSE initially.
96 foreach (gtk_target broadway quartz wayland win32 x11)
97     string(TOUPPER "GTK_SUPPORTS_${gtk_target}" gtk_target)
98     set(${gtk_target} FALSE)
99 endforeach ()
100
101 if (GTK_VERSION AND GTK_VERSION_OK)
102     # Fetch the "targets" variable and set GTK_SUPPORTS_<target>.
103     pkg_get_variable(GTK_TARGETS ${GTK_PC_MODULE} targets)
104     separate_arguments(GTK_TARGETS)
105     foreach (gtk_target ${GTK_TARGETS})
106         string(TOUPPER "GTK_SUPPORTS_${gtk_target}" gtk_target)
107         set(${gtk_target} TRUE)
108     endforeach ()
109 endif ()
110
111 if (TARGET PkgConfig::GTK AND NOT TARGET GTK::GTK)
112     add_library(GTK::GTK INTERFACE IMPORTED GLOBAL)
113     set_property(TARGET GTK::GTK PROPERTY
114         INTERFACE_LINK_LIBRARIES PkgConfig::GTK
115     )
116 endif ()
117
118 include(FindPackageHandleStandardArgs)
119 FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK DEFAULT_MSG GTK_VERSION GTK_VERSION_OK)