From fc144a1428cdff292d2dc9d1a7440acd1e712aa0 Mon Sep 17 00:00:00 2001 From: Andreas Müller Date: Wed, 10 Apr 2019 20:23:28 +0200 Subject: networkmanager: rework musl build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit patches: * Split out systemd specifics * Simplfy patch to fix musl / linux-libc definition conflicts. This makes future maintenance less pain and fixes build for recipes depending on networkmanager. For further background read patch description in 0002-Fix-build-with-musl.patch musl CFLAGS: * -D__USE_POSIX199309 removed - could not find any trace of it * CFLAGS_libc-musl_append -> CFLAGS_append_libc-musl gobject-introspection: * enable - it builds perfectly fine Build tested (musl/glibc) with all dependents found in my layers: * network-manager-applet * networkmanager-openvpn * python-networkmanager * networkmanager-qt * plasma-nm * liri-networkmanager Signed-off-by: Andreas Müller Signed-off-by: Khem Raj --- ...0001-Fix-build-with-musl-systemd-specific.patch | 179 +++++++++++ .../musl/0001-Fix-build-with-musl.patch | 351 --------------------- .../musl/0002-Fix-build-with-musl.patch | 118 +++++++ .../networkmanager/networkmanager_1.16.0.bb | 26 +- 4 files changed, 315 insertions(+), 359 deletions(-) create mode 100644 meta-networking/recipes-connectivity/networkmanager/networkmanager/musl/0001-Fix-build-with-musl-systemd-specific.patch delete mode 100644 meta-networking/recipes-connectivity/networkmanager/networkmanager/musl/0001-Fix-build-with-musl.patch create mode 100644 meta-networking/recipes-connectivity/networkmanager/networkmanager/musl/0002-Fix-build-with-musl.patch diff --git a/meta-networking/recipes-connectivity/networkmanager/networkmanager/musl/0001-Fix-build-with-musl-systemd-specific.patch b/meta-networking/recipes-connectivity/networkmanager/networkmanager/musl/0001-Fix-build-with-musl-systemd-specific.patch new file mode 100644 index 0000000000..accd2f2569 --- /dev/null +++ b/meta-networking/recipes-connectivity/networkmanager/networkmanager/musl/0001-Fix-build-with-musl-systemd-specific.patch @@ -0,0 +1,179 @@ +From 7b09945585e6ce65049fa4039f26caee8daa44b9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Andreas=20M=C3=BCller?= +Date: Tue, 2 Apr 2019 01:34:35 +0200 +Subject: [PATCH 1/2] Fix build with musl - systemd specific +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Networkmanager imported some code from systemd. This requires some adjustments +for musl. + +Upstream-Status: Pending + +Signed-off-by: Andreas Müller +--- + shared/systemd/src/basic/in-addr-util.c | 1 + + shared/systemd/src/basic/process-util.c | 9 ++++++++ + shared/systemd/src/basic/socket-util.h | 6 +++++ + shared/systemd/src/basic/stdio-util.h | 2 ++ + shared/systemd/src/basic/string-util.h | 5 +++++ + shared/systemd/src/basic/util.h | 29 +++++-------------------- + 6 files changed, 28 insertions(+), 24 deletions(-) + +diff --git a/shared/systemd/src/basic/in-addr-util.c b/shared/systemd/src/basic/in-addr-util.c +index 5ced350..c6b52b8 100644 +--- a/shared/systemd/src/basic/in-addr-util.c ++++ b/shared/systemd/src/basic/in-addr-util.c +@@ -13,6 +13,7 @@ + #include "in-addr-util.h" + #include "macro.h" + #include "parse-util.h" ++#include "string-util.h" + #include "util.h" + + bool in4_addr_is_null(const struct in_addr *a) { +diff --git a/shared/systemd/src/basic/process-util.c b/shared/systemd/src/basic/process-util.c +index b0afb5c..7adc8bd 100644 +--- a/shared/systemd/src/basic/process-util.c ++++ b/shared/systemd/src/basic/process-util.c +@@ -21,6 +21,9 @@ + #include + #include + #include ++#ifndef __GLIBC__ ++#include ++#endif + #if 0 /* NM_IGNORED */ + #if HAVE_VALGRIND_VALGRIND_H + #include +@@ -1168,11 +1171,13 @@ void reset_cached_pid(void) { + cached_pid = CACHED_PID_UNSET; + } + ++#ifdef __GLIBC__ + /* We use glibc __register_atfork() + __dso_handle directly here, as they are not included in the glibc + * headers. __register_atfork() is mostly equivalent to pthread_atfork(), but doesn't require us to link against + * libpthread, as it is part of glibc anyway. */ + extern int __register_atfork(void (*prepare) (void), void (*parent) (void), void (*child) (void), void *dso_handle); + extern void* __dso_handle _weak_; ++#endif + + pid_t getpid_cached(void) { + static bool installed = false; +@@ -1201,7 +1206,11 @@ pid_t getpid_cached(void) { + * only half-documented (glibc doesn't document it but LSB does — though only superficially) + * we'll check for errors only in the most generic fashion possible. */ + ++#ifdef __GLIBC__ + if (__register_atfork(NULL, NULL, reset_cached_pid, __dso_handle) != 0) { ++#else ++ if (pthread_atfork(NULL, NULL, reset_cached_pid) != 0) { ++#endif + /* OOM? Let's try again later */ + cached_pid = CACHED_PID_UNSET; + return new_pid; +diff --git a/shared/systemd/src/basic/socket-util.h b/shared/systemd/src/basic/socket-util.h +index d2246a8..76f257f 100644 +--- a/shared/systemd/src/basic/socket-util.h ++++ b/shared/systemd/src/basic/socket-util.h +@@ -13,6 +13,12 @@ + #include + #include + ++#if !defined(__GLIBC__) ++/* SIOCGSTAMPNS from linux/asm-generic.h ++ * for src/systemd/src/libsystemd-network/sd-lldp.c */ ++#include ++#endif ++ + #include "macro.h" + #include "missing_socket.h" + #include "sparse-endian.h" +diff --git a/shared/systemd/src/basic/stdio-util.h b/shared/systemd/src/basic/stdio-util.h +index dc67b6e..6336243 100644 +--- a/shared/systemd/src/basic/stdio-util.h ++++ b/shared/systemd/src/basic/stdio-util.h +@@ -1,7 +1,9 @@ + /* SPDX-License-Identifier: LGPL-2.1+ */ + #pragma once + ++#if defined(__GLIBC__) + #include ++#endif + #include + #include + #include +diff --git a/shared/systemd/src/basic/string-util.h b/shared/systemd/src/basic/string-util.h +index 38070ab..6b918e0 100644 +--- a/shared/systemd/src/basic/string-util.h ++++ b/shared/systemd/src/basic/string-util.h +@@ -27,6 +27,11 @@ + #define strcaseeq(a,b) (strcasecmp((a),(b)) == 0) + #define strncaseeq(a, b, n) (strncasecmp((a), (b), (n)) == 0) + ++/* musl does not know strndupa */ ++#if !defined(__GLIBC__) ++#define strndupa(x,s) strncpy(alloca(strlen(x)+1),x,s) ++#endif ++ + int strcmp_ptr(const char *a, const char *b) _pure_; + + static inline bool streq_ptr(const char *a, const char *b) { +diff --git a/shared/systemd/src/basic/util.h b/shared/systemd/src/basic/util.h +index dc33d66..cc768e9 100644 +--- a/shared/systemd/src/basic/util.h ++++ b/shared/systemd/src/basic/util.h +@@ -27,6 +27,11 @@ + #include "macro.h" + #include "time-util.h" + ++#if !defined(__GLIBC__) ++typedef int (*__compar_fn_t) (const void*, const void*); ++typedef __compar_fn_t comparison_fn_t; ++#endif ++ + size_t page_size(void) _pure_; + #define PAGE_ALIGN(l) ALIGN_TO((l), page_size()) + +@@ -66,16 +71,6 @@ int prot_from_flags(int flags) _const_; + bool in_initrd(void); + void in_initrd_force(bool value); + +-void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size, +- __compar_d_fn_t compar, void *arg); +- +-#define typesafe_bsearch_r(k, b, n, func, userdata) \ +- ({ \ +- const typeof(b[0]) *_k = k; \ +- int (*_func_)(const typeof(b[0])*, const typeof(b[0])*, typeof(userdata)) = func; \ +- xbsearch_r((const void*) _k, (b), (n), sizeof((b)[0]), (__compar_d_fn_t) _func_, userdata); \ +- }) +- + /** + * Normal bsearch requires base to be nonnull. Here were require + * that only if nmemb > 0. +@@ -116,20 +111,6 @@ static inline void qsort_safe(void *base, size_t nmemb, size_t size, __compar_fn + qsort_safe((p), (n), sizeof((p)[0]), (__compar_fn_t) _func_); \ + }) + +-static inline void qsort_r_safe(void *base, size_t nmemb, size_t size, __compar_d_fn_t compar, void *userdata) { +- if (nmemb <= 1) +- return; +- +- assert(base); +- qsort_r(base, nmemb, size, compar, userdata); +-} +- +-#define typesafe_qsort_r(p, n, func, userdata) \ +- ({ \ +- int (*_func_)(const typeof(p[0])*, const typeof(p[0])*, typeof(userdata)) = func; \ +- qsort_r_safe((p), (n), sizeof((p)[0]), (__compar_d_fn_t) _func_, userdata); \ +- }) +- + /* Normal memcpy requires src to be nonnull. We do nothing if n is 0. */ + static inline void memcpy_safe(void *dst, const void *src, size_t n) { + if (n == 0) +-- +2.20.1 + diff --git a/meta-networking/recipes-connectivity/networkmanager/networkmanager/musl/0001-Fix-build-with-musl.patch b/meta-networking/recipes-connectivity/networkmanager/networkmanager/musl/0001-Fix-build-with-musl.patch deleted file mode 100644 index b3f93ff92b..0000000000 --- a/meta-networking/recipes-connectivity/networkmanager/networkmanager/musl/0001-Fix-build-with-musl.patch +++ /dev/null @@ -1,351 +0,0 @@ -From f43c9a5b07832a91383e59d655bc3c8a9f48c451 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Andreas=20M=C3=BCller?= -Date: Tue, 2 Apr 2019 01:34:35 +0200 -Subject: [PATCH] Fix build with musl -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Upstream-Status: Pending - -Signed-off-by: Andreas Müller ---- - clients/cli/connections.c | 1 - - libnm-core/nm-utils.c | 2 +- - shared/n-acd/src/n-acd.c | 1 - - shared/systemd/src/basic/in-addr-util.c | 1 + - shared/systemd/src/basic/process-util.c | 9 ++++++ - shared/systemd/src/basic/socket-util.h | 6 ++++ - shared/systemd/src/basic/stdio-util.h | 2 ++ - shared/systemd/src/basic/string-util.h | 5 ++++ - shared/systemd/src/basic/util.h | 29 ++++---------------- - src/platform/wifi/nm-wifi-utils.h | 4 +++ - src/platform/wpan/nm-wpan-utils.h | 2 -- - src/settings/nm-settings-connection.h | 2 -- - src/systemd/src/libsystemd-network/sd-lldp.c | 1 + - src/systemd/src/systemd/sd-dhcp-client.h | 2 ++ - src/systemd/src/systemd/sd-dhcp-lease.h | 2 ++ - src/systemd/src/systemd/sd-dhcp6-client.h | 2 ++ - src/systemd/src/systemd/sd-ipv4ll.h | 2 ++ - src/systemd/src/systemd/sd-lldp.h | 2 +- - 19 files changed, 44 insertions(+), 32 deletions(-) - -diff --git a/clients/cli/connections.c b/clients/cli/connections.c -index 6db44f8..36e51cc 100644 ---- a/clients/cli/connections.c -+++ b/clients/cli/connections.c -@@ -25,7 +25,6 @@ - #include - #include - #include --#include - #include - #include - #include -diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c -index d276cfe..2aec785 100644 ---- a/libnm-core/nm-utils.c -+++ b/libnm-core/nm-utils.c -@@ -21,10 +21,10 @@ - - #include "nm-default.h" - -+#include - #include "nm-utils.h" - - #include --#include - #include - #include - #include -diff --git a/shared/n-acd/src/n-acd.c b/shared/n-acd/src/n-acd.c -index def56a2..dd4eb78 100644 ---- a/shared/n-acd/src/n-acd.c -+++ b/shared/n-acd/src/n-acd.c -@@ -11,7 +11,6 @@ - #include - #include - #include --#include - #include - #include - #include -diff --git a/shared/systemd/src/basic/in-addr-util.c b/shared/systemd/src/basic/in-addr-util.c -index 5ced350..c6b52b8 100644 ---- a/shared/systemd/src/basic/in-addr-util.c -+++ b/shared/systemd/src/basic/in-addr-util.c -@@ -13,6 +13,7 @@ - #include "in-addr-util.h" - #include "macro.h" - #include "parse-util.h" -+#include "string-util.h" - #include "util.h" - - bool in4_addr_is_null(const struct in_addr *a) { -diff --git a/shared/systemd/src/basic/process-util.c b/shared/systemd/src/basic/process-util.c -index b0afb5c..7adc8bd 100644 ---- a/shared/systemd/src/basic/process-util.c -+++ b/shared/systemd/src/basic/process-util.c -@@ -21,6 +21,9 @@ - #include - #include - #include -+#ifndef __GLIBC__ -+#include -+#endif - #if 0 /* NM_IGNORED */ - #if HAVE_VALGRIND_VALGRIND_H - #include -@@ -1168,11 +1171,13 @@ void reset_cached_pid(void) { - cached_pid = CACHED_PID_UNSET; - } - -+#ifdef __GLIBC__ - /* We use glibc __register_atfork() + __dso_handle directly here, as they are not included in the glibc - * headers. __register_atfork() is mostly equivalent to pthread_atfork(), but doesn't require us to link against - * libpthread, as it is part of glibc anyway. */ - extern int __register_atfork(void (*prepare) (void), void (*parent) (void), void (*child) (void), void *dso_handle); - extern void* __dso_handle _weak_; -+#endif - - pid_t getpid_cached(void) { - static bool installed = false; -@@ -1201,7 +1206,11 @@ pid_t getpid_cached(void) { - * only half-documented (glibc doesn't document it but LSB does — though only superficially) - * we'll check for errors only in the most generic fashion possible. */ - -+#ifdef __GLIBC__ - if (__register_atfork(NULL, NULL, reset_cached_pid, __dso_handle) != 0) { -+#else -+ if (pthread_atfork(NULL, NULL, reset_cached_pid) != 0) { -+#endif - /* OOM? Let's try again later */ - cached_pid = CACHED_PID_UNSET; - return new_pid; -diff --git a/shared/systemd/src/basic/socket-util.h b/shared/systemd/src/basic/socket-util.h -index d2246a8..76f257f 100644 ---- a/shared/systemd/src/basic/socket-util.h -+++ b/shared/systemd/src/basic/socket-util.h -@@ -13,6 +13,12 @@ - #include - #include - -+#if !defined(__GLIBC__) -+/* SIOCGSTAMPNS from linux/asm-generic.h -+ * for src/systemd/src/libsystemd-network/sd-lldp.c */ -+#include -+#endif -+ - #include "macro.h" - #include "missing_socket.h" - #include "sparse-endian.h" -diff --git a/shared/systemd/src/basic/stdio-util.h b/shared/systemd/src/basic/stdio-util.h -index dc67b6e..6336243 100644 ---- a/shared/systemd/src/basic/stdio-util.h -+++ b/shared/systemd/src/basic/stdio-util.h -@@ -1,7 +1,9 @@ - /* SPDX-License-Identifier: LGPL-2.1+ */ - #pragma once - -+#if defined(__GLIBC__) - #include -+#endif - #include - #include - #include -diff --git a/shared/systemd/src/basic/string-util.h b/shared/systemd/src/basic/string-util.h -index 38070ab..6b918e0 100644 ---- a/shared/systemd/src/basic/string-util.h -+++ b/shared/systemd/src/basic/string-util.h -@@ -27,6 +27,11 @@ - #define strcaseeq(a,b) (strcasecmp((a),(b)) == 0) - #define strncaseeq(a, b, n) (strncasecmp((a), (b), (n)) == 0) - -+/* musl does not know strndupa */ -+#if !defined(__GLIBC__) -+#define strndupa(x,s) strncpy(alloca(strlen(x)+1),x,s) -+#endif -+ - int strcmp_ptr(const char *a, const char *b) _pure_; - - static inline bool streq_ptr(const char *a, const char *b) { -diff --git a/shared/systemd/src/basic/util.h b/shared/systemd/src/basic/util.h -index dc33d66..cc768e9 100644 ---- a/shared/systemd/src/basic/util.h -+++ b/shared/systemd/src/basic/util.h -@@ -27,6 +27,11 @@ - #include "macro.h" - #include "time-util.h" - -+#if !defined(__GLIBC__) -+typedef int (*__compar_fn_t) (const void*, const void*); -+typedef __compar_fn_t comparison_fn_t; -+#endif -+ - size_t page_size(void) _pure_; - #define PAGE_ALIGN(l) ALIGN_TO((l), page_size()) - -@@ -66,16 +71,6 @@ int prot_from_flags(int flags) _const_; - bool in_initrd(void); - void in_initrd_force(bool value); - --void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size, -- __compar_d_fn_t compar, void *arg); -- --#define typesafe_bsearch_r(k, b, n, func, userdata) \ -- ({ \ -- const typeof(b[0]) *_k = k; \ -- int (*_func_)(const typeof(b[0])*, const typeof(b[0])*, typeof(userdata)) = func; \ -- xbsearch_r((const void*) _k, (b), (n), sizeof((b)[0]), (__compar_d_fn_t) _func_, userdata); \ -- }) -- - /** - * Normal bsearch requires base to be nonnull. Here were require - * that only if nmemb > 0. -@@ -116,20 +111,6 @@ static inline void qsort_safe(void *base, size_t nmemb, size_t size, __compar_fn - qsort_safe((p), (n), sizeof((p)[0]), (__compar_fn_t) _func_); \ - }) - --static inline void qsort_r_safe(void *base, size_t nmemb, size_t size, __compar_d_fn_t compar, void *userdata) { -- if (nmemb <= 1) -- return; -- -- assert(base); -- qsort_r(base, nmemb, size, compar, userdata); --} -- --#define typesafe_qsort_r(p, n, func, userdata) \ -- ({ \ -- int (*_func_)(const typeof(p[0])*, const typeof(p[0])*, typeof(userdata)) = func; \ -- qsort_r_safe((p), (n), sizeof((p)[0]), (__compar_d_fn_t) _func_, userdata); \ -- }) -- - /* Normal memcpy requires src to be nonnull. We do nothing if n is 0. */ - static inline void memcpy_safe(void *dst, const void *src, size_t n) { - if (n == 0) -diff --git a/src/platform/wifi/nm-wifi-utils.h b/src/platform/wifi/nm-wifi-utils.h -index 36148b5..d282eb2 100644 ---- a/src/platform/wifi/nm-wifi-utils.h -+++ b/src/platform/wifi/nm-wifi-utils.h -@@ -22,7 +22,11 @@ - #ifndef __WIFI_UTILS_H__ - #define __WIFI_UTILS_H__ - -+#if defined(__GLIBC__) - #include -+#else /* musl libc */ -+#define ETH_ALEN 6 /* Octets in one ethernet addr */ -+#endif - - #include "nm-dbus-interface.h" - #include "nm-setting-wireless.h" -diff --git a/src/platform/wpan/nm-wpan-utils.h b/src/platform/wpan/nm-wpan-utils.h -index 1b54ec4..ed39938 100644 ---- a/src/platform/wpan/nm-wpan-utils.h -+++ b/src/platform/wpan/nm-wpan-utils.h -@@ -20,8 +20,6 @@ - #ifndef __WPAN_UTILS_H__ - #define __WPAN_UTILS_H__ - --#include -- - #include "nm-dbus-interface.h" - #include "platform/nm-netlink.h" - -diff --git a/src/settings/nm-settings-connection.h b/src/settings/nm-settings-connection.h -index e796b71..c01fef6 100644 ---- a/src/settings/nm-settings-connection.h -+++ b/src/settings/nm-settings-connection.h -@@ -22,8 +22,6 @@ - #ifndef __NETWORKMANAGER_SETTINGS_CONNECTION_H__ - #define __NETWORKMANAGER_SETTINGS_CONNECTION_H__ - --#include -- - #include "nm-dbus-object.h" - #include "nm-connection.h" - -diff --git a/src/systemd/src/libsystemd-network/sd-lldp.c b/src/systemd/src/libsystemd-network/sd-lldp.c -index 741128e..62914ae 100644 ---- a/src/systemd/src/libsystemd-network/sd-lldp.c -+++ b/src/systemd/src/libsystemd-network/sd-lldp.c -@@ -3,6 +3,7 @@ - #include "nm-sd-adapt-core.h" - - #include -+#include - #include - #include - -diff --git a/src/systemd/src/systemd/sd-dhcp-client.h b/src/systemd/src/systemd/sd-dhcp-client.h -index bd0d429..c935fe1 100644 ---- a/src/systemd/src/systemd/sd-dhcp-client.h -+++ b/src/systemd/src/systemd/sd-dhcp-client.h -@@ -20,7 +20,9 @@ - ***/ - - #include -+#if defined(__GLIBC__) - #include -+#endif - #include - #include - #include -diff --git a/src/systemd/src/systemd/sd-dhcp-lease.h b/src/systemd/src/systemd/sd-dhcp-lease.h -index d299c79..991e67e 100644 ---- a/src/systemd/src/systemd/sd-dhcp-lease.h -+++ b/src/systemd/src/systemd/sd-dhcp-lease.h -@@ -19,7 +19,9 @@ - ***/ - - #include -+#if defined(__GLIBC__) - #include -+#endif - #include - #include - -diff --git a/src/systemd/src/systemd/sd-dhcp6-client.h b/src/systemd/src/systemd/sd-dhcp6-client.h -index 43d38f5..57ab487 100644 ---- a/src/systemd/src/systemd/sd-dhcp6-client.h -+++ b/src/systemd/src/systemd/sd-dhcp6-client.h -@@ -20,7 +20,9 @@ - ***/ - - #include -+#if defined(__GLIBC__) - #include -+#endif - #include - - #include "sd-dhcp6-lease.h" -diff --git a/src/systemd/src/systemd/sd-ipv4ll.h b/src/systemd/src/systemd/sd-ipv4ll.h -index 71bd4cf..1c667ba 100644 ---- a/src/systemd/src/systemd/sd-ipv4ll.h -+++ b/src/systemd/src/systemd/sd-ipv4ll.h -@@ -19,7 +19,9 @@ - along with systemd; If not, see . - ***/ - -+#if defined(__GLIBC__) - #include -+#endif - #include - - #include "sd-event.h" -diff --git a/src/systemd/src/systemd/sd-lldp.h b/src/systemd/src/systemd/sd-lldp.h -index bf3afad..4cace87 100644 ---- a/src/systemd/src/systemd/sd-lldp.h -+++ b/src/systemd/src/systemd/sd-lldp.h -@@ -18,7 +18,7 @@ - ***/ - - #include --#include -+//#include - #include - - #include "sd-event.h" --- -2.20.1 - diff --git a/meta-networking/recipes-connectivity/networkmanager/networkmanager/musl/0002-Fix-build-with-musl.patch b/meta-networking/recipes-connectivity/networkmanager/networkmanager/musl/0002-Fix-build-with-musl.patch new file mode 100644 index 0000000000..25f9a4a001 --- /dev/null +++ b/meta-networking/recipes-connectivity/networkmanager/networkmanager/musl/0002-Fix-build-with-musl.patch @@ -0,0 +1,118 @@ +From 0b0f2d5abe27b2c9587f449795f0ae3568fc3e38 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Andreas=20M=C3=BCller?= +Date: Mon, 8 Apr 2019 23:10:43 +0200 +Subject: [PATCH 2/2] Fix build with musl +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The build issues caused by definition conflicts musl vs linux-libc headers +(error: redefinition of ...) can be reduced to two headers: + +1. netinet/if_ether.h <-> linux/if_ether.h: linux-libc header plays well with + glibc and musl headers in case libc's variant (netinet/if_ether.h) is + included BEFORE linux variant [1]. We add include at two positions: + 1. shared/nm-default.h: This is a global which used for networkmanager and + is included at the very beginning of all c-files. + 2. libnm-core/nm-utils.h: This file makes it into installation and is used + by dependent packages as network-manager-applet +2. net/if_arp. <-> linux/if_ether.h: linux-libc: Unfortunaly these files do + not play together in harmony. Therefore the libc variant is included early in + shared/nm-default.h and occurances linux/if_arp.h are removed. + +Note: +Be aware that this is still nasty business: We have to trust that musl headers +define same signatures as linux would do - just because musl-makers consider +linux-libc headers 'notoriously broken for userspace' [2] (search for +'error: redefinition of'). + +[1] http://lists.openembedded.org/pipermail/openembedded-core/2019-March/280440.html +[2] https://wiki.musl-libc.org/faq.html + +Upstream-Status: Pending + +Signed-off-by: Andreas Müller +--- + clients/tui/nmt-device-entry.c | 1 - + libnm-core/nm-utils.h | 4 ++++ + shared/nm-default.h | 3 +++ + src/devices/nm-device.c | 2 +- + src/platform/nm-linux-platform.c | 1 - + 5 files changed, 8 insertions(+), 3 deletions(-) + +diff --git a/clients/tui/nmt-device-entry.c b/clients/tui/nmt-device-entry.c +index 43fbbc1..3eae286 100644 +--- a/clients/tui/nmt-device-entry.c ++++ b/clients/tui/nmt-device-entry.c +@@ -39,7 +39,6 @@ + #include "nmt-device-entry.h" + + #include +-#include + + #include "nmtui.h" + +diff --git a/libnm-core/nm-utils.h b/libnm-core/nm-utils.h +index 2b5baba..8a50131 100644 +--- a/libnm-core/nm-utils.h ++++ b/libnm-core/nm-utils.h +@@ -25,6 +25,10 @@ + #error "Only can be included directly." + #endif + ++/* include as early as possible for musl */ ++#include ++/* #include - uncoment for broken dependents?? */ ++ + #include + + #include +diff --git a/shared/nm-default.h b/shared/nm-default.h +index 26d6476..b29e8af 100644 +--- a/shared/nm-default.h ++++ b/shared/nm-default.h +@@ -211,6 +211,9 @@ + #endif + + #include ++/* include as early as possible for musl */ ++#include ++#include + + /*****************************************************************************/ + +diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c +index 7514fa7..d305fa5 100644 +--- a/src/devices/nm-device.c ++++ b/src/devices/nm-device.c +@@ -24,6 +24,7 @@ + #include "nm-device.h" + + #include ++#include + #include + #include + #include +@@ -32,7 +33,6 @@ + #include + #include + #include +-#include + #include + #include + +diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c +index 2f5c75b..d6ca6d9 100644 +--- a/src/platform/nm-linux-platform.c ++++ b/src/platform/nm-linux-platform.c +@@ -27,7 +27,6 @@ + #include + #include + #include +-#include + #include + #include + #include +-- +2.20.1 + diff --git a/meta-networking/recipes-connectivity/networkmanager/networkmanager_1.16.0.bb b/meta-networking/recipes-connectivity/networkmanager/networkmanager_1.16.0.bb index 9f57908e96..9f01f1bc1a 100644 --- a/meta-networking/recipes-connectivity/networkmanager/networkmanager_1.16.0.bb +++ b/meta-networking/recipes-connectivity/networkmanager/networkmanager_1.16.0.bb @@ -28,7 +28,10 @@ SRC_URI = " \ file://0002-Do-not-create-settings-settings-property-documentati.patch \ file://0003-dlopen-failure.patch \ " -SRC_URI_append_libc-musl = " file://musl/0001-Fix-build-with-musl.patch" +SRC_URI_append_libc-musl = " \ + file://musl/0001-Fix-build-with-musl-systemd-specific.patch \ + file://musl/0002-Fix-build-with-musl.patch \ +" SRC_URI[md5sum] = "10abacaafb162a67d2942adf03e7e9e4" SRC_URI[sha256sum] = "8e962833b6ca03edda1bc57ed6614a7b8c2339531b44acef098d05f2324c5d2c" @@ -47,13 +50,20 @@ EXTRA_OECONF = " \ --with-udev-dir=${nonarch_base_libdir}/udev \ " -# gobject-introspection related -GI_DATA_ENABLED_libc-musl = "False" - -# stolen from https://github.com/voidlinux/void-packages/blob/master/srcpkgs/NetworkManager/template -CFLAGS_libc-musl_append = " \ - -DHAVE_SECURE_GETENV -Dsecure_getenv=getenv \ - -D__USE_POSIX199309 -DRTLD_DEEPBIND=0 \ +# stolen from https://github.com/void-linux/void-packages/blob/master/srcpkgs/NetworkManager/template +# avoids: +# | ../NetworkManager-1.16.0/libnm-core/nm-json.c:106:50: error: 'RTLD_DEEPBIND' undeclared (first use in this function); did you mean 'RTLD_DEFAULT'? +# +# and +# +# | In file included from ../NetworkManager-1.16.0/src/systemd/nm-sd-utils-core.c:25: +# | ../NetworkManager-1.16.0/src/systemd/sd-adapt-core/nm-sd-adapt-core.h:68:6: error: #error neither secure_getenv nor __secure_getenv is available +# | # error neither secure_getenv nor __secure_getenv is available +# | ^~~~~ +CFLAGS_append_libc-musl = " \ + -DRTLD_DEEPBIND=0 \ + -DHAVE_SECURE_GETENV \ + -Dsecure_getenv=getenv \ " do_compile_prepend() { -- cgit v1.2.3-54-g00ecf