base16-schemes: unstable-2024-06-21 -> unstable-2024-11-12 (#356361)
[NixPkgs.git] / pkgs / tools / networking / networkmanager / default.nix
blobfbc7ec0857b58c11ef705e0f32da95a0dcceb746
1 { lib
2 , stdenv
3 , fetchurl
4 , substituteAll
5 , gettext
6 , pkg-config
7 , dbus
8 , gnome
9 , libuuid
10 , polkit
11 , gnutls
12 , ppp
13 , dhcpcd
14 , iptables
15 , nftables
16 , python3
17 , vala
18 , libgcrypt
19 , dnsmasq
20 , bluez5
21 , readline
22 , libselinux
23 , audit
24 , gobject-introspection
25 , perl
26 , modemmanager
27 , openresolv
28 , libndp
29 , newt
30 , libsoup
31 , ethtool
32 , gnused
33 , iputils
34 , kmod
35 , jansson
36 , elfutils
37 , gtk-doc
38 , libxslt
39 , docbook_xsl
40 , docbook_xml_dtd_412
41 , docbook_xml_dtd_42
42 , docbook_xml_dtd_43
43 , openconnect
44 , curl
45 , meson
46 , mesonEmulatorHook
47 , ninja
48 , libpsl
49 , mobile-broadband-provider-info
50 , runtimeShell
51 , buildPackages
52 , nixosTests
53 , systemd
54 , udev
55 , withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd
58 let
59   pythonForDocs = python3.pythonOnBuildForHost.withPackages (pkgs: with pkgs; [ pygobject3 ]);
61 stdenv.mkDerivation rec {
62   pname = "networkmanager";
63   version = "1.48.10";
65   src = fetchurl {
66     url = "mirror://gnome/sources/NetworkManager/${lib.versions.majorMinor version}/NetworkManager-${version}.tar.xz";
67     hash = "sha256-XcGI/f/PLSPInTSx5jGaayAgPhLq7CSzADe36orIxhM=";
68   };
70   outputs = [ "out" "dev" "devdoc" "man" "doc" ];
72   # Right now we hardcode quite a few paths at build time. Probably we should
73   # patch networkmanager to allow passing these path in config file. This will
74   # remove unneeded build-time dependencies.
75   mesonFlags = [
76     # System paths
77     "--sysconfdir=/etc"
78     "--localstatedir=/var"
79     (lib.mesonOption "systemdsystemunitdir"
80       (if withSystemd then "${placeholder "out"}/etc/systemd/system" else "no"))
81     # to enable link-local connections
82     "-Dudev_dir=${placeholder "out"}/lib/udev"
83     "-Ddbus_conf_dir=${placeholder "out"}/share/dbus-1/system.d"
84     "-Dkernel_firmware_dir=/run/current-system/firmware"
86     # Platform
87     "-Dmodprobe=${kmod}/bin/modprobe"
88     (lib.mesonOption "session_tracking" (if withSystemd then "systemd" else "no"))
89     (lib.mesonBool "systemd_journal" withSystemd)
90     "-Dlibaudit=yes-disabled-by-default"
91     "-Dpolkit_agent_helper_1=/run/wrappers/bin/polkit-agent-helper-1"
93     # Features
94     # Allow using iwd when configured to do so
95     "-Diwd=true"
96     "-Dpppd=${ppp}/bin/pppd"
97     "-Diptables=${iptables}/bin/iptables"
98     "-Dnft=${nftables}/bin/nft"
99     "-Dmodem_manager=true"
100     "-Dnmtui=true"
101     "-Ddnsmasq=${dnsmasq}/bin/dnsmasq"
102     "-Dqt=false"
104     # Handlers
105     "-Dresolvconf=${openresolv}/bin/resolvconf"
107     # DHCP clients
108     # ISC DHCP client has reached it's end of life, so stop using it
109     "-Ddhclient=no"
110     "-Ddhcpcd=${dhcpcd}/bin/dhcpcd"
111     "-Ddhcpcanon=no"
113     # Miscellaneous
114     # almost cross-compiles, however fails with
115     # ** (process:9234): WARNING **: Failed to load shared library '/nix/store/...-networkmanager-aarch64-unknown-linux-gnu-1.38.2/lib/libnm.so.0' referenced by the typelib: /nix/store/...-networkmanager-aarch64-unknown-linux-gnu-1.38.2/lib/libnm.so.0: cannot open shared object file: No such file or directory
116     "-Ddocs=${lib.boolToString (stdenv.buildPlatform == stdenv.hostPlatform)}"
117     # We don't use firewalld in NixOS
118     "-Dfirewalld_zone=false"
119     "-Dtests=no"
120     "-Dcrypto=gnutls"
121     "-Dmobile_broadband_provider_info_database=${mobile-broadband-provider-info}/share/mobile-broadband-provider-info/serviceproviders.xml"
122   ];
124   patches = [
125     (substituteAll {
126       src = ./fix-paths.patch;
127       inherit iputils openconnect ethtool gnused systemd;
128       inherit runtimeShell;
129     })
131     # Meson does not support using different directories during build and
132     # for installation like Autotools did with flags passed to make install.
133     ./fix-install-paths.patch
135     # https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1966
136     ./without-systemd.patch
137   ];
139   buildInputs = [
140     (if withSystemd then systemd else udev)
141     libselinux
142     audit
143     libpsl
144     libuuid
145     polkit
146     ppp
147     libndp
148     curl
149     mobile-broadband-provider-info
150     bluez5
151     dnsmasq
152     modemmanager
153     readline
154     newt
155     libsoup
156     jansson
157     dbus # used to get directory paths with pkg-config during configuration
158   ];
160   propagatedBuildInputs = [ gnutls libgcrypt ];
162   nativeBuildInputs = [
163     meson
164     ninja
165     gettext
166     pkg-config
167     vala
168     gobject-introspection
169     perl
170     elfutils # used to find jansson soname
171     # Docs
172     gtk-doc
173     libxslt
174     docbook_xsl
175     docbook_xml_dtd_412
176     docbook_xml_dtd_42
177     docbook_xml_dtd_43
178     pythonForDocs
179   ] ++ lib.optionals (!stdenv.buildPlatform.canExecute stdenv.hostPlatform) [
180     mesonEmulatorHook
181   ];
183   doCheck = false; # requires /sys, the net
185   postPatch = ''
186     patchShebangs ./tools
187     patchShebangs libnm/generate-setting-docs.py
189     # TODO: submit upstream
190     substituteInPlace meson.build \
191       --replace "'vala', req" "'vala', native: false, req"
192   '' + lib.optionalString withSystemd ''
193     substituteInPlace data/NetworkManager.service.in \
194       --replace-fail /usr/bin/busctl ${systemd}/bin/busctl
195   '';
197   preBuild = ''
198     # Our gobject-introspection patches make the shared library paths absolute
199     # in the GIR files. When building docs, the library is not yet installed,
200     # though, so we need to replace the absolute path with a local one during build.
201     # We are using a symlink that will be overridden during installation.
202     mkdir -p ${placeholder "out"}/lib
203     ln -s $PWD/src/libnm-client-impl/libnm.so.0 ${placeholder "out"}/lib/libnm.so.0
204   '';
206   postFixup = lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform) ''
207     cp -r ${buildPackages.networkmanager.devdoc} $devdoc
208     cp -r ${buildPackages.networkmanager.man} $man
209   '';
211   passthru = {
212     updateScript = gnome.updateScript {
213       packageName = "NetworkManager";
214       attrPath = "networkmanager";
215       versionPolicy = "odd-unstable";
216     };
217     tests = {
218       inherit (nixosTests.networking) networkmanager;
219     };
220   };
222   meta = with lib; {
223     homepage = "https://networkmanager.dev";
224     description = "Network configuration and management tool";
225     license = licenses.gpl2Plus;
226     changelog = "https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/raw/${version}/NEWS";
227     maintainers = teams.freedesktop.members ++ (with maintainers; [ domenkozar obadz ]);
228     platforms = platforms.linux;
229     badPlatforms = [
230       # Mandatory shared libraries.
231       lib.systems.inspect.platformPatterns.isStatic
232     ];
233   };