diff mbox

[v2] systemd: allow to build with uClibc toolchains

Message ID 20170625182533.GA24682@waldemar-brodkorb.de
State Changes Requested
Headers show

Commit Message

Waldemar Brodkorb June 25, 2017, 6:25 p.m. UTC
Both patches where applied upstream.
We need to disable any systemd parts using either IDN or NSS.
IDN is only disabled in C library function call to getnaminfo(),
it does not effect libidn/libidn2 usage in systemd.

Tested in qemu-system-arm.

Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
---
v1 -> v2:
  - added Upstream commit URL suggested by Thomas Petazzoni
  - rework enable/disable options suggested by Thomas Petazzoni
  - extend commit message a little bit
---
 .../0004-Make-IDN-support-conditional.patch        | 74 ++++++++++++++++++++++
 ...0005-make-nss-systemd-support-conditional.patch | 62 ++++++++++++++++++
 package/systemd/Config.in                          |  2 +
 package/systemd/systemd.mk                         | 11 ++++
 system/Config.in                                   |  6 +-
 5 files changed, 152 insertions(+), 3 deletions(-)
 create mode 100644 package/systemd/0004-Make-IDN-support-conditional.patch
 create mode 100644 package/systemd/0005-make-nss-systemd-support-conditional.patch

Comments

Thomas Petazzoni Aug. 2, 2017, 8:15 p.m. UTC | #1
Hello,

On Sun, 25 Jun 2017 20:25:33 +0200, Waldemar Brodkorb wrote:
> Both patches where applied upstream.
> We need to disable any systemd parts using either IDN or NSS.
> IDN is only disabled in C library function call to getnaminfo(),
> it does not effect libidn/libidn2 usage in systemd.
> 
> Tested in qemu-system-arm.
> 
> Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
> ---
> v1 -> v2:
>   - added Upstream commit URL suggested by Thomas Petazzoni
>   - rework enable/disable options suggested by Thomas Petazzoni
>   - extend commit message a little bit
> ---
>  .../0004-Make-IDN-support-conditional.patch        | 74 ++++++++++++++++++++++
>  ...0005-make-nss-systemd-support-conditional.patch | 62 ++++++++++++++++++
>  package/systemd/Config.in                          |  2 +
>  package/systemd/systemd.mk                         | 11 ++++
>  system/Config.in                                   |  6 +-
>  5 files changed, 152 insertions(+), 3 deletions(-)
>  create mode 100644 package/systemd/0004-Make-IDN-support-conditional.patch
>  create mode 100644 package/systemd/0005-make-nss-systemd-support-conditional.patch

I've applied this patch on top of systemd 234 (which is nice because
the two patches you were adding can be dropped, as they are upstream).

Unfortunately, it fails to build:

In file included from src/libsystemd-network/sd-radv.c:23:0:
/home/thomas/projets/outputs/TestInitSystemSystemdRwFull/host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/include/linux/in6.h:30:8: error: redefinition of ‘struct in6_addr’
 struct in6_addr {
        ^
In file included from /home/thomas/projets/outputs/TestInitSystemSystemdRwFull/host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/include/netinet/icmp6.h:24:0,
                 from src/libsystemd-network/sd-radv.c:20:
/home/thomas/projets/outputs/TestInitSystemSystemdRwFull/host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/include/netinet/in.h:197:8: note: originally defined here
 struct in6_addr
        ^
In file included from src/libsystemd-network/sd-radv.c:23:0:
/home/thomas/projets/outputs/TestInitSystemSystemdRwFull/host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/include/linux/in6.h:41:8: error: redefinition of ‘struct sockaddr_in6’
 struct sockaddr_in6 {
        ^
In file included from /home/thomas/projets/outputs/TestInitSystemSystemdRwFull/host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/include/netinet/in.h:24:0,
                 from /home/thomas/projets/outputs/TestInitSystemSystemdRwFull/host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/include/netinet/icmp6.h:24,
                 from src/libsystemd-network/sd-radv.c:20:
/home/thomas/projets/outputs/TestInitSystemSystemdRwFull/host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/include/sys/socket.h:91:17: note: originally defined here
 typedef union { __SOCKADDR_ALLTYPES
                 ^
In file included from src/libsystemd-network/sd-radv.c:23:0:
/home/thomas/projets/outputs/TestInitSystemSystemdRwFull/host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/include/linux/in6.h:49:8: error: redefinition of ‘struct ipv6_mreq’
 struct ipv6_mreq {
        ^
In file included from /home/thomas/projets/outputs/TestInitSystemSystemdRwFull/host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/include/netinet/icmp6.h:24:0,
                 from src/libsystemd-network/sd-radv.c:20:
/home/thomas/projets/outputs/TestInitSystemSystemdRwFull/host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/include/netinet/in.h:278:8: note: originally defined here
 struct ipv6_mreq
        ^
Makefile:18205: recipe for target 'src/libsystemd-network/libsystemd_network_la-sd-radv.lo' failed
make[4]: *** [src/libsystemd-network/libsystemd_network_la-sd-radv.lo] Error 1

To produce this, I:

 - Tweaked InitSystemSystemdBase in
   support/testing/tests/init/test_systemd.py to use a pre-built uClibc
   toolchain

 - Removed the BR2_TOOLCHAIN_HAS_SSP dependency from INIT_SYSTEMD,
   because my pre-built uClibc does not have SSP support.

   I believe this dependency is no longer needed. Indeed, it was added
   in Buildroot commit 2c66e4429d23c6e293f9789cdef01b760399fccb, which
   bumped systemd to v207. However, in version v208, systemd changed
   the configure logic to use AC_LINK_IFELSE() instead of
   AC_COMPILE_IFELSE() to test if a given compiler flag is supported or
   not (see systemd commit d8c8508bad097c5cc354b684866a5b7a83fce394).
   Thanks to that, the configure script now properly detects that
   -fstack-protector is not supported, and systemd does not use it.
   Therefore, this BR2_TOOLCHAIN_HAS_SSP dependency can be removed.

 - Ran ./support/testing/run-tests -o ../outputs/ -k
   tests.init.test_systemd.TestInitSystemSystemdRwFull

And the build failed as shown above.

Could you have a look ?

Thanks!

Thomas
Waldemar Brodkorb Aug. 8, 2017, 4:39 p.m. UTC | #2
Hi Thomas,
Thomas Petazzoni wrote,

> Hello,
> 
> On Sun, 25 Jun 2017 20:25:33 +0200, Waldemar Brodkorb wrote:
> > Both patches where applied upstream.
> > We need to disable any systemd parts using either IDN or NSS.
> > IDN is only disabled in C library function call to getnaminfo(),
> > it does not effect libidn/libidn2 usage in systemd.
> > 
> > Tested in qemu-system-arm.
> > 
> > Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
> > ---
> > v1 -> v2:
> >   - added Upstream commit URL suggested by Thomas Petazzoni
> >   - rework enable/disable options suggested by Thomas Petazzoni
> >   - extend commit message a little bit
> > ---
> >  .../0004-Make-IDN-support-conditional.patch        | 74 ++++++++++++++++++++++
> >  ...0005-make-nss-systemd-support-conditional.patch | 62 ++++++++++++++++++
> >  package/systemd/Config.in                          |  2 +
> >  package/systemd/systemd.mk                         | 11 ++++
> >  system/Config.in                                   |  6 +-
> >  5 files changed, 152 insertions(+), 3 deletions(-)
> >  create mode 100644 package/systemd/0004-Make-IDN-support-conditional.patch
> >  create mode 100644 package/systemd/0005-make-nss-systemd-support-conditional.patch
> 
> I've applied this patch on top of systemd 234 (which is nice because
> the two patches you were adding can be dropped, as they are upstream).
> 
> Unfortunately, it fails to build:

I wasn't able to reproduce this issue with latest master.
Can you provide a defconfig using internal toolchain?

I updated the patch so that we are using the same patchset.
Maybe some issue resolved in the internal toolchain?

best regards
 Waldemar
diff mbox

Patch

diff --git a/package/systemd/0004-Make-IDN-support-conditional.patch b/package/systemd/0004-Make-IDN-support-conditional.patch
new file mode 100644
index 0000000..5729868
--- /dev/null
+++ b/package/systemd/0004-Make-IDN-support-conditional.patch
@@ -0,0 +1,74 @@ 
+Backported from:
+https://github.com/systemd/systemd/commit/6326a143263fc460bbda871d6e74b1d7d2841ea1
+
+From 6326a143263fc460bbda871d6e74b1d7d2841ea1 Mon Sep 17 00:00:00 2001
+From: Waldemar Brodkorb <wbx@openadk.org>
+Date: Thu, 15 Jun 2017 17:44:59 +0200
+Subject: [PATCH] Make IDN support conditional
+
+[zj: rename HAVE_IDN to ENABLE_IDN]
+
+Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
+---
+ configure.ac            | 10 ++++++++++
+ src/basic/socket-util.c |  9 +++++++--
+ 2 files changed, 17 insertions(+), 2 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index a47492d..3e7af76 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1050,6 +1050,15 @@ fi
+ AM_CONDITIONAL(HAVE_LIBIDN, [test "$have_libidn" = "yes"])
+ 
+ # ------------------------------------------------------------------------------
++have_idn=no
++AC_ARG_ENABLE(idn, AS_HELP_STRING([--disable-idn], [disable IDN when printing host names]))
++if test "x$enable_idn" != "xno"; then
++        have_idn=yes
++        AC_DEFINE(ENABLE_IDN, [1], [IDN is enabled])
++fi
++AM_CONDITIONAL(ENABLE_IDN, [test "$have_idn" = "yes"])
++
++# ------------------------------------------------------------------------------
+ have_libiptc=no
+ AC_ARG_ENABLE(libiptc, AS_HELP_STRING([--disable-libiptc], [disable optional LIBIPTC support]))
+ if test "x$enable_libiptc" != "xno"; then
+@@ -1742,6 +1751,7 @@ AC_MSG_RESULT([
+         libcurl:                           ${have_libcurl}
+         libidn2:                           ${have_libidn2}
+         libidn:                            ${have_libidn}
++        IDN:                               ${have_idn}
+         libiptc:                           ${have_libiptc}
+         ELFUTILS:                          ${have_elfutils}
+         binfmt:                            ${have_binfmt}
+diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c
+index e5847dc..49642c2 100644
+--- a/src/basic/socket-util.c
++++ b/src/basic/socket-util.c
+@@ -48,6 +48,12 @@
+ #include "utf8.h"
+ #include "util.h"
+ 
++#ifdef ENABLE_IDN
++#  define IDN_FLAGS (NI_IDN|NI_IDN_USE_STD3_ASCII_RULES)
++#else
++#  define IDN_FLAGS 0
++#endif
++
+ int socket_address_parse(SocketAddress *a, const char *s) {
+         char *e, *n;
+         unsigned u;
+@@ -723,8 +729,7 @@ int socknameinfo_pretty(union sockaddr_union *sa, socklen_t salen, char **_ret)
+ 
+         assert(_ret);
+ 
+-        r = getnameinfo(&sa->sa, salen, host, sizeof(host), NULL, 0,
+-                        NI_IDN|NI_IDN_USE_STD3_ASCII_RULES);
++        r = getnameinfo(&sa->sa, salen, host, sizeof(host), NULL, 0, IDN_FLAGS);
+         if (r != 0) {
+                 int saved_errno = errno;
+ 
+-- 
+2.1.4
+
diff --git a/package/systemd/0005-make-nss-systemd-support-conditional.patch b/package/systemd/0005-make-nss-systemd-support-conditional.patch
new file mode 100644
index 0000000..240d1d1
--- /dev/null
+++ b/package/systemd/0005-make-nss-systemd-support-conditional.patch
@@ -0,0 +1,62 @@ 
+Backported from:
+https://github.com/systemd/systemd/commit/e7e11bbf340f031223b56442b3aa4f4220fed315
+
+From e7e11bbf340f031223b56442b3aa4f4220fed315 Mon Sep 17 00:00:00 2001
+From: Waldemar Brodkorb <wbx-github@users.noreply.github.com>
+Date: Sat, 24 Jun 2017 19:30:26 +0200
+Subject: [PATCH] make nss-systemd support conditional (#6155)
+
+This allows the nss-systemd module to be disabled on minimal installations.
+
+Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
+
+[ Stripped down patch only touching autotool infrastructure ]
+---
+diff --git a/Makefile.am b/Makefile.am
+index 07b425e..4838df6 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -5280,6 +5280,7 @@ manual_tests += \
+ 	test-nss
+ 
+ # ------------------------------------------------------------------------------
++if ENABLE_NSS_SYSTEMD
+ libnss_systemd_la_SOURCES = \
+ 	src/nss-systemd/nss-systemd.sym \
+ 	src/nss-systemd/nss-systemd.c
+@@ -5299,6 +5300,7 @@ libnss_systemd_la_LIBADD = \
+ 
+ rootlib_LTLIBRARIES += \
+ 	libnss_systemd.la
++endif
+ 
+ # ------------------------------------------------------------------------------
+ if HAVE_MYHOSTNAME
+diff --git a/configure.ac b/configure.ac
+index 90e79d7..379f617 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1059,6 +1059,15 @@ fi
+ AM_CONDITIONAL(ENABLE_IDN, [test "$have_idn" = "yes"])
+ 
+ # ------------------------------------------------------------------------------
++have_nss_systemd=no
++AC_ARG_ENABLE(nss-systemd, AS_HELP_STRING([--disable-nss-systemd], [disable nss-systemd support]))
++if test "x$enable_nss_systemd" != "xno"; then
++        have_nss_systemd=yes
++        AC_DEFINE(ENABLE_NSS_SYSTEMD, [1], [nss-systemd is enabled])
++fi
++AM_CONDITIONAL(ENABLE_NSS_SYSTEMD, [test "$have_nss_systemd" = "yes"])
++
++# ------------------------------------------------------------------------------
+ have_libiptc=no
+ AC_ARG_ENABLE(libiptc, AS_HELP_STRING([--disable-libiptc], [disable optional LIBIPTC support]))
+ if test "x$enable_libiptc" != "xno"; then
+@@ -1801,6 +1810,7 @@ AC_MSG_RESULT([
+         dbus:                              ${have_dbus}
+         glib:                              ${have_glib}
+         nss-myhostname:                    ${have_myhostname}
++        nss-systemd:                       ${have_nss_systemd}
+         hwdb:                              ${enable_hwdb}
+         tpm:                               ${have_tpm}
+         Python:                            ${have_python}
diff --git a/package/systemd/Config.in b/package/systemd/Config.in
index 478cc10..e1b66f9 100644
--- a/package/systemd/Config.in
+++ b/package/systemd/Config.in
@@ -188,6 +188,7 @@  config BR2_PACKAGE_SYSTEMD_MACHINED
 
 config BR2_PACKAGE_SYSTEMD_MYHOSTNAME
 	bool "enable myhostname NSS plugin"
+	depends on !BR2_TOOLCHAIN_USES_UCLIBC
 	default y
 	help
 	  nss-myhostname is a plug-in module for the GNU Name Service
@@ -243,6 +244,7 @@  config BR2_PACKAGE_SYSTEMD_RANDOMSEED
 
 config BR2_PACKAGE_SYSTEMD_RESOLVED
 	bool "enable resolve daemon"
+	depends on !BR2_TOOLCHAIN_USES_UCLIBC
 	default y
 	help
 	  systemd-resolved is a system service that provides network
diff --git a/package/systemd/systemd.mk b/package/systemd/systemd.mk
index 153d615..5474a86 100644
--- a/package/systemd/systemd.mk
+++ b/package/systemd/systemd.mk
@@ -43,6 +43,17 @@  SYSTEMD_CONF_OPTS += \
 	--with-default-dnssec=no \
 	--without-python
 
+# disable unsupported features for non-glibc toolchains
+ifeq ($(BR2_TOOLCHAIN_USES_GLIBC),y)
+SYSTEMD_CONF_OPTS += \
+	--enable-idn \
+	--enable-nss-systemd
+else
+SYSTEMD_CONF_OPTS += \
+	--disable-idn \
+	--disable-nss-systemd
+endif
+
 SYSTEMD_CFLAGS = $(TARGET_CFLAGS) -fno-lto
 
 # Override paths to a few utilities needed at runtime, to
diff --git a/system/Config.in b/system/Config.in
index b47ae43..dc99b51 100644
--- a/system/Config.in
+++ b/system/Config.in
@@ -118,7 +118,7 @@  config BR2_INIT_SYSV
 config BR2_INIT_SYSTEMD
 	bool "systemd"
 	depends on BR2_PACKAGE_SYSTEMD_ARCH_SUPPORTS
-	depends on BR2_TOOLCHAIN_USES_GLIBC
+	depends on BR2_TOOLCHAIN_USES_GLIBC || BR2_TOOLCHAIN_USES_UCLIBC
 	depends on BR2_USE_WCHAR
 	depends on BR2_TOOLCHAIN_HAS_THREADS
 	depends on BR2_TOOLCHAIN_HAS_SSP
@@ -129,8 +129,8 @@  config BR2_INIT_SYSTEMD
 	select BR2_PACKAGE_SYSTEMD
 	select BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW if BR2_ROOTFS_SKELETON_DEFAULT
 
-comment "systemd needs a glibc toolchain, headers >= 3.10"
-	depends on !(BR2_TOOLCHAIN_USES_GLIBC \
+comment "systemd needs a glibc or uClibc toolchain, headers >= 3.10"
+	depends on !(BR2_TOOLCHAIN_USES_GLIBC || BR2_TOOLCHAIN_USES_UCLIBC \
 		&& BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_10)
 
 config BR2_INIT_NONE