Skip to content
Snippets Groups Projects
  • Jonathan Wakely's avatar
    68c2e9e9
    libstdc++: Fix and simplify freestanding configuration [PR103866] · 68c2e9e9
    Jonathan Wakely authored
    This fixes the --disable-hosted-libstdcxx build so that it works with
    --without-headers. Currently you need to also use --with-newlib, which
    is confusing for users who aren't actually using newlib.
    
    The AM_PROG_LIBTOOL checks are currently skipped for --with-newlib and
    --with-avrlibc builds, with this change they are also skipped when using
    --without-headers.  It would be nice if using --disable-hosted-libstdcxx
    automatically skipped those checks, but GLIBCXX_ENABLE_HOSTED comes too
    late to make the AM_PROG_LIBTOOL checks depend on $is_hosted.
    
    The checks for EOF, SEEK_CUR etc. cause the build to fail if there is no
    <stdio.h> available.  Unlike most headers, which get a HAVE_FOO_H macro,
    <stdio.h> is in autoconf's default includes, so every check tries to
    include it unconditionally. This change skips those checks for
    freestanding builds.
    
    Similarly, the checks for <stdint.h> types done by GCC_HEADER_STDINT try
    to include <stdio.h> and fail for --without-headers builds. This change
    skips the use of GCC_HEADER_STDINT for freestanding. We can probably
    stop using GCC_HEADER_STDINT entirely, since only one file uses the
    gstdint.h header that is generated, and that could easily be changed to
    use <stdint.h> instead. That can wait for stage 1.
    
    We also need to skip the GLIBCXX_CROSSCONFIG stage if --without-headers
    was used, since we don't have any of the functions it deals with.
    
    The end result of the changes above is that it should not be necessary
    for a --disable-hosted-libstdcxx --without-headers build to also use
    --with-newlib.
    
    Finally, compile libsupc++ with -ffreestanding when --without-headers is
    used, so that <stdint.h> will use <gcc-stdint.h> instead of expecting it
    to come from libc.
    
    libstdc++-v3/ChangeLog:
    
    	PR libstdc++/103866
    	* acinclude.m4 (GLIBCXX_COMPUTE_STDIO_INTEGER_CONSTANTS): Do
    	nothing for freestanding builds.
    	(GLIBCXX_ENABLE_HOSTED): Define FREESTANDING_FLAGS.
    	* configure.ac: Do not use AC_LIBTOOL_DLOPEN when configured
    	with --without-headers.  Do not use GCC_HEADER_STDINT for
    	freestanding builds.
    	* libsupc++/Makefile.am (HOSTED_CXXFLAGS): Use -ffreestanding
    	for freestanding builds.
    	* configure: Regenerate.
    	* Makefile.in: Regenerate.
    	* doc/Makefile.in: Regenerate.
    	* include/Makefile.in: Regenerate.
    	* libsupc++/Makefile.in: Regenerate.
    	* po/Makefile.in: Regenerate.
    	* python/Makefile.in: Regenerate.
    	* src/Makefile.in: Regenerate.
    	* src/c++11/Makefile.in: Regenerate.
    	* src/c++17/Makefile.in: Regenerate.
    	* src/c++20/Makefile.in: Regenerate.
    	* src/c++98/Makefile.in: Regenerate.
    	* src/filesystem/Makefile.in: Regenerate.
    	* testsuite/Makefile.in: Regenerate.
    68c2e9e9
    History
    libstdc++: Fix and simplify freestanding configuration [PR103866]
    Jonathan Wakely authored
    This fixes the --disable-hosted-libstdcxx build so that it works with
    --without-headers. Currently you need to also use --with-newlib, which
    is confusing for users who aren't actually using newlib.
    
    The AM_PROG_LIBTOOL checks are currently skipped for --with-newlib and
    --with-avrlibc builds, with this change they are also skipped when using
    --without-headers.  It would be nice if using --disable-hosted-libstdcxx
    automatically skipped those checks, but GLIBCXX_ENABLE_HOSTED comes too
    late to make the AM_PROG_LIBTOOL checks depend on $is_hosted.
    
    The checks for EOF, SEEK_CUR etc. cause the build to fail if there is no
    <stdio.h> available.  Unlike most headers, which get a HAVE_FOO_H macro,
    <stdio.h> is in autoconf's default includes, so every check tries to
    include it unconditionally. This change skips those checks for
    freestanding builds.
    
    Similarly, the checks for <stdint.h> types done by GCC_HEADER_STDINT try
    to include <stdio.h> and fail for --without-headers builds. This change
    skips the use of GCC_HEADER_STDINT for freestanding. We can probably
    stop using GCC_HEADER_STDINT entirely, since only one file uses the
    gstdint.h header that is generated, and that could easily be changed to
    use <stdint.h> instead. That can wait for stage 1.
    
    We also need to skip the GLIBCXX_CROSSCONFIG stage if --without-headers
    was used, since we don't have any of the functions it deals with.
    
    The end result of the changes above is that it should not be necessary
    for a --disable-hosted-libstdcxx --without-headers build to also use
    --with-newlib.
    
    Finally, compile libsupc++ with -ffreestanding when --without-headers is
    used, so that <stdint.h> will use <gcc-stdint.h> instead of expecting it
    to come from libc.
    
    libstdc++-v3/ChangeLog:
    
    	PR libstdc++/103866
    	* acinclude.m4 (GLIBCXX_COMPUTE_STDIO_INTEGER_CONSTANTS): Do
    	nothing for freestanding builds.
    	(GLIBCXX_ENABLE_HOSTED): Define FREESTANDING_FLAGS.
    	* configure.ac: Do not use AC_LIBTOOL_DLOPEN when configured
    	with --without-headers.  Do not use GCC_HEADER_STDINT for
    	freestanding builds.
    	* libsupc++/Makefile.am (HOSTED_CXXFLAGS): Use -ffreestanding
    	for freestanding builds.
    	* configure: Regenerate.
    	* Makefile.in: Regenerate.
    	* doc/Makefile.in: Regenerate.
    	* include/Makefile.in: Regenerate.
    	* libsupc++/Makefile.in: Regenerate.
    	* po/Makefile.in: Regenerate.
    	* python/Makefile.in: Regenerate.
    	* src/Makefile.in: Regenerate.
    	* src/c++11/Makefile.in: Regenerate.
    	* src/c++17/Makefile.in: Regenerate.
    	* src/c++20/Makefile.in: Regenerate.
    	* src/c++98/Makefile.in: Regenerate.
    	* src/filesystem/Makefile.in: Regenerate.
    	* testsuite/Makefile.in: Regenerate.