NetworkManager/shared
Thomas Haller b13a2b27e9
all: move shared/nm-meta-setting.[hc] to libnm-core and clients
"shared/nm-meta-setting.[hc]" contains meta data about settings.
As such it is similarly used by libnm-core (as internal API) and
by clients (as extension of public API of libnm). However, it must
be compiled twice, because while it defines in both cases a
NMMetaSettingInfo type, these types are different between internal and
public API.
Hence, the files must also be compiled twice (and differently), once
against libnm-core and once against the client helper library.

Previously, the file was under "shared/", but there it's a bit odd
it doesn't clearly belong anywhere.

There are two goals here:

 - copy the file to the two places where it is used. We also have
   a "check-tree" unit test that ensures those files don't diverge in
   the future.

 - we no longer require CFLAGS set during built. Instead, the sources
   should control the build. For that we have new (simple) headers
   "nm-meta-setting-base.h" that define the right behavior for the
   impl files.

There is still an ugliness (among several): the files must be named the
same for libnm-core and clients/common. Preferably, all our sources have
unique names, but that is not possible with this scheme (without
introducing other ugliness). To mitigate that, include the files only at
one exact place.
2021-02-09 12:38:19 +01:00
..
c-list shared/c-list: reimport 2021-01-20 11:07:23 +01:00
c-rbtree shared/c-rbtree: reimport 2021-01-15 11:16:25 +01:00
c-siphash shared/c-siphash: reimport 2021-01-15 11:17:32 +01:00
c-stdaux shared/c-siphash: reimport 2021-01-15 11:19:04 +01:00
n-acd all: fix minor typos 2020-07-07 11:33:46 +02:00
n-dhcp4 shared/n-dhcp4: reimport 2021-01-20 11:02:24 +01:00
nm-base shared: copy file instead of symlink "nm-ethtool-utils.h" 2021-02-09 12:38:19 +01:00
nm-glib-aux all: add "nm-default-systemd{,-shared}.h" as replacement for "nm-default.h" 2021-02-09 12:38:18 +01:00
nm-log-core all: add "nm-glib-aux/nm-default-glib-i18n-lib.h" as replacement for "nm-default.h" 2021-02-09 12:38:17 +01:00
nm-platform all: add "nm-default-systemd{,-shared}.h" as replacement for "nm-default.h" 2021-02-09 12:38:18 +01:00
nm-std-aux shared: remove unused "shared/nm-default.h" 2021-02-09 12:38:18 +01:00
nm-udev-aux all: add "nm-glib-aux/nm-default-glib-i18n-lib.h" as replacement for "nm-default.h" 2021-02-09 12:38:17 +01:00
nm-utils all: add "nm-default-systemd{,-shared}.h" as replacement for "nm-default.h" 2021-02-09 12:38:18 +01:00
systemd all: add "nm-default-systemd{,-shared}.h" as replacement for "nm-default.h" 2021-02-09 12:38:18 +01:00
meson.build all: move shared/nm-meta-setting.[hc] to libnm-core and clients 2021-02-09 12:38:19 +01:00
nm-gassert-patch.h shared: split redefining g_return* warning out of "nm-default.h" 2021-01-27 21:30:20 +01:00
nm-test-libnm-utils.h all: update deprecated SPDX license identifiers 2021-01-05 09:46:21 +01:00
nm-test-utils-impl.c all: add "libnm/nm-default-libnm.h" as replacement for "nm-default.h" 2021-02-09 12:38:18 +01:00
nm-version-macros.h.in all: update deprecated SPDX license identifiers 2021-01-05 09:46:21 +01:00
README.md shared: add "shared/README.md" 2021-01-15 12:17:15 +01:00

The "shared/" Directory

For NetworkManager we place helper/utility code under "shared/" in static libraries. The idea is to avoid code duplication but also provide high quality helper functions that simplify the higher layers. In NetworkManager there are complicated parts, for example "src/nm-manager.c" is huge. On the other hand, this helper code should be simple and easy to understand, so that we can build more complex code on top of it.

As we statically link them into our binaries, they are all inherently internal API, that means they cannot be part of libnm's (libnm-core's) public API. It also means that their API/ABI is not stable.

We don't care these libraries to be minimal and contain only symbols that are used by all users. Instead, we expect the linker to throw away unused symbols. We achieve this by having a symbol versioning file to hide internal symbols (which gives the linker a possibility to remove them if they are unused) and compiling with LTO or "-Wl,--gc-sections". Let the tool solve this and not manual organization.

Hence these libraries (and their content) are structured this way to satisfy the following questions:

  1. which dependencies (libraries) do they have? That determines which other libraries can use it. For example:

    • "shared/nm-std-aux" and "shared/nm-glib-aux" both provide general purpose helpers, the difference is that the former has no dependency on glib2 library. Both these libraries are a basic dependency for many other parts of the code.

    • "shared/nm-udev-aux" has a dependency on libudev, it thus cannot be in "shared/nm-glib-aux".

    • client code also has a glib2 dependency. That means it can link with "shared/nm-std-aux" and "shared/nm-glib-aux", but must not link with "shared/nm-udev-aux" (as it has no direct udev dependenct -- although clients get it indirectly because libnm already requires it).

  2. what is their overall purpose? As said, we rely on the linker to prune unused symbols. But in a few cases we avoid to merge different code in the same library. For example:

    • "shared/nm-glib-aux" and "shared/nm-base" both only have a glib2 dependency. Hence, they could be merged. However we don't do that because "shared/nm-base" is more about NetworkManager specific code, while "shared/nm-glib-aux" is about general purpose helpers.
  3. some of these libraries are forked from an upstream. They are kept separate so that we can re-import future upstream versions.

Detail

  • shared/c-list

  • shared/c-rbtree

  • shared/c-siphash

  • shared/c-stdoux

  • shared/n-acd

  • shared/n-dhcp4

    These are forked from upstream and imported with git-subtree. They in general only have a libc dependency (or dependencies between each other).

  • shared/nm-std-aux

    This contains helper code with only a libc dependency. Almost all C code depends on this library.

  • shared/nm-glib-aux

    Like "shared/nm-std-aux" but also has a glib2 dependency. Almost all glib2 code depends on this library.

  • shared/nm-udev/aux

    Like "shared/nm-glib-aux" but also has a libudev dependency. It has code related to libudev.

  • shared/systemd

    These are forked from upstream systemd and imported with a script. Under "shared/systemd/src" we try to keep the sources as close to the original as possible. There is also some adapter code to make it useable for us. It has a dependency on "shared/nm-glib-aux" and will need a logging implementation for "shared/nm-glib-aux/nm-logging-fwd.h".

  • shared/nm-base

    Depends on "shared/nm-glib-aux" and glib2 but it provides helper code that more about NetworkManager specifc things.

  • shared/nm-log-core

    This is the logging implementation as used by NetworkManager core ("src/"). It is also a dependency for "shared/nm-platform".

  • shared/nm-platform

    Platform implementation. It depends on "shared/nm-log-core", "shared/nm-base" and "shared/nm-glib-aux".

  • Other than that, there are still a few unorganized files/directories here. These should be cleaned up.