linux_xanmod: 5.11.14 -> 5.11.15
[NixPkgs.git] / pkgs / development / libraries / glib / default.nix
blobce64bef95adba6b88c90407072883fcddf534fa0
1 { config, lib, stdenv, fetchurl, gettext, meson, ninja, pkg-config, perl, python3
2 , libiconv, zlib, libffi, pcre, libelf, gnome3, libselinux, bash, gnum4, gtk-doc, docbook_xsl, docbook_xml_dtd_45
3 # use util-linuxMinimal to avoid circular dependency (util-linux, systemd, glib)
4 , util-linuxMinimal ? null
5 , buildPackages
7 # this is just for tests (not in the closure of any regular package)
8 , doCheck ? config.doCheckByDefault or false
9 , coreutils, dbus, libxml2, tzdata
10 , desktop-file-utils, shared-mime-info
11 , darwin, fetchpatch
14 with lib;
16 assert stdenv.isLinux -> util-linuxMinimal != null;
18 # TODO:
19 # * Make it build without python
20 #     Problem: an example (test?) program needs it.
21 #     Possible solution: disable compilation of this example somehow
22 #     Reminder: add 'sed -e 's@python2\.[0-9]@python@' -i
23 #       $out/bin/gtester-report' to postInstall if this is solved
25   * Use --enable-installed-tests for GNOME-related packages,
26       and use them as a separately installed tests runned by Hydra
27       (they should test an already installed package)
28       https://wiki.gnome.org/GnomeGoals/InstalledTests
29   * Support org.freedesktop.Application, including D-Bus activation from desktop files
31 let
32   # Some packages don't get "Cflags" from pkg-config correctly
33   # and then fail to build when directly including like <glib/...>.
34   # This is intended to be run in postInstall of any package
35   # which has $out/include/ containing just some disjunct directories.
36   flattenInclude = ''
37     for dir in "''${!outputInclude}"/include/*; do
38       cp -r "$dir"/* "''${!outputInclude}/include/"
39       rm -r "$dir"
40       ln -s . "$dir"
41     done
42     ln -sr -t "''${!outputInclude}/include/" "''${!outputInclude}"/lib/*/include/* 2>/dev/null || true
43   '';
46 stdenv.mkDerivation rec {
47   pname = "glib";
48   version = "2.66.8";
50   src = fetchurl {
51     url = "mirror://gnome/sources/glib/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
52     sha256 = "sha256-l7yH3ZE2VYmvXLv+oldIM66nobcYQP02Xs0oUsdrnIs=";
53   };
55   patches = optionals stdenv.isDarwin [
56     ./darwin-compilation.patch
57   ] ++ optionals stdenv.hostPlatform.isMusl [
58     ./quark_init_on_demand.patch
59     ./gobject_init_on_demand.patch
60   ] ++ [
61     ./schema-override-variable.patch
63     # GLib contains many binaries used for different purposes;
64     # we will install them to different outputs:
65     # 1. Tools for desktop environment ($bin)
66     #    * gapplication (non-darwin)
67     #    * gdbus
68     #    * gio
69     #    * gio-launch-desktop (symlink to $out)
70     #    * gsettings
71     # 2. Development/build tools ($dev)
72     #    * gdbus-codegen
73     #    * gio-querymodules
74     #    * glib-compile-resources
75     #    * glib-compile-schemas
76     #    * glib-genmarshal
77     #    * glib-gettextize
78     #    * glib-mkenums
79     #    * gobject-query
80     #    * gresource
81     #    * gtester
82     #    * gtester-report
83     # 3. Tools for desktop environment that cannot go to $bin due to $out depending on them ($out)
84     #    * gio-launch-desktop
85     ./split-dev-programs.patch
86   ] ++ optional doCheck ./skip-timer-test.patch;
88   outputs = [ "bin" "out" "dev" "devdoc" ];
90   setupHook = ./setup-hook.sh;
92   buildInputs = [
93     libelf setupHook pcre
94     bash gnum4 # install glib-gettextize and m4 macros for other apps to use
95     gtk-doc
96   ] ++ optionals stdenv.isLinux [
97     libselinux
98     util-linuxMinimal # for libmount
99   ] ++ optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [
100     AppKit Carbon Cocoa CoreFoundation CoreServices Foundation
101   ]);
103   strictDeps = true;
105   nativeBuildInputs = [
106     meson ninja pkg-config perl python3 gettext gtk-doc docbook_xsl docbook_xml_dtd_45 libxml2
107   ];
109   propagatedBuildInputs = [ zlib libffi gettext libiconv ];
111   mesonFlags = [
112     # Avoid the need for gobject introspection binaries in PATH in cross-compiling case.
113     # Instead we just copy them over from the native output.
114     "-Dgtk_doc=${boolToString (stdenv.hostPlatform == stdenv.buildPlatform)}"
115     "-Dnls=enabled"
116     "-Ddevbindir=${placeholder "dev"}/bin"
117   ];
119   NIX_CFLAGS_COMPILE = toString [
120     "-Wno-error=nonnull"
121     # Default for release buildtype but passed manually because
122     # we're using plain
123     "-DG_DISABLE_CAST_CHECKS"
124   ];
126   hardeningDisable = [ "pie" ];
128   postPatch = ''
129     chmod +x gio/tests/gengiotypefuncs.py
130     patchShebangs gio/tests/gengiotypefuncs.py
131     chmod +x docs/reference/gio/concat-files-helper.py
132     patchShebangs docs/reference/gio/concat-files-helper.py
133     patchShebangs glib/gen-unicode-tables.pl
134     patchShebangs tests/gen-casefold-txt.py
135     patchShebangs tests/gen-casemap-txt.py
136   '';
138   DETERMINISTIC_BUILD = 1;
140   postInstall = ''
141     moveToOutput "share/glib-2.0" "$dev"
142     substituteInPlace "$dev/bin/gdbus-codegen" --replace "$out" "$dev"
143     sed -i "$dev/bin/glib-gettextize" -e "s|^gettext_dir=.*|gettext_dir=$dev/share/glib-2.0/gettext|"
145     # This file is *included* in gtk3 and would introduce runtime reference via __FILE__.
146     sed '1i#line 1 "${pname}-${version}/include/glib-2.0/gobject/gobjectnotifyqueue.c"' \
147       -i "$dev"/include/glib-2.0/gobject/gobjectnotifyqueue.c
148   '' + optionalString (stdenv.hostPlatform != stdenv.buildPlatform) ''
149     cp -r ${buildPackages.glib.devdoc} $devdoc
150   '';
152   checkInputs = [ tzdata desktop-file-utils shared-mime-info ];
154   preCheck = optionalString doCheck ''
155     export LD_LIBRARY_PATH="$NIX_BUILD_TOP/${pname}-${version}/glib/.libs''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH"
156     export TZDIR="${tzdata}/share/zoneinfo"
157     export XDG_CACHE_HOME="$TMP"
158     export XDG_RUNTIME_HOME="$TMP"
159     export HOME="$TMP"
160     export XDG_DATA_DIRS="${desktop-file-utils}/share:${shared-mime-info}/share"
161     export G_TEST_DBUS_DAEMON="${dbus.daemon}/bin/dbus-daemon"
162     export PATH="$PATH:$(pwd)/gobject"
163     echo "PATH=$PATH"
165     substituteInPlace gio/tests/desktop-files/home/applications/epiphany-weather-for-toronto-island-9c6a4e022b17686306243dada811d550d25eb1fb.desktop \
166       --replace "Exec=/bin/true" "Exec=${coreutils}/bin/true"
167     # Needs machine-id, comment the test
168     sed -e '/\/gdbus\/codegen-peer-to-peer/ s/^\/*/\/\//' -i gio/tests/gdbus-peer.c
169     sed -e '/g_test_add_func/ s/^\/*/\/\//' -i gio/tests/gdbus-unix-addresses.c
170     # All gschemas fail to pass the test, upstream bug?
171     sed -e '/g_test_add_data_func/ s/^\/*/\/\//' -i gio/tests/gschema-compile.c
172     # Cannot reproduce the failing test_associations on hydra
173     sed -e '/\/appinfo\/associations/d' -i gio/tests/appinfo.c
174     # Needed because of libtool wrappers
175     sed -e '/g_subprocess_launcher_set_environ (launcher, envp);/a g_subprocess_launcher_setenv (launcher, "PATH", g_getenv("PATH"), TRUE);' -i gio/tests/gsubprocess.c
176   '';
178   inherit doCheck;
180   separateDebugInfo = stdenv.isLinux;
182   passthru = rec {
183     gioModuleDir = "lib/gio/modules";
184     makeSchemaPath = dir: name: "${dir}/share/gsettings-schemas/${name}/glib-2.0/schemas";
185     getSchemaPath = pkg: makeSchemaPath pkg pkg.name;
186     inherit flattenInclude;
187     updateScript = gnome3.updateScript { packageName = "glib"; };
188   };
190   meta = with lib; {
191     description = "C library of programming buildings blocks";
192     homepage    = "https://www.gtk.org/";
193     license     = licenses.lgpl21Plus;
194     maintainers = with maintainers; [ lovek323 raskin worldofpeace ];
195     platforms   = platforms.unix;
197     longDescription = ''
198       GLib provides the core application building blocks for libraries
199       and applications written in C.  It provides the core object
200       system used in GNOME, the main loop implementation, and a large
201       set of utility functions for strings and common data structures.
202     '';
203   };