On 4 Nov, Don Lewis wrote:
> On 3 Nov, Don Lewis wrote:
>> For much of our history, until fairly recently, the versions of gcc that
>> we used defaulted to -std=gnu++98 when compiiling C++ code.
>>
>> When FreeBSD on i386 and amd64 switched from gcc to clang, it also
>> defaulted to -std=gnu++98. Clang has been C++11 compliant from version
>> 3.3 onwards. Around the time of the switch, I added the
>> -DHAVE_STL_INCLUDE_PATH compiler flag so that clang would use it's own
>> STL include files instead of the boost TR1 includes. Clang was
>> perfectly happy using its own STL include files even though they were
>> not part of C++98, only C++11.
>>
>> Later on, when clang 6 changed the default to gnu++14, the build
>> generated tons warning and some number of errors. To work around this,
>> I added the -std=gnu++98 compiler flag to force the old mode.
>>
>> FreeBSD on powerpc still uses gcc and it recently came to my attention
>> that the build was broken there. The FreeBSD port of AOO to powerpc
>> does not use -DHAVE_STL_INCLUDE_PATH, so it was falling back to the
>> boost TR1 headers. The FreeBSD port uses the system boost, and recent
>> versions of boost have dropped TR1 support. To work around that, I
>> tried enabling -DHAVE_STL_INCLUDE_PATH to use the gcc C++ headers. This
>> failed badly because the gcc STL headers check to see if the compilation
>> mode is C++11 or better and immediately error out of this is not the
>> case. Switching the compilation mode to c++11 results in the warning
>> and error spew mentioned above. I tried modifying the stlport headers
>> to include the gcc TR1 headers in gnu++98 mode. That worked better, but
>> I still got some mysterious C++ errors that I was not able to figure
>> out. My next attempt will be to try the boost non-TR1 headers.
>>
>> Turning to Linux as a stepping stone, I've notice the build warning
>> spewage on recent Linux distributions, such as Debian 9, that have newer
>> versions of gcc. By using the patch below, I was able to reduce the
>> size of the build log for trunk from 1354815 lines to 359998 lines. I
>> think the extra compiler defines are required because the compiler
>> detection code in our bundled version of boost is too old to figure out
>> what to do with new gcc in gnu++98 mode.
>>
>> One of the largest contributors to the warnings is std::auto_ptr. This
>> is deprecated in C++11 and is totally removed in C++17. The new way is
>> to use std::unique_ptr, but that wasn't available before C++11. We
>> can't fix our code for this until we are totally off the old toolchains,
>> which means after we have abandoned CentOS 6 and earlier as well as
>> Visual Studio earlier than 2015.
>>
>> Once our code has been converted to C++11, then I think we might be able
>> to deorbit the boost and stlport modules and just use the compiler
>> includes directly.
>>
>> diff --git a/main/solenv/gbuild/platform/linux.mk
>> b/main/solenv/gbuild/platform/linux.mk
>> index 3f35f2a3ce..0ffaf1a84f 100644
>> --- a/main/solenv/gbuild/platform/linux.mk
>> +++ b/main/solenv/gbuild/platform/linux.mk
>> @@ -89,6 +89,10 @@ gb_CXXFLAGS := \
>> -fuse-cxa-atexit \
>> -fvisibility-inlines-hidden \
>> -fvisibility=hidden \
>> + -std=gnu++98 \
>> + -DBOOST_NO_CXX11_VARIADIC_TEMPLATES \
>> + -DBOOST_NO_CXX11_RVALUE_REFERENCES \
>> + -DBOOST_NO_CXX11_STATIC_ASSERT \
>> -pipe \
>>
>> ifneq ($(EXTERNAL_WARNINGS_NOT_ERRORS),TRUE)
>> diff --git a/main/solenv/inc/unxlng.mk b/main/solenv/inc/unxlng.mk
>> index afaa50a0e5..060ee5976c 100644
>> --- a/main/solenv/inc/unxlng.mk
>> +++ b/main/solenv/inc/unxlng.mk
>> @@ -77,7 +77,7 @@ CFLAGSENABLESYMBOLS=-g # was temporarily commented out,
>> reenabled before Beta
>> .ENDIF
>>
>> # flags for the C++ Compiler
>> -CFLAGSCC= -pipe $(ARCH_FLAGS)
>> +CFLAGSCC= -pipe $(ARCH_FLAGS) -std=gnu++98
>> -DBOOST_NO_CXX11_VARIADIC_TEMPLATES -DBOOST_NO_CXX11_RVALUE_REFERENCES
>> -DBOOST_NO_CXX11_STATIC_ASSERT
>> # Flags for enabling exception handling
>> .IF "$(COM)"=="CLANG"
>> CFLAGSEXCEPTIONS=-fexceptions
>
> If I fix the compiler feature detection code in boost, then the changes
> needed to always build in gnu++98 mode on Linux are pretty trivial:
>
> diff --git a/main/boost/boost_1_55_0.patch b/main/boost/boost_1_55_0.patch
> index 6cec7bb358..df9b8ec8e0 100644
> --- a/main/boost/boost_1_55_0.patch
> +++ b/main/boost/boost_1_55_0.patch
> @@ -328,22 +328,34 @@ diff -ur
> misc/boost_1_55_0/boost/unordered/detail/unique.hpp misc/build/boost_1_
>
> ////////////////////////////////////////////////////////////////////////
> diff -ur misc/boost_1_55_0/boost/config/compiler/gcc.hpp
> misc/build/boost_1_55_0/boost/config/compiler/gcc.hpp
> --- misc/boost_1_55_0/boost/config/compiler/gcc.hpp 2013-09-17
> 09:55:51.000000000 -0700
> -+++ misc/build/boost_1_55_0/boost/config/compiler/gcc.hpp 2016-09-02
> 19:15:48.775411000 -0700
> -@@ -137,7 +137,7 @@
> ++++ misc/build/boost_1_55_0/boost/config/compiler/gcc.hpp 2019-11-04
> 09:59:20.741944674 -0800
> +@@ -137,14 +137,18 @@
>
> // C++0x features in 4.3.n and later
> //
> -#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) &&
> defined(__GXX_EXPERIMENTAL_CXX0X__)
> -+#if ((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) &&
> defined(__GXX_EXPERIMENTAL_CXX0X__)) || (__GNUC__ > 6) || (__GNUC__ == 6 &&
> __GNUC_MINOR__ > 0)
> ++#if ((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) &&
> defined(__GXX_EXPERIMENTAL_CXX0X__)) || (__cplusplus >= 201103L)
> // C++0x features are only enabled when -std=c++0x or -std=gnu++0x are
> // passed on the command line, which in turn defines
> // __GXX_EXPERIMENTAL_CXX0X__.
> -@@ -153,7 +153,7 @@
> + # define BOOST_HAS_DECLTYPE
> + # define BOOST_HAS_RVALUE_REFS
> + # define BOOST_HAS_STATIC_ASSERT
> +-# define BOOST_HAS_VARIADIC_TMPL
> ++# if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4))
> ++# define BOOST_HAS_VARIADIC_TMPL
> ++# else
> ++# define BOOST_NO_CXX11_VARIADIC_TEMPLATES
> ++# endif
> + #else
> + # define BOOST_NO_CXX11_DECLTYPE
> + # define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
> +@@ -153,7 +157,7 @@
>
> // Variadic templates compiler:
> // http://www.generic-programming.org/~dgregor/cpp/variadic-templates.html
> -# if defined(__VARIADIC_TEMPLATES) || (__GNUC__ > 4) || ((__GNUC__ == 4)
> && (__GNUC_MINOR__ >= 4) && defined(__GXX_EXPERIMENTAL_CXX0X__))
> -+# if defined(__VARIADIC_TEMPLATES) || ((__GNUC__ > 4 || (__GNUC__ == 4 &&
> __GNUC_MINOR__ > 2)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || (__GNUC__ >
> 6) || (__GNUC__ == 6 && __GNUC_MINOR__ > 0)
> ++# if defined(__VARIADIC_TEMPLATES)
> # define BOOST_HAS_VARIADIC_TMPL
> # else
> # define BOOST_NO_CXX11_VARIADIC_TEMPLATES
> diff --git a/main/solenv/gbuild/platform/linux.mk
> b/main/solenv/gbuild/platform/linux.mk
> index 3f35f2a3ce..02b8830a39 100644
> --- a/main/solenv/gbuild/platform/linux.mk
> +++ b/main/solenv/gbuild/platform/linux.mk
> @@ -89,6 +89,7 @@ gb_CXXFLAGS := \
> -fuse-cxa-atexit \
> -fvisibility-inlines-hidden \
> -fvisibility=hidden \
> + -std=gnu++98 \
> -pipe \
>
> ifneq ($(EXTERNAL_WARNINGS_NOT_ERRORS),TRUE)
> diff --git a/main/solenv/inc/unxlng.mk b/main/solenv/inc/unxlng.mk
> index afaa50a0e5..32b88bc91d 100644
> --- a/main/solenv/inc/unxlng.mk
> +++ b/main/solenv/inc/unxlng.mk
> @@ -77,7 +77,7 @@ CFLAGSENABLESYMBOLS=-g # was temporarily commented out,
> reenabled before Beta
> .ENDIF
>
> # flags for the C++ Compiler
> -CFLAGSCC= -pipe $(ARCH_FLAGS)
> +CFLAGSCC= -pipe $(ARCH_FLAGS) -std=gnu++98
> # Flags for enabling exception handling
> .IF "$(COM)"=="CLANG"
> CFLAGSEXCEPTIONS=-fexceptions
Now that I have committed the boost fixes, the patch below is all that
is needed to build in gnu++98 mode. My previous patch to the .mk files
was slightly incorrect. I was mislead by the comments and added
std=gnu++98 to the wrong line. This further greatly reduces the size of
build log:
c++11 mode: 1354815 lines
gnu++98 mode (previous): 360051 lines
gnu++98 mode (latest): 246152 lines
diff --git a/main/solenv/gbuild/platform/linux.mk
b/main/solenv/gbuild/platform/linux.mk
index 3f35f2a3ce..02b8830a39 100644
--- a/main/solenv/gbuild/platform/linux.mk
+++ b/main/solenv/gbuild/platform/linux.mk
@@ -89,6 +89,7 @@ gb_CXXFLAGS := \
-fuse-cxa-atexit \
-fvisibility-inlines-hidden \
-fvisibility=hidden \
+ -std=gnu++98 \
-pipe \
ifneq ($(EXTERNAL_WARNINGS_NOT_ERRORS),TRUE)
diff --git a/main/solenv/inc/unxlng.mk b/main/solenv/inc/unxlng.mk
index afaa50a0e5..f79f3b15aa 100644
--- a/main/solenv/inc/unxlng.mk
+++ b/main/solenv/inc/unxlng.mk
@@ -88,7 +88,7 @@ CFLAGSEXCEPTIONS=-fexceptions -fno-enforce-eh-specs
CFLAGS_NO_EXCEPTIONS=-fno-exceptions
# -fpermissive should be removed as soon as possible
-CFLAGSCXX= -pipe $(ARCH_FLAGS)
+CFLAGSCXX= -pipe $(ARCH_FLAGS) -std=gnu++98
.IF "$(HAVE_GCC_VISIBILITY_FEATURE)" == "TRUE"
CFLAGSCXX += -fvisibility-inlines-hidden
.ENDIF # "$(HAVE_GCC_VISIBILITY_FEATURE)" == "TRUE"
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]