[Buildroot] musl/gettext issue

Thomas Petazzoni thomas.petazzoni at free-electrons.com
Wed Sep 16 20:16:36 UTC 2015


Hello,

Today, I started looking at:

   http://autobuild.buildroot.org/results/ede/ede5ee3316ea2b6790dcb930a6bc71adc8922bfc/build-end.log

Which, in appearance, seems to be the traditional missing -lintl when
linking. But further investigation has revealed a slightly more
complicated problem: how do we handle GNU gettext vs. musl.

Until, we were handling GNU gettext for glibc and uClibc:

 * With glibc, the gettext handling is built into the C library. So the
   separate GNU gettext package (for the target) is not needed, and if
   it ever gets built, it detects that the C library has the necessary
   features, and therefore it doesn't build/install a libintl.so
   library and its header files.

 * With uclibc, the gettext handling is not part of the C library, so
   we have to build the GNU gettext package when gettext support is
   needed. In this case, the GNU gettext package detects that the C
   library does not provide the gettext functionality, and it will
   build/install libintl.so and its header files.

This is why we have BR2_NEEDS_GETTEXT which is true when we use uClibc
and false when we use uClibc, and BR2_NEEDS_GETTEXT_IF_LOCALE which is
true when BR2_NEEDS_GETTEXT is true (i.e uClibc) *and* locale support
is enabled.

So far, so good.

Now, enter musl. It does have an internal gettext implementation.
However, it is not recognized by GNU gettext has a correct
implementation, so when you build GNU gettext in a musl system, it does
build/install libintl.so and its header files.

So for httping, two scenarios are possible:

 1/ httping is built alone against musl. No problem: the gettext
    functions are part of the C library, everything works fine.

 2/ httping is built *after* GNU gettext has been built. Since GNU
    gettext will replace the libintl.h of musl by its own one, the
    symbols from the GNU gettext libintl.so will be used, so we must
    link with -lintl explicitly. Which we are not doing, since
    htting.mk does:

       $(if $(BR2_NEEDS_GETTEXT),-lintl)

    And BR2_NEEDS_GETTEXT is false for musl.

So, I initially tried:

-       $(if $(BR2_NEEDS_GETTEXT),-lintl)
+       $(if $(BR2_PACKAGE_GETTEXT),-lintl)

With the reasoning that if GNU gettext is available, we want to use it,
and if it's not available, then we'll not use it.

But that doesn't work with a glibc configuration: BR2_PACKAGE_GETTEXT
can be enabled, but we don't have a libintl library, because GNU
gettext doesn't build one in a glibc configuration. We try to link
against libintl, but it's not there, and the build fails.

So, I see two possible options here:

 1/ Simply do not allow the GNU gettext package to be built with glibc
    and musl since they provide the gettext functionality internally.

    The only problem with this approach is that while httping is happy
    with the POSIX compliant gettext functionality of musl, some other
    programs such as Bison
    (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=786885) will
    really need GNU gettext functionality.

 2/ Allows force to use GNU gettext in musl configurations. This simply
    consists in:

 config BR2_NEEDS_GETTEXT
        bool
-       default y if BR2_TOOLCHAIN_USES_UCLIBC
+       default y if BR2_TOOLCHAIN_USES_UCLIBC || BR2_TOOLCHAIN_USES_MUSL

     I have tested this solution and it does work (obviously).

     The drawback is obviously that we are going to build/install GNU
     gettext even for cases where the internal gettext implementation
     of musl would have been sufficient.

Do you see some other options? Any opinion between the two proposed
options?

Thanks,

Thomas
-- 
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com


More information about the buildroot mailing list