BobBuildTool/basement

glib can't be built anymore

Closed this issue · 6 comments

glib can't be be built correctly with my ubuntu20 lts wsl2 system and current basement layers.

the error output of bob:

../../../../../../../../src/libs/glib/1/workspace/glib/gnulib/meson.build:306:2: ERROR: Problem encountered: frexp() is missing or broken beyond repair, and we have nothing to replace it with

there are multiple strange things.

  1. for building sanity executables, the ubuntu cc tool instead of the host-compat-toolchain will be used, because the host-compat-toolchain has no cc tool.

  2. while building, the process tries to execute cross compiled executables, hm?! which needs glibc 2.34, but it tries to use the one of the ubuntu system, which just is 2.31.

log file:

/home/mhaase/fdt.bobrecipes/dev/build/libs/glib-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/build/meson-private/tmp8z6qmhm7/output.exe: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /home/mhaase/fdt.bobrecipes/dev/build/libs/glib-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/build/meson-private/tmp8z6qmhm7/output.exe)

Hmm, the missing cc might indeed be a problem. But what puzzles me is where the glibc 2.34 dependency comes from. Meson must have used a newer glibc when linking the test executable. I'm wondering where it should come from.

but why it tries to execute the built executables, which are cross-compiled. if it would be an aarch64 toolchain, the execute will not work at all.

It doesn't look like it's cross compiled. What does a readelf -h /home/mhaase/fdt.bobrecipes/dev/build/libs/glib-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/build/meson-private/tmp8z6qmhm7/output.exe bring up?

what i only found: https://bytemeta.vip/repo/LibreELEC/LibreELEC.tv/issues/6344
but on official sites i can't find this problem. i am confuesd about that.

some more logs here:

Checking if "frexp works" with dependency -lm runs: NO (1)
Running compile:
Working directory:  /home/mhaase/fdt.bobrecipes/dev/build/libs/glib-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/build/meson-private/tmp66h8dbwt
Command line:  x86_64-cross-linux-gnu-gcc -L/home/mhaase/fdt.bobrecipes/dev/dist/libs/libffi-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/usr/lib -L/home/mhaase/fdt.bobrecipes/dev/dist/libs/pcre-lib-1-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/usr/lib -L/home/mhaase/fdt.bobrecipes/dev/dist/libs/zlib-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/usr/lib -I/home/mhaase/fdt.bobrecipes/dev/dist/libs/libffi-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/usr/include -I/home/mhaase/fdt.bobrecipes/dev/dist/libs/pcre-lib-1-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/usr/include -I/home/mhaase/fdt.bobrecipes/dev/dist/libs/zlib-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/usr/include /home/mhaase/fdt.bobrecipes/dev/build/libs/glib-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/build/meson-private/tmp66h8dbwt/testfile.c -o /home/mhaase/fdt.bobrecipes/dev/build/libs/glib-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/build/meson-private/tmp66h8dbwt/output.exe -Wdate-time -O0 -g -pipe -fPIC -D_FILE_OFFSET_BITS=64 -O0 -std=gnu99 -Wl,--start-group -lm -Wl,--end-group -Wl,-O1 -Wl,--hash-style=gnu -Wl,-rpath-link=/home/mhaase/fdt.bobrecipes/dev/dist/libs/libffi-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/usr/lib -Wl,-rpath-link=/home/mhaase/fdt.bobrecipes/dev/dist/libs/pcre-lib-1-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/usr/lib -Wl,-rpath-link=/home/mhaase/fdt.bobrecipes/dev/dist/libs/zlib-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/usr/lib

Code:

#include <float.h>
#include <math.h>
/* Override the values of <float.h>, like done in float.in.h.  */
#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
# undef LDBL_MIN_EXP
# define LDBL_MIN_EXP    (-16381)
#endif
#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
# undef LDBL_MIN_EXP
# define LDBL_MIN_EXP    (-16381)
#endif
#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
# undef LDBL_MIN_EXP
# define LDBL_MIN_EXP DBL_MIN_EXP
#endif
#if defined __sgi && (LDBL_MANT_DIG >= 106)
# if defined __GNUC__
#  undef LDBL_MIN_EXP
#  define LDBL_MIN_EXP DBL_MIN_EXP
# endif
#endif
extern
#ifdef __cplusplus
"C"
#endif

#if !defined (_MSC_VER) || defined (TEST_FREXPL_DECL)
long double frexpl (long double, int *);
#endif

int main()
{
  int result = 0;
  volatile long double x;
  /* Test on finite numbers that fails on AIX 5.1.  */
  x = 16.0L;
  {
    int exp = -9999;
    frexpl (x, &exp);
    if (exp != 5)
      result |= 1;
  }
  /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl
     function returns an invalid (incorrectly normalized) value: it returns
               y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
     but the correct result is
          0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 }  */
  x = 1.01L;
  {
    int exp = -9999;
    long double y = frexpl (x, &exp);
    if (!(exp == 1 && y == 0.505L))
      result |= 2;
  }
  /* Test on large finite numbers.  This fails on BeOS at i = 16322, while
     LDBL_MAX_EXP = 16384.
     In the loop end test, we test x against Infinity, rather than comparing
     i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP.  */
  {
    int i;
    for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
      {
        int exp = -9999;
        frexpl (x, &exp);
        if (exp != i)
          {
            result |= 4;
            break;
          }
      }
  }
  /* Test on denormalized numbers.  */
  {
    int i;
    for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
      ;
    if (x > 0.0L)
      {
        int exp;
        long double y = frexpl (x, &exp);
        /* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
           exp = -16382, y = 0.5.  On Mac OS X 10.5: exp = -16384, y = 0.5.  */
        if (exp != LDBL_MIN_EXP - 1)
          result |= 8;
      }
  }
  /* Test on infinite numbers.  */
  /* The dance around 0.0L is an attempt to prevent MSVC from erroring out */
  x = 0.0L;
  x = 1.0L / x;
  {
    int exp;
    long double y = frexpl (x, &exp);
    if (y != x)
      result |= 16;
  }
  return result;
}

Compiler stdout:

Compiler stderr:

Program stdout:


Program stderr:

/home/mhaase/fdt.bobrecipes/dev/build/libs/glib-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/build/meson-private/tmp66h8dbwt/output.exe: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /home/mhaase/fdt.bobrecipes/dev/build/libs/glib-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/build/meson-private/tmp66h8dbwt/output.exe)

Checking if "frexpl works" with dependency -lm runs: NO (1)
Running compile:
Working directory:  /home/mhaase/fdt.bobrecipes/dev/build/libs/glib-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/build/meson-private/tmpbj360byu
Command line:  x86_64-cross-linux-gnu-gcc -I/home/mhaase/fdt.bobrecipes/dev/dist/libs/libffi-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/usr/include -I/home/mhaase/fdt.bobrecipes/dev/dist/libs/pcre-lib-1-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/usr/include -I/home/mhaase/fdt.bobrecipes/dev/dist/libs/zlib-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/usr/include /home/mhaase/fdt.bobrecipes/dev/build/libs/glib-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/build/meson-private/tmpbj360byu/testfile.c -o /home/mhaase/fdt.bobrecipes/dev/build/libs/glib-dev/x86_64-cross-linux-gnu/O0gpipefPIC/1/workspace/build/meson-private/tmpbj360byu/output.obj -c -Wdate-time -O0 -g -pipe -fPIC -D_FILE_OFFSET_BITS=64 -O0 -std=gnu99

Code:

#define TEST_FREXPL_DECL 1

#include <float.h>
#include <math.h>
/* Override the values of <float.h>, like done in float.in.h.  */
#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
# undef LDBL_MIN_EXP
# define LDBL_MIN_EXP    (-16381)
#endif
#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
# undef LDBL_MIN_EXP
# define LDBL_MIN_EXP    (-16381)
#endif
#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
# undef LDBL_MIN_EXP
# define LDBL_MIN_EXP DBL_MIN_EXP
#endif
#if defined __sgi && (LDBL_MANT_DIG >= 106)
# if defined __GNUC__
#  undef LDBL_MIN_EXP
#  define LDBL_MIN_EXP DBL_MIN_EXP
# endif
#endif
extern
#ifdef __cplusplus
"C"
#endif

#if !defined (_MSC_VER) || defined (TEST_FREXPL_DECL)
long double frexpl (long double, int *);
#endif

int main()
{
  int result = 0;
  volatile long double x;
  /* Test on finite numbers that fails on AIX 5.1.  */
  x = 16.0L;
  {
    int exp = -9999;
    frexpl (x, &exp);
    if (exp != 5)
      result |= 1;
  }
  /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl
     function returns an invalid (incorrectly normalized) value: it returns
               y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
     but the correct result is
          0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 }  */
  x = 1.01L;
  {
    int exp = -9999;
    long double y = frexpl (x, &exp);
    if (!(exp == 1 && y == 0.505L))
      result |= 2;
  }
  /* Test on large finite numbers.  This fails on BeOS at i = 16322, while
     LDBL_MAX_EXP = 16384.
     In the loop end test, we test x against Infinity, rather than comparing
     i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP.  */
  {
    int i;
    for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
      {
        int exp = -9999;
        frexpl (x, &exp);
        if (exp != i)
          {
            result |= 4;
            break;
          }
      }
  }
  /* Test on denormalized numbers.  */
  {
    int i;
    for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
      ;
    if (x > 0.0L)
      {
        int exp;
        long double y = frexpl (x, &exp);
        /* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
           exp = -16382, y = 0.5.  On Mac OS X 10.5: exp = -16384, y = 0.5.  */
        if (exp != LDBL_MIN_EXP - 1)
          result |= 8;
      }
  }
  /* Test on infinite numbers.  */
  /* The dance around 0.0L is an attempt to prevent MSVC from erroring out */
  x = 0.0L;
  x = 1.0L / x;
  {
    int exp;
    long double y = frexpl (x, &exp);
    if (y != x)
      result |= 16;
  }
  return result;
}

Compiler stdout:

Compiler stderr:

Checking if "frexpl prototype can be re-listed" compiles: YES

../../../../../../../../src/libs/glib/1/workspace/glib/gnulib/meson.build:306:2: ERROR: Problem encountered: frexp() is missing or broken beyond repair, and we have nothing to replace it with

the temporary files are gone instantly.

but a patch with commenting the subjected lines helps to built the glib completely.

@jkloetzke should be fixed by development progress, isn't it?

Probably. I was never able to reproduce it. So if you don't see it either, feel free to close the ticket. 😉