fmtlib / fmt

A modern formatting library
https://fmt.dev
Other
19.84k stars 2.42k forks source link

Fail to build on Ubuntu-18.04 with g++-13.2 #3957

Closed mingodad closed 1 month ago

mingodad commented 1 month ago

With a fresh clone of this repository:

uname -a
Linux xxx 5.4.0-137-generic #154~18.04.1-Ubuntu SMP Tue Jan 10 16:58:20 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

gcc-13-env mycmake ..
-- CMake version: 3.24.2
-- The CXX compiler identification is GNU 13.2.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /home/xxx/local/gcc-13/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- {fmt} version: 10.2.2
-- Build type: Release
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE  
-- Looking for strptime
-- Looking for strptime - found
-- FMT_PEDANTIC: OFF
-- Configuring done
-- Generating done
-- Build files have been written to: /home/xxx/dev/c/A_libs/fmt/build

$ gcc-13-env make
[  1%] Building CXX object CMakeFiles/fmt.dir/src/format.cc.o
In file included from /home/xxx/local/gcc-13/include/c++/13.2.0/cmath:47,
                 from /home/xxx/dev/c/A_libs/fmt/include/fmt/format-inl.h:13,
                 from /home/xxx/dev/c/A_libs/fmt/src/format.cc:8:
/home/xxx/dev/c/A_libs/fmt/include/fmt/format.h:2703:48: error: ‘__builtin_isfinite’ is not a member of ‘std’; did you mean ‘__builtin_isfinite’?
 2703 | struct has_isfinite<T, enable_if_t<sizeof(std::isfinite(T())) != 0>>
      |                                                ^~~~~~~~
<built-in>: note: ‘__builtin_isfinite’ declared here
In file included from /home/xxx/dev/c/A_libs/fmt/include/fmt/format-inl.h:27:
/home/xxx/dev/c/A_libs/fmt/include/fmt/format.h:2703:66: error: template argument 1 is invalid
 2703 | struct has_isfinite<T, enable_if_t<sizeof(std::isfinite(T())) != 0>>
      |                                                                  ^
/home/xxx/dev/c/A_libs/fmt/include/fmt/format.h:2703:67: error: template argument 2 is invalid
 2703 | struct has_isfinite<T, enable_if_t<sizeof(std::isfinite(T())) != 0>>
      |                                                                   ^~
/home/xxx/dev/c/A_libs/fmt/include/fmt/format.h: In function ‘bool fmt::v10::detail::__builtin_isfinite(T)’:
/home/xxx/dev/c/A_libs/fmt/include/fmt/format.h:2712:15: error: ‘__builtin_isfinite’ is not a member of ‘std’; did you mean ‘__builtin_isfinite’?
 2712 |   return std::isfinite(value);
      |               ^~~~~~~~
<built-in>: note: ‘__builtin_isfinite’ declared here
/home/xxx/dev/c/A_libs/fmt/include/fmt/format.h: In function ‘constexpr bool fmt::v10::detail::__builtin_signbit(T)’:
/home/xxx/dev/c/A_libs/fmt/include/fmt/format.h:2731:15: error: ‘__builtin_signbit’ is not a member of ‘std’; did you mean ‘__builtin_signbit’?
 2731 |   return std::signbit(static_cast<double>(value));
      |               ^~~~~~~
<built-in>: note: ‘__builtin_signbit’ declared here
/home/xxx/dev/c/A_libs/fmt/include/fmt/format.h: In function ‘OutputIt fmt::v10::detail::write(OutputIt, T)’:
/home/xxx/dev/c/A_libs/fmt/include/fmt/format.h:3628:44: error: ‘__builtin_isnan’ is not a member of ‘std’; did you mean ‘__builtin_isnan’?
 3628 |     return write_nonfinite<Char>(out, std::isnan(value), specs, sign);
      |                                            ^~~~~
<built-in>: note: ‘__builtin_isnan’ declared here
CMakeFiles/fmt.dir/build.make:75: recipe for target 'CMakeFiles/fmt.dir/src/format.cc.o' failed
make[2]: *** [CMakeFiles/fmt.dir/src/format.cc.o] Error 1
CMakeFiles/Makefile2:174: recipe for target 'CMakeFiles/fmt.dir/all' failed
make[1]: *** [CMakeFiles/fmt.dir/all] Error 2
Makefile:165: recipe for target 'all' failed
make: *** [all] Error 2
mingodad commented 1 month ago

When building with g++-9.4 it builds fine but I have a project that uses it but requires g++-13:

mycmake ..
-- CMake version: 3.24.2
-- The CXX compiler identification is GNU 9.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- {fmt} version: 10.2.2
-- Build type: Release
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE  
-- Looking for strptime
-- Looking for strptime - found
-- FMT_PEDANTIC: OFF
-- Configuring done
-- Generating done
-- Build files have been written to: /home/mingo/dev/c/A_libs/fmt/build0

mingo@mingo-X550VX:~/dev/c/A_libs/fmt/build0$ make
[  1%] Building CXX object CMakeFiles/fmt.dir/src/format.cc.o
[  2%] Building CXX object CMakeFiles/fmt.dir/src/os.cc.o
[  4%] Linking CXX static library libfmt.a
[  4%] Built target fmt
[  5%] Building CXX object test/gtest/CMakeFiles/gtest.dir/gmock-gtest-all.cc.o
[  7%] Linking CXX static library libgtest.a
[  7%] Built target gtest
[  8%] Building CXX object test/CMakeFiles/test-main.dir/test-main.cc.o
[  9%] Building CXX object test/CMakeFiles/test-main.dir/gtest-extra.cc.o
[ 11%] Building CXX object test/CMakeFiles/test-main.dir/util.cc.o
[ 12%] Linking CXX static library libtest-main.a
[ 12%] Built target test-main
[ 14%] Building CXX object test/CMakeFiles/args-test.dir/args-test.cc.o
[ 15%] Linking CXX executable ../bin/args-test
[ 15%] Built target args-test
[ 16%] Building CXX object test/CMakeFiles/base-test.dir/base-test.cc.o
[ 18%] Linking CXX executable ../bin/base-test
[ 18%] Built target base-test
[ 19%] Building CXX object test/CMakeFiles/assert-test.dir/assert-test.cc.o
[ 21%] Linking CXX executable ../bin/assert-test
[ 21%] Built target assert-test
[ 22%] Building CXX object test/CMakeFiles/chrono-test.dir/chrono-test.cc.o
[ 23%] Linking CXX executable ../bin/chrono-test
[ 23%] Built target chrono-test
[ 25%] Building CXX object test/CMakeFiles/color-test.dir/color-test.cc.o
[ 26%] Linking CXX executable ../bin/color-test
[ 26%] Built target color-test
[ 28%] Building CXX object test/CMakeFiles/gtest-extra-test.dir/gtest-extra-test.cc.o
[ 29%] Linking CXX executable ../bin/gtest-extra-test
[ 29%] Built target gtest-extra-test
[ 30%] Building CXX object test/CMakeFiles/format-test.dir/format-test.cc.o
[ 32%] Linking CXX executable ../bin/format-test
[ 32%] Built target format-test
[ 33%] Building CXX object test/CMakeFiles/format-impl-test.dir/format-impl-test.cc.o
[ 35%] Building CXX object test/CMakeFiles/format-impl-test.dir/header-only-test.cc.o
[ 36%] Building CXX object test/CMakeFiles/format-impl-test.dir/test-main.cc.o
[ 38%] Building CXX object test/CMakeFiles/format-impl-test.dir/gtest-extra.cc.o
[ 39%] Building CXX object test/CMakeFiles/format-impl-test.dir/util.cc.o
[ 40%] Building CXX object test/CMakeFiles/format-impl-test.dir/__/src/os.cc.o
[ 42%] Linking CXX executable ../bin/format-impl-test
[ 42%] Built target format-impl-test
[ 43%] Building CXX object test/CMakeFiles/ostream-test.dir/ostream-test.cc.o
[ 45%] Linking CXX executable ../bin/ostream-test
[ 45%] Built target ostream-test
[ 46%] Building CXX object test/CMakeFiles/compile-test.dir/compile-test.cc.o
[ 47%] Linking CXX executable ../bin/compile-test
[ 47%] Built target compile-test
[ 49%] Building CXX object test/CMakeFiles/compile-fp-test.dir/compile-fp-test.cc.o
[ 50%] Building CXX object test/CMakeFiles/compile-fp-test.dir/test-main.cc.o
[ 52%] Building CXX object test/CMakeFiles/compile-fp-test.dir/gtest-extra.cc.o
[ 53%] Building CXX object test/CMakeFiles/compile-fp-test.dir/util.cc.o
[ 54%] Building CXX object test/CMakeFiles/compile-fp-test.dir/__/src/os.cc.o
[ 56%] Linking CXX executable ../bin/compile-fp-test
[ 56%] Built target compile-fp-test
[ 57%] Building CXX object test/CMakeFiles/printf-test.dir/printf-test.cc.o
[ 59%] Linking CXX executable ../bin/printf-test
[ 59%] Built target printf-test
[ 60%] Building CXX object test/CMakeFiles/ranges-test.dir/ranges-test.cc.o
[ 61%] Building CXX object test/CMakeFiles/ranges-test.dir/ranges-odr-test.cc.o
[ 63%] Linking CXX executable ../bin/ranges-test
[ 63%] Built target ranges-test
[ 64%] Building CXX object test/CMakeFiles/scan-test.dir/scan-test.cc.o
[ 66%] Building CXX object test/CMakeFiles/scan-test.dir/test-main.cc.o
[ 67%] Building CXX object test/CMakeFiles/scan-test.dir/gtest-extra.cc.o
[ 69%] Building CXX object test/CMakeFiles/scan-test.dir/util.cc.o
[ 70%] Building CXX object test/CMakeFiles/scan-test.dir/__/src/os.cc.o
[ 71%] Linking CXX executable ../bin/scan-test
[ 71%] Built target scan-test
[ 73%] Building CXX object test/CMakeFiles/std-test.dir/std-test.cc.o
[ 74%] Linking CXX executable ../bin/std-test
[ 74%] Built target std-test
[ 76%] Building CXX object test/CMakeFiles/unicode-test.dir/unicode-test.cc.o
[ 77%] Building CXX object test/CMakeFiles/unicode-test.dir/test-main.cc.o
[ 78%] Building CXX object test/CMakeFiles/unicode-test.dir/gtest-extra.cc.o
[ 80%] Building CXX object test/CMakeFiles/unicode-test.dir/util.cc.o
[ 81%] Building CXX object test/CMakeFiles/unicode-test.dir/__/src/os.cc.o
[ 83%] Linking CXX executable ../bin/unicode-test
[ 83%] Built target unicode-test
[ 84%] Building CXX object test/CMakeFiles/xchar-test.dir/xchar-test.cc.o
[ 85%] Linking CXX executable ../bin/xchar-test
[ 85%] Built target xchar-test
[ 87%] Building CXX object test/CMakeFiles/enforce-checks-test.dir/enforce-checks-test.cc.o
[ 88%] Linking CXX executable ../bin/enforce-checks-test
[ 88%] Built target enforce-checks-test
[ 90%] Building CXX object test/CMakeFiles/posix-mock-test.dir/posix-mock-test.cc.o
[ 91%] Building CXX object test/CMakeFiles/posix-mock-test.dir/__/src/format.cc.o
[ 92%] Building CXX object test/CMakeFiles/posix-mock-test.dir/test-main.cc.o
[ 94%] Building CXX object test/CMakeFiles/posix-mock-test.dir/gtest-extra.cc.o
[ 95%] Building CXX object test/CMakeFiles/posix-mock-test.dir/util.cc.o
[ 97%] Linking CXX executable ../bin/posix-mock-test
[ 97%] Built target posix-mock-test
[ 98%] Building CXX object test/CMakeFiles/os-test.dir/os-test.cc.o
[100%] Linking CXX executable ../bin/os-test
[100%] Built target os-test
Arghnews commented 1 month ago

Are you sure there isn't something funky with your custom gcc install or with gcc 13.2?

Here's a dockerfile running ubuntu 18, installing gcc13.1, and cloning the latest fmtlib. It builds fmtlib successfully and runs the fmtlib tests succesfully. Seems unlikely (but not impossible) much has changed regarding these __builtin_isfinite functions from gcc 13.1 -> 13.2. Something about your gcc build not having the right include dirs maybe?

# syntax=docker/dockerfile:1

FROM ubuntu:18.04
RUN apt-get update
RUN apt-get -y install wget make software-properties-common git
RUN add-apt-repository ppa:ubuntu-toolchain-r/test
RUN apt-get -y upgrade
RUN apt-get -y install g++-13

RUN wget -O - https://github.com/Kitware/CMake/releases/download/v3.29.2/cmake-3.29.2-linux-x86_64.sh > cmake_install_script.sh
RUN chmod u+x cmake_install_script.sh
RUN ./cmake_install_script.sh --skip-license

WORKDIR /app

RUN git clone https://github.com/fmtlib/fmt.git fmt
RUN mkdir -p build
CMD cmake -S fmt -B build -DCMAKE_CXX_COMPILER=g++-13 && cmake --build build && ctest --test-dir build
mingodad commented 1 month ago

Thank you for reply ! I'm still investigating why it's not working on my machine, I even tested with g++-12.2 and it builds fine but not with g++-13.2:

gcc-12-env mycmake ..
-- CMake version: 3.29.3
-- The CXX compiler identification is GNU 12.2.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /home/mingo/local/gcc-12/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- {fmt} version: 10.2.2
-- Build type: Release
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Looking for strptime
-- Looking for strptime - found
-- FMT_PEDANTIC: OFF
-- Configuring done (1.3s)
-- Generating done (0.0s)
-- Build files have been written to: /tmp/fmtlib/fmt/build-12

mingo@mingo-X550VX:/tmp/fmtlib/fmt/build-12$ gcc-12-env make
[  1%] Building CXX object CMakeFiles/fmt.dir/src/format.cc.o
[  2%] Building CXX object CMakeFiles/fmt.dir/src/os.cc.o
[  4%] Linking CXX static library libfmt.a
[  4%] Built target fmt
[  5%] Building CXX object test/gtest/CMakeFiles/gtest.dir/gmock-gtest-all.cc.o
[  7%] Linking CXX static library libgtest.a
[  7%] Built target gtest
[  8%] Building CXX object test/CMakeFiles/test-main.dir/test-main.cc.o
[  9%] Building CXX object test/CMakeFiles/test-main.dir/gtest-extra.cc.o
[ 11%] Building CXX object test/CMakeFiles/test-main.dir/util.cc.o
[ 12%] Linking CXX static library libtest-main.a
[ 12%] Built target test-main
[ 14%] Building CXX object test/CMakeFiles/args-test.dir/args-test.cc.o
[ 15%] Linking CXX executable ../bin/args-test
[ 15%] Built target args-test
[ 16%] Building CXX object test/CMakeFiles/base-test.dir/base-test.cc.o
[ 18%] Linking CXX executable ../bin/base-test
[ 18%] Built target base-test
[ 19%] Building CXX object test/CMakeFiles/assert-test.dir/assert-test.cc.o
[ 21%] Linking CXX executable ../bin/assert-test
[ 21%] Built target assert-test
[ 22%] Building CXX object test/CMakeFiles/chrono-test.dir/chrono-test.cc.o
[ 23%] Linking CXX executable ../bin/chrono-test
[ 23%] Built target chrono-test
[ 25%] Building CXX object test/CMakeFiles/color-test.dir/color-test.cc.o
[ 26%] Linking CXX executable ../bin/color-test
[ 26%] Built target color-test
[ 28%] Building CXX object test/CMakeFiles/gtest-extra-test.dir/gtest-extra-test.cc.o
[ 29%] Linking CXX executable ../bin/gtest-extra-test
[ 29%] Built target gtest-extra-test
[ 30%] Building CXX object test/CMakeFiles/format-test.dir/format-test.cc.o
[ 32%] Linking CXX executable ../bin/format-test
[ 32%] Built target format-test
[ 33%] Building CXX object test/CMakeFiles/format-impl-test.dir/format-impl-test.cc.o
[ 35%] Building CXX object test/CMakeFiles/format-impl-test.dir/header-only-test.cc.o
[ 36%] Building CXX object test/CMakeFiles/format-impl-test.dir/test-main.cc.o
[ 38%] Building CXX object test/CMakeFiles/format-impl-test.dir/gtest-extra.cc.o
[ 39%] Building CXX object test/CMakeFiles/format-impl-test.dir/util.cc.o
[ 40%] Building CXX object test/CMakeFiles/format-impl-test.dir/__/src/os.cc.o
[ 42%] Linking CXX executable ../bin/format-impl-test
[ 42%] Built target format-impl-test
[ 43%] Building CXX object test/CMakeFiles/ostream-test.dir/ostream-test.cc.o
...
mingodad commented 1 month ago

Just in case someone can help I'm attaching the preprocessed files from clang-17, g++-9.4, g++-12.2 and g++-13.2 that is the problematic one.

format.pp.zip

mingodad commented 1 month ago

If I manually add -DCMAKE_CXX_FLAGS="-D_GLIBCXX_USE_C99_MATH=1 then it builds with g++-13.2:

gcc-13-env mycmake -DCMAKE_CXX_FLAGS="-D_GLIBCXX_USE_C99_MATH=1" .. 
-- CMake version: 3.29.3
-- The CXX compiler identification is GNU 13.2.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /home/mingo/local/gcc-13/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- {fmt} version: 10.2.2
-- Build type: Release
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Looking for strptime
-- Looking for strptime - found
-- FMT_PEDANTIC: OFF
-- Configuring done (1.2s)
-- Generating done (0.0s)
-- Build files have been written to: /tmp/fmtlib/fmt/build2
mingo@mingo-X550VX:/tmp/fmtlib/fmt/build2$ make
[  1%] Building CXX object CMakeFiles/fmt.dir/src/format.cc.o
[  2%] Building CXX object CMakeFiles/fmt.dir/src/os.cc.o
[  4%] Linking CXX static library libfmt.a
[  4%] Built target fmt
[  5%] Building CXX object test/gtest/CMakeFiles/gtest.dir/gmock-gtest-all.cc.o
[  7%] Linking CXX static library libgtest.a
[  7%] Built target gtest
[  8%] Building CXX object test/CMakeFiles/test-main.dir/test-main.cc.o
[  9%] Building CXX object test/CMakeFiles/test-main.dir/gtest-extra.cc.o
[ 11%] Building CXX object test/CMakeFiles/test-main.dir/util.cc.o
[ 12%] Linking CXX static library libtest-main.a
[ 12%] Built target test-main
[ 14%] Building CXX object test/CMakeFiles/args-test.dir/args-test.cc.o
mingodad commented 1 month ago

Comparing the two compilers (g++12.2 and g++-13.2) I've noticed that the significant difference is this one:

/home/mingo/local/gcc-12/include/c++/12.2.0/x86_64-pc-linux-gnu/bits/c++config.h:1774:#define _GLIBCXX_USE_C99_MATH_TR1 1
/home/mingo/local/gcc-13/include/c++/13.2.0/x86_64-pc-linux-gnu/bits/c++config.h:1807:/* #undef _GLIBCXX_USE_C99_MATH_TR1 */
vitaut commented 1 month ago

I wasn't able to repro this on gcc 13.2 on godbolt: https://www.godbolt.org/z/hnfEx1asv. Most likely the issue is with your configuration of gcc that causes incorrect definition of isfinite as a macro. {fmt} requires std::isfinite to work.

mingodad commented 1 month ago

Thank you again for all help !