Skip to content

Commit

Permalink
networkmanager: port to Meson
Browse files Browse the repository at this point in the history
All hail Meson!

One serious issue is that building docs does not work.

We patch gobject-introspection to use absolute paths for shared libraries
in GIR files. Building the NetworkManager docs relies on the produced
introspection data but since the library is not yet installed
at the time the docs are generated, the build will fail.

It works in Autotools for some reason; they probably use
the pregenerated GIRs from the tarball.

Disabling the docs completely is not possible at the moment either,
since nmc [depends on them][1].

I have decided to fix this by pointing the installed location to the one
in the build directory using libredirect. Unfortunately, we cannot just set
the environment variables directly, since the build system runs
the documentation generator in a clean environment.

I have also added man, doc and devdoc outputs so the generated files have
somewhere to go.

Secondly, since Nix store is immutable, we also cannot use the package prefix
for configuration and mutable state data. At the same time, we cannot write
to the appropriate global directories during build. Autotools allowed to change
this in installFlags but Meson lacks similar mechanism so we need to patch
the build files.

Finally, I also removed the at_console patch since the permission has been
removed in 0.9.10.

[1]: https://bugzilla.gnome.org/show_bug.cgi?id=796755
  • Loading branch information
jtojnar committed Apr 22, 2019
1 parent 90f3a23 commit a961a28
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 49 deletions.
104 changes: 55 additions & 49 deletions pkgs/tools/networking/network-manager/default.nix
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
{ stdenv, fetchurl, substituteAll, intltool, pkgconfig, dbus, dbus-glib
, gnome3, systemd, libuuid, polkit, gnutls, ppp, dhcp, iptables
, libgcrypt, dnsmasq, bluez5, readline
, gnome3, systemd, libuuid, polkit, gnutls, ppp, dhcp, iptables, python3, vala
, libgcrypt, dnsmasq, bluez5, readline, libselinux, audit
, gobject-introspection, modemmanager, openresolv, libndp, newt, libsoup
, ethtool, gnused, coreutils, file, inetutils, kmod, jansson, libxslt
, python3Packages, docbook_xsl, openconnect, curl, autoreconfHook }:
, ethtool, gnused, coreutils, inetutils, kmod, jansson, gtk-doc, libxslt
, docbook_xsl, docbook_xml_dtd_412, docbook_xml_dtd_42, docbook_xml_dtd_43
, openconnect, curl, meson, ninja, libpsl, libredirect }:

let
pname = "NetworkManager";
pythonForDocs = python3.withPackages (pkgs: with pkgs; [ pygobject3 ]);
in stdenv.mkDerivation rec {
name = "network-manager-${version}";
version = "1.16.0";
Expand All @@ -16,44 +18,34 @@ in stdenv.mkDerivation rec {
sha256 = "0b2x9hrg41cd17psqi0vacwj733v99hxczn53gdfs0yanqrji5lf";
};

outputs = [ "out" "dev" ];

postPatch = ''
patchShebangs ./tools
'';

preConfigure = ''
substituteInPlace configure --replace /usr/bin/uname ${coreutils}/bin/uname
substituteInPlace configure --replace /usr/bin/file ${file}/bin/file
# Fixes: error: po/Makefile.in.in was not created by intltoolize.
intltoolize --automake --copy --force
'';
outputs = [ "out" "dev" "devdoc" "man" "doc" ];

# Right now we hardcode quite a few paths at build time. Probably we should
# patch networkmanager to allow passing these path in config file. This will
# remove unneeded build-time dependencies.
configureFlags = [
"--with-dhclient=${dhcp}/bin/dhclient"
"--with-dnsmasq=${dnsmasq}/bin/dnsmasq"
mesonFlags = [
"-Ddhclient=${dhcp}/bin/dhclient"
"-Ddnsmasq=${dnsmasq}/bin/dnsmasq"
# Upstream prefers dhclient, so don't add dhcpcd to the closure
"--with-dhcpcd=no"
"--with-pppd=${ppp}/bin/pppd"
"--with-iptables=${iptables}/bin/iptables"
"-Ddhcpcd=no"
"-Dpppd=${ppp}/bin/pppd"
"-Diptables=${iptables}/bin/iptables"
# to enable link-local connections
"--with-udev-dir=${placeholder "out"}/lib/udev"
"--with-resolvconf=${openresolv}/sbin/resolvconf"
"--sysconfdir=/etc" "--localstatedir=/var"
"--with-dbus-sys-dir=${placeholder "out"}/etc/dbus-1/system.d"
"--with-crypto=gnutls" "--disable-more-warnings"
"--with-systemdsystemunitdir=$(out)/etc/systemd/system"
"--with-kernel-firmware-dir=/run/current-system/firmware"
"--with-session-tracking=systemd"
"--with-modem-manager-1"
"--with-nmtui"
"--disable-gtk-doc"
"--with-libnm-glib" # legacy library, TODO: remove
"--disable-tests"
"-Dudev_dir=${placeholder "out"}/lib/udev"
"-Dresolvconf=${openresolv}/bin/resolvconf"
"-Ddbus_conf_dir=${placeholder "out"}/etc/dbus-1/system.d"
"-Dsystemdsystemunitdir=${placeholder "out"}/etc/systemd/system"
"-Dkernel_firmware_dir=/run/current-system/firmware"
"--sysconfdir=/etc"
"--localstatedir=/var"
"-Dcrypto=gnutls"
"-Dsession_tracking=systemd"
"-Dmodem_manager=true"
"-Dnmtui=true"
"-Ddocs=true"
"-Dlibnm_glib=true" # legacy library, TODO: remove
"-Dtests=no"
"-Dqt=false"
];

patches = [
Expand All @@ -63,31 +55,45 @@ in stdenv.mkDerivation rec {
inherit (stdenv) shell;
})

# Meson does not support using different directories during build and
# for installation like Autotools did with flags passed to make install.
./fix-install-paths.patch

# Our gobject-introspection patches make the shared library paths absolute
# in the GIR files. When building docs, the library is not yet installed,
# though, so we need to replace the absolute path with a local one during build.
# We are replacing the variables in postPatch since substituteAll does not support
# placeholders.
./fix-docs-build.patch
];

buildInputs = [
systemd libuuid polkit ppp libndp curl
systemd libselinux audit libpsl libuuid polkit ppp libndp curl
bluez5 dnsmasq gobject-introspection modemmanager readline newt libsoup jansson
];

propagatedBuildInputs = [ dbus-glib gnutls libgcrypt python3Packages.pygobject3 ];
propagatedBuildInputs = [ dbus-glib gnutls libgcrypt ];

nativeBuildInputs = [ autoreconfHook intltool pkgconfig libxslt docbook_xsl ];
nativeBuildInputs = [
meson ninja intltool pkgconfig
vala gobject-introspection
dbus-glib # for dbus-binding-tool
# Docs
gtk-doc libxslt docbook_xsl docbook_xml_dtd_412 docbook_xml_dtd_42 docbook_xml_dtd_43 pythonForDocs
];

doCheck = false; # requires /sys, the net

installFlags = [
"sysconfdir=${placeholder "out"}/etc"
"localstatedir=${placeholder "out"}/var"
"runstatedir=${placeholder "out"}/run"
];

postInstall = ''
mkdir -p $out/lib/NetworkManager
postPatch = ''
patchShebangs ./tools
patchShebangs libnm/generate-setting-docs.py
# FIXME: Workaround until NixOS' dbus+systemd supports at_console policy
substituteInPlace $out/etc/dbus-1/system.d/org.freedesktop.NetworkManager.conf --replace 'at_console="true"' 'group="networkmanager"'
substituteInPlace libnm/meson.build \
--subst-var-by DOCS_LD_PRELOAD "${libredirect}/lib/libredirect.so" \
--subst-var-by DOCS_NIX_REDIRECTS "${placeholder "out"}/lib/libnm.so.0=$PWD/build/libnm/libnm.so.0"
'';

postInstall = ''
# systemd in NixOS doesn't use `systemctl enable`, so we need to establish
# aliases ourselves.
ln -s $out/etc/systemd/system/NetworkManager-dispatcher.service $out/etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service
Expand Down
11 changes: 11 additions & 0 deletions pkgs/tools/networking/network-manager/fix-docs-build.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
--- a/libnm/meson.build
+++ b/libnm/meson.build
@@ -262,6 +262,8 @@
'env', '-i',
'GI_TYPELIB_PATH=' + gi_typelib_path,
'LD_LIBRARY_PATH=' + ld_library_path,
+ 'LD_PRELOAD=' + '@DOCS_LD_PRELOAD@',
+ 'NIX_REDIRECTS=' + '@DOCS_NIX_REDIRECTS@',
]

name = 'nm-property-docs.xml'
25 changes: 25 additions & 0 deletions pkgs/tools/networking/network-manager/fix-install-paths.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
--- a/meson.build
+++ b/meson.build
@@ -925,9 +925,9 @@
join_paths('tools', 'meson-post-install.sh'),
nm_datadir,
nm_bindir,
- nm_pkgconfdir,
+ nm_prefix + nm_pkgconfdir,
nm_pkglibdir,
- nm_pkgstatedir,
+ nm_prefix + nm_pkgstatedir,
enable_docs ? 'install_docs' : '',
nm_mandir,
)
--- a/src/settings/plugins/ifcfg-rh/meson.build
+++ b/src/settings/plugins/ifcfg-rh/meson.build
@@ -70,7 +70,7 @@
)

meson.add_install_script('sh', '-c',
- 'mkdir -p $DESTDIR/@0@/sysconfig/network-scripts'.format(nm_sysconfdir))
+ 'mkdir -p $DESTDIR/@0@/sysconfig/network-scripts'.format(nm_prefix + nm_sysconfdir))

if enable_tests
subdir('tests')

1 comment on commit a961a28

@nixos-discourse
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This commit has been mentioned on Nix community. There might be relevant details there:

https://discourse.nixos.org/t/help-using-unstable-networkmanager/2869/2

Please sign in to comment.