On Thu, 13 Oct 2022 at 09:47, Michal Privoznik <mpriv...@redhat.com> wrote: > > When determining the endiandness of the target architecture we're > building for a small program is compiled, which in an obfuscated > way declares two strings. Then, we look which string is in > correct order (using strings binary) and deduct the endiandness. > But using the strings binary is problematic, because it's part of > toolchain (strings is just a symlink to > x86_64-pc-linux-gnu-strings or llvm-strings). And when > (cross-)compiling, it requires users to set the symlink to the > correct toolchain. > > Fortunately, we have a better alternative anyways. Since we > require either clang or gcc we can rely on macros they declare. > > Bug: https://bugs.gentoo.org/876933 > Signed-off-by: Michal Privoznik <mpriv...@redhat.com>
If we can determine this just by looking at C macros, does this really need to be a configure test at all ? Paolo? > --- > configure | 33 ++++++++++++++++++--------------- > 1 file changed, 18 insertions(+), 15 deletions(-) > > diff --git a/configure b/configure > index 45ee6f4eb3..91e04635cb 100755 > --- a/configure > +++ b/configure > @@ -1426,27 +1426,30 @@ fi > # --- > # big/little endian test > cat > $TMPC << EOF > -#include <stdio.h> > -short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, }; > -short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, > }; > -int main(int argc, char *argv[]) > -{ > - return printf("%s %s\n", (char *)big_endian, (char *)little_endian); > -} > +#if defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN || \ > + defined(__BIG_ENDIAN__) > +# error BIG > +#endif > +int main(void) { return 0; } > EOF > > if compile_prog ; then > - if strings -a $TMPE | grep -q BiGeNdIaN ; then > - bigendian="yes" > - elif strings -a $TMPE | grep -q LiTtLeEnDiAn ; then > - bigendian="no" > - else > - echo big/little test failed > - exit 1 > - fi > + bigendian="yes" > else > + cat > $TMPC << EOF > +#if defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN || \ > + defined(__LITTLE_ENDIAN__) > +# error LITTLE > +#endif > +int main(void) { return 0; } > +EOF > + > + if compile_prog ; then > + bigendian="no" > + else > echo big/little test failed > exit 1 > + fi > fi thanks -- PMM