gtk4: fix x64 darwin
[NixPkgs.git] / pkgs / development / libraries / gtk / 4.x.nix
blobc60f1f880437077b03eca501bcf257fd13940b2d
1 { lib
2 , stdenv
3 , buildPackages
4 , substituteAll
5 , fetchurl
6 , pkg-config
7 , docutils
8 , gettext
9 , graphene
10 , gi-docgen
11 , meson
12 , mesonEmulatorHook
13 , ninja
14 , python3
15 , makeWrapper
16 , shared-mime-info
17 , isocodes
18 , glib
19 , cairo
20 , pango
21 , gdk-pixbuf
22 , gobject-introspection
23 , fribidi
24 , harfbuzz
25 , xorg
26 , libepoxy
27 , libxkbcommon
28 , libpng
29 , libtiff
30 , libjpeg
31 , libxml2
32 , gnome
33 , gsettings-desktop-schemas
34 , gst_all_1
35 , sassc
36 , trackerSupport ? stdenv.hostPlatform.isLinux
37 , tinysparql
38 , x11Support ? stdenv.hostPlatform.isLinux
39 , waylandSupport ? stdenv.hostPlatform.isLinux
40 , libGL
41 , vulkanSupport ? stdenv.hostPlatform.isLinux
42 , shaderc
43 , vulkan-loader
44 , vulkan-headers
45 , libdrm
46 , wayland
47 , wayland-protocols
48 , wayland-scanner
49 , xineramaSupport ? stdenv.hostPlatform.isLinux
50 , cupsSupport ? stdenv.hostPlatform.isLinux
51 , compileSchemas ? stdenv.hostPlatform.emulatorAvailable buildPackages
52 , cups
53 , libexecinfo
54 , broadwaySupport ? true
55 , testers
56 , apple-sdk
57 , apple-sdk_10_15
58 , darwinMinVersionHook
61 let
63   gtkCleanImmodulesCache = substituteAll {
64     src = ./hooks/clean-immodules-cache.sh;
65     gtk_module_path = "gtk-4.0";
66     gtk_binary_version = "4.0.0";
67   };
71 stdenv.mkDerivation (finalAttrs: {
72   pname = "gtk4";
73   version = "4.16.3";
75   outputs = [ "out" "dev" ] ++ lib.optionals x11Support [ "devdoc" ];
76   outputBin = "dev";
78   setupHooks = [
79     ./hooks/drop-icon-theme-cache.sh
80     gtkCleanImmodulesCache
81   ];
83   src = fetchurl {
84     url = with finalAttrs; "mirror://gnome/sources/gtk/${lib.versions.majorMinor version}/gtk-${version}.tar.xz";
85     hash = "sha256-LsU+B9GMnwA7OeSmqDgFTZJZ4Ei2xMBdgMDQWqch2UQ=";
86   };
88   depsBuildBuild = [
89     pkg-config
90   ];
92   nativeBuildInputs = [
93     docutils # for rst2man, rst2html5
94     gettext
95     gobject-introspection
96     makeWrapper
97     meson
98     ninja
99     pkg-config
100     python3
101     sassc
102     gi-docgen
103     libxml2 # for xmllint
104   ] ++ lib.optionals (compileSchemas && !stdenv.buildPlatform.canExecute stdenv.hostPlatform) [
105     mesonEmulatorHook
106   ] ++ lib.optionals waylandSupport [
107     wayland-scanner
108   ] ++ lib.optionals vulkanSupport [
109     shaderc # for glslc
110   ] ++ finalAttrs.setupHooks;
112   buildInputs = [
113     libxkbcommon
114     libpng
115     libtiff
116     libjpeg
117     (libepoxy.override { inherit x11Support; })
118     isocodes
119   ] ++ lib.optionals vulkanSupport [
120     vulkan-headers
121     libdrm
122   ] ++ [
123     gst_all_1.gst-plugins-base
124     gst_all_1.gst-plugins-bad
125     fribidi
126     harfbuzz
127   ] ++ (with xorg; [
128     libICE
129     libSM
130     libXcursor
131     libXdamage
132     libXi
133     libXrandr
134     libXrender
135   ]) ++ lib.optionals trackerSupport [
136     tinysparql
137   ] ++ lib.optionals waylandSupport [
138     libGL
139     wayland
140     wayland-protocols
141   ] ++ lib.optionals xineramaSupport [
142     xorg.libXinerama
143   ] ++ lib.optionals cupsSupport [
144     cups
145   ] ++ lib.optionals stdenv.hostPlatform.isMusl [
146     libexecinfo
147   ];
148   #TODO: colord?
150   propagatedBuildInputs = [
151     # Required by pkg-config files.
152     cairo
153     gdk-pixbuf
154     glib
155     graphene
156     pango
157   ] ++ lib.optionals waylandSupport [
158     wayland
159   ] ++ lib.optionals vulkanSupport [
160     vulkan-loader
161   ] ++ [
162     # Required for GSettings schemas at runtime.
163     # Will be picked up by wrapGAppsHook4.
164     gsettings-desktop-schemas
165   ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
166     (darwinMinVersionHook "15.0")
167   ] ++ lib.optionals (stdenv.hostPlatform.isDarwin
168                    && lib.versionOlder apple-sdk.version "10.15") [
169       apple-sdk_10_15
170   ];
172   mesonFlags = [
173     # ../docs/tools/shooter.c:4:10: fatal error: 'cairo-xlib.h' file not found
174     (lib.mesonBool "documentation" x11Support)
175     "-Dbuild-tests=false"
176     (lib.mesonEnable "tracker" trackerSupport)
177     (lib.mesonBool "broadway-backend" broadwaySupport)
178     (lib.mesonEnable "vulkan" vulkanSupport)
179     (lib.mesonEnable "print-cups" cupsSupport)
180     (lib.mesonBool "x11-backend" x11Support)
181   ] ++ lib.optionals (stdenv.hostPlatform.isDarwin && !stdenv.hostPlatform.isAarch64) [
182     "-Dmedia-gstreamer=disabled" # requires gstreamer-gl
183   ];
185   doCheck = false; # needs X11
187   separateDebugInfo = stdenv.hostPlatform.isLinux;
189   # These are the defines that'd you'd get with --enable-debug=minimum (default).
190   # See: https://developer.gnome.org/gtk3/stable/gtk-building.html#extra-configuration-options
191   env = {
192     NIX_CFLAGS_COMPILE = "-DG_ENABLE_DEBUG -DG_DISABLE_CAST_CHECKS";
193   } // lib.optionalAttrs stdenv.hostPlatform.isMusl {
194     NIX_LDFLAGS = "-lexecinfo";
195   };
197   postPatch = ''
198     # this conditional gates the installation of share/gsettings-schemas/.../glib-2.0/schemas/gschemas.compiled.
199     substituteInPlace meson.build \
200       --replace 'if not meson.is_cross_build()' 'if ${lib.boolToString compileSchemas}'
202     files=(
203       build-aux/meson/gen-profile-conf.py
204       build-aux/meson/gen-visibility-macros.py
205       demos/gtk-demo/geninclude.py
206       gdk/broadway/gen-c-array.py
207       gdk/gen-gdk-gresources-xml.py
208       gtk/gen-gtk-gresources-xml.py
209       gtk/gentypefuncs.py
210     )
212     chmod +x ''${files[@]}
213     patchShebangs ''${files[@]}
215   '';
217   preInstall = ''
218     OLD_PATH="$PATH"
219     PATH="$PATH:$dev/bin" # so the install script finds gtk4-update-icon-cache
220   '';
222   postInstall = ''
223     PATH="$OLD_PATH"
224   '' + lib.optionalString (!stdenv.hostPlatform.isDarwin) ''
225     # The updater is needed for nixos env and it's tiny.
226     moveToOutput bin/gtk4-update-icon-cache "$out"
227     # Launcher
228     moveToOutput bin/gtk-launch "$out"
230     # TODO: patch glib directly
231     for f in $dev/bin/gtk4-encode-symbolic-svg; do
232       wrapProgram $f --prefix XDG_DATA_DIRS : "${shared-mime-info}/share"
233     done
234   '' + lib.optionalString broadwaySupport ''
235     # Broadway daemon
236     moveToOutput bin/gtk4-broadwayd "$out"
237   '';
239   # Wrap demos
240   postFixup =  lib.optionalString (!stdenv.hostPlatform.isDarwin) ''
241     demos=(gtk4-demo gtk4-demo-application gtk4-icon-browser gtk4-widget-factory)
243     for program in ''${demos[@]}; do
244       wrapProgram $dev/bin/$program \
245         --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH:$out/share/gsettings-schemas/${finalAttrs.pname}-${finalAttrs.version}"
246     done
247   '' + lib.optionalString x11Support ''
248     # Cannot be in postInstall, otherwise _multioutDocs hook in preFixup will move right back.
249     moveToOutput "share/doc" "$devdoc"
250   '';
252   passthru = {
253     updateScript = gnome.updateScript {
254       packageName = "gtk";
255       versionPolicy = "odd-unstable";
256       attrPath = "gtk4";
257     };
258     tests = {
259       pkg-config = testers.hasPkgConfigModules {
260         package = finalAttrs.finalPackage;
261       };
262     };
263   };
265   meta = with lib; {
266     description = "Multi-platform toolkit for creating graphical user interfaces";
267     longDescription = ''
268       GTK is a highly usable, feature rich toolkit for creating
269       graphical user interfaces which boasts cross platform
270       compatibility and an easy to use API.  GTK it is written in C,
271       but has bindings to many other popular programming languages
272       such as C++, Python and C# among others.  GTK is licensed
273       under the GNU LGPL 2.1 allowing development of both free and
274       proprietary software with GTK without any license fees or
275       royalties.
276     '';
277     homepage = "https://www.gtk.org/";
278     license = licenses.lgpl2Plus;
279     maintainers = teams.gnome.members ++ (with maintainers; [ raskin ]);
280     platforms = platforms.all;
281     changelog = "https://gitlab.gnome.org/GNOME/gtk/-/raw/${finalAttrs.version}/NEWS";
282     pkgConfigModules = [
283       "gtk4"
284     ] ++ lib.optionals broadwaySupport [
285       "gtk4-broadway"
286     ] ++ lib.optionals stdenv.hostPlatform.isUnix [
287       "gtk4-unix-print"
288     ] ++ lib.optionals waylandSupport [
289       "gtk4-wayland"
290     ] ++ lib.optionals x11Support [
291       "gtk4-x11"
292     ];
293   };