[GTK][CMake] Make gtk-unix-print a component of FindGTK.cmake
[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 Optional Components
34 ^^^^^^^^^^^^^^^^^^^
35
36 The ``COMPONENTS`` (or ``OPTIONAL_COMPONENTS``) keyword can be passed to
37 ``find_package()``, the following GTK components can be searched for:
38
39 - ``unix-print``
40
41
42 Imported Targets
43 ^^^^^^^^^^^^^^^^
44
45 ``GTK::GTK``
46   The GTK library, if found.
47 ``GTK::UnixPrint``
48   The GTK unix-print library, if found.
49
50 Result Variables
51 ^^^^^^^^^^^^^^^^
52
53 This will define the following variables in your project:
54
55 ``GTK_FOUND``
56   true if (the requested version of) GTK is available.
57 ``GTK_UNIX_PRINT_FOUND``
58   true if the ``unix-print`` component is available.
59 ``GTK_4``
60   whether GTK 4 was detected
61 ``GTK_3``
62   whether GTK 3 was detected
63 ``GTK_VERSION``
64   the version of GTK.
65 ``GTK_SUPPORTS_BROADWAY``
66   true if the Broadway target is built into GTK.
67 ``GTK_SUPPORTS_QUARTZ``
68   true if the Quartz target is built into GTK.
69 ``GTK_SUPPORTS_WAYLAND``
70   true if the Wayland target is built into GTK.
71 ``GTK_SUPPORTS_WIN32``
72   true if the Windows target is built into GTK.
73 ``GTK_SUPPORTS_X11``
74   true if the X11 target is built into GTK.
75
76 #]=======================================================================]
77
78 if (NOT DEFINED GTK_FIND_VERSION)
79     message(FATAL_ERROR "No GTK version specified")
80 endif ()
81
82 if (GTK_FIND_VERSION VERSION_LESS 3.90)
83     set(GTK_PC_MODULE "gtk+-3.0")
84     set(GTK_PC_UNIX_PRINT_MODULE "gtk+-unix-print-3.0")
85     set(GTK_4 FALSE)
86     set(GTK_3 TRUE)
87 else ()
88     set(GTK_PC_MODULE "gtk4")
89     set(GTK_PC_UNIX_PRINT_MODULE "gtk4-unix-print")
90     set(GTK_4 TRUE)
91     set(GTK_3 FALSE)
92 endif ()
93
94 find_package(PkgConfig QUIET)
95 pkg_check_modules(GTK IMPORTED_TARGET ${GTK_PC_MODULE})
96
97 set(GTK_VERSION_OK TRUE)
98 if (GTK_VERSION)
99     if (GTK_FIND_VERSION_EXACT)
100         if (NOT("${GTK_FIND_VERSION}" VERSION_EQUAL "${GTK_VERSION}"))
101             set(GTK_VERSION_OK FALSE)
102         endif ()
103     else ()
104         if ("${GTK_VERSION}" VERSION_LESS "${GTK_FIND_VERSION}")
105             set(GTK_VERSION_OK FALSE)
106         endif ()
107     endif ()
108 endif ()
109
110 # Set all the GTK_SUPPORTS_<target> variables to FALSE initially.
111 foreach (gtk_target broadway quartz wayland win32 x11)
112     string(TOUPPER "GTK_SUPPORTS_${gtk_target}" gtk_target)
113     set(${gtk_target} FALSE)
114 endforeach ()
115
116 if (GTK_VERSION AND GTK_VERSION_OK)
117     # Fetch the "targets" variable and set GTK_SUPPORTS_<target>.
118     pkg_get_variable(GTK_TARGETS ${GTK_PC_MODULE} targets)
119     separate_arguments(GTK_TARGETS)
120     foreach (gtk_target ${GTK_TARGETS})
121         string(TOUPPER "GTK_SUPPORTS_${gtk_target}" gtk_target)
122         set(${gtk_target} TRUE)
123     endforeach ()
124 endif ()
125
126 if (TARGET PkgConfig::GTK AND NOT TARGET GTK::GTK)
127     add_library(GTK::GTK INTERFACE IMPORTED GLOBAL)
128     set_property(TARGET GTK::GTK PROPERTY
129         INTERFACE_LINK_LIBRARIES PkgConfig::GTK
130     )
131 endif ()
132
133 # Try to find additional components
134 foreach (gtk_component ${GTK_FIND_COMPONENTS})
135     if (NOT "${gtk_component}" STREQUAL unix-print)
136         message(FATAL_ERROR "Invalid component name: ${gtk_component}")
137     endif ()
138     pkg_check_modules(GTK_UNIX_PRINT IMPORTED_TARGET "${GTK_PC_UNIX_PRINT_MODULE}")
139     if (GTK_FIND_REQUIRED_unix-print AND NOT GTK_UNIX_PRINT_FOUND)
140         message(FATAL_ERROR "Component unix-print not found")
141     endif ()
142     if (TARGET PkgConfig::GTK_UNIX_PRINT AND NOT TARGET GTK::UnixPrint)
143         add_library(GTK::UnixPrint INTERFACE IMPORTED GLOBAL)
144         set_property(TARGET GTK::UnixPrint PROPERTY
145             INTERFACE_LINK_LIBRARIES PkgConfig::GTK_UNIX_PRINT)
146     endif ()
147 endforeach ()
148
149 include(FindPackageHandleStandardArgs)
150 FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK DEFAULT_MSG GTK_VERSION GTK_VERSION_OK)