commit:     ac3c099a82ddf6c98eab39db95c31e7d7db5e7df
Author:     Eli Schwartz <eschwartz <AT> gentoo <DOT> org>
AuthorDate: Tue Sep 24 02:58:46 2024 +0000
Commit:     Eli Schwartz <eschwartz <AT> gentoo <DOT> org>
CommitDate: Wed Sep 25 03:17:03 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=ac3c099a

sys-libs/libstdc++-v3: disable custom user flags entirely

This is ancient brittle code -- an ancient, unmaintained version of GCC.
It exists solely to provide access to an ancient, unmaintained version
of libstdc++.so for ancient, unmaintained binaries that cannot be
rebuilt.

It doesn't need to be fast, or have cool CFLAGS. People shouldn't even
be using it at all. The people who do use it care about compatibility
more than anything else, so successfully compiling it should be taken as
the gift that it is.

With that in mind, we basically strip all flags. We preserve some
existing logic to handle -march= values known to exist in this old gcc,
and we continue to support -O levels, but we go no further. It's
entirely impractical to support arbitrary flags, since every gcc release
adds more flags that old versions don't support and then this fails
because GCC 3's internal xgcc build cannot handle them.

We also take this opportunity to add a workaround for modern C. New
versions of GCC barf on some of the code here because it is not legal
C99, but again, the point of this package is to provide legacy
compatibility for ancient binaries, so... we assume if it ever worked
before, it still works. :) Thus, suppress the errors. In order to
suppress the errors, we make a wrapper script around the external
compiler (not the xgcc one) so that we can apply flags that only affect
modern compilers, and aren't parsed by xgcc which would choke on them
due to those flags being too new.

Closes: https://bugs.gentoo.org/879775
Closes: https://bugs.gentoo.org/919184
Closes: https://bugs.gentoo.org/832016
Closes: https://bugs.gentoo.org/923112
Signed-off-by: Eli Schwartz <eschwartz <AT> gentoo.org>

 sys-libs/libstdc++-v3/libstdc++-v3-3.3.6-r4.ebuild | 75 +++++++++++-----------
 1 file changed, 37 insertions(+), 38 deletions(-)

diff --git a/sys-libs/libstdc++-v3/libstdc++-v3-3.3.6-r4.ebuild 
b/sys-libs/libstdc++-v3/libstdc++-v3-3.3.6-r4.ebuild
index 7c20c6524879..9ebe0e98eb7e 100644
--- a/sys-libs/libstdc++-v3/libstdc++-v3-3.3.6-r4.ebuild
+++ b/sys-libs/libstdc++-v3/libstdc++-v3-3.3.6-r4.ebuild
@@ -70,11 +70,13 @@ is_arch_allowed() {
 }
 
 do_filter_flags() {
-       declare setting
+       declare setting newflags
 
        # In general gcc does not like optimization, and add -O2 where
        # it is safe.  This is especially true for gcc 3.3 + 3.4
-       replace-flags -O? -O2
+       if is-flagq -O?; then
+               newflags+=" -O2"
+       fi
 
        # gcc 3.3 doesn't support -mtune on numerous archs, so xgcc will fail
        setting="`get-flag mtune`"
@@ -90,47 +92,28 @@ do_filter_flags() {
        transform_known_flags
        setting="`get-flag march`"
        if [[ ! -z "${setting}" ]] ; then
-               is_arch_allowed "${setting}" || filter-flags -march="${setting}"
+               is_arch_allowed "${setting}" && newflags+=" -march=${setting}"
        fi
        setting="`get-flag mcpu`"
        if [[ ! -z "${setting}" ]] ; then
-               is_arch_allowed "${setting}" || filter-flags -mcpu="${setting}"
+               is_arch_allowed "${setting}" && newflags+=" -mcpu=${setting}"
        fi
 
-       # xgcc wont understand gcc 3.4 flags...
-       filter-flags -fno-unit-at-a-time
-       filter-flags -funit-at-a-time
-       filter-flags -fweb
-       filter-flags -fno-web
-       filter-flags -mno-tls-direct-seg-refs
-
-       # xgcc isnt patched with propolice
-       filter-flags -fstack-protector-all
-       filter-flags -fno-stack-protector-all
-       filter-flags -fstack-protector
-       filter-flags -fno-stack-protector
-
-       # xgcc isnt patched with the gcc symbol visibility patch
-       filter-flags -fvisibility-inlines-hidden
-       filter-flags -fvisibility=hidden
-
-       # Bug #269433 & #290202
-       filter-flags -fno-strict-overflow
-       filter-flags -fstrict-overflow
-
-       # Bug #442784
-       filter-flags '-W*'
-
-       filter-flags -frecord-gcc-switches
-       filter-flags '-fdiagnostics-color*'
-
-       # Bug #610064
-       filter-flags '-fstack-check*'
-
-       # ...sure, why not?
-       strip-unsupported-flags
-
-       strip-flags
+       # There is lots of brittle old code that violates the aliasing rules. 
GCC
+       # 3.3 supports disabling this optimization.
+       newflags+=" -fno-strict-aliasing"
+
+       # xgcc wont understand gcc 3.4 flags... in fact it won't understand most
+       # things or have most patches, regardless of what the real GCC 
understands.
+       # A random collection of bugs:
+       # #269433 #290202 #442784 #610064 #879775 #919184 #832016
+       #
+       # There's some extensive discussion at bug #923112, ultimately the only
+       # practical approach is to simply reject *all* flags unless we 
handpicked
+       # them to allow them. Check in "${S}"/gcc/doc/gcc.1 before proceeding.
+       export CFLAGS="${newflags}"
+       export CXXFLAGS="${newflags}"
+       unset LDFLAGS
 }
 
 S=${WORKDIR}/gcc-${PV}
@@ -153,6 +136,22 @@ src_prepare() {
        fi
 
        tc-export AR CC RANLIB NM
+
+       # newer versions of GCC add default werrors that we need to disable for
+       # this very old and brittle code. But adding it to CFLAGS doesn't work,
+       # since GCC creates xgcc and uses that to compile libstdc++, and the
+       # ancient xgcc doesn't understand the flags we need.
+       mkdir "${T}/conservative-compiler" || die
+       export PATH="${$}/conservative-compiler:${PATH}"
+
+       local realcc=$(type -P "${CC}") || die
+       export CC="${T}/conservative-compiler/${CC##*/}"
+       cat > "${CC}" <<- __EOF__ || die
+               #!/bin/sh
+               "${realcc}" -Wno-error=implicit-function-declaration 
-Wno-error=implicit-int -Wno-error=int-conversion 
-Wno-error=incompatible-pointer-types "\$@"
+       __EOF__
+
+       chmod +x "${CC}" || die
 }
 
 src_configure() {

Reply via email to