Author: brane Date: Sun Jul 6 12:54:56 2025 New Revision: 1926999 URL: http://svn.apache.org/viewvc?rev=1926999&view=rev Log: All GCC-like compilers were not created equal. Make sure we don't use extra warning flags that the C compiler doesn't accept.
* build/SerfChecks.cmake: (CheckCFlag): New macro, checks if a warning flag is acceptable. * CMakeLists.txt: Use CheckCFlag for maintainer-mode flags. * build/scons_extras.py (__env_check_c_flag): New, check if a compiler flag is acceptable. (AddEnvironmentMethods): Register it as SerfCheckCFlag. * SConstruct: Use SerfCheckCFlag for debug-mode flags. Modified: serf/trunk/CMakeLists.txt serf/trunk/SConstruct serf/trunk/build/SerfChecks.cmake serf/trunk/build/scons_extras.py Modified: serf/trunk/CMakeLists.txt URL: http://svn.apache.org/viewvc/serf/trunk/CMakeLists.txt?rev=1926999&r1=1926998&r2=1926999&view=diff ============================================================================== --- serf/trunk/CMakeLists.txt (original) +++ serf/trunk/CMakeLists.txt Sun Jul 6 12:54:56 2025 @@ -370,14 +370,16 @@ if(NOT MSVC) string(APPEND CMAKE_C_FLAGS_DEBUG " -O0") if(SERF_MAINTAINER_MODE) + # This is for clang, which happily accepts unknow warning options. + CheckCFlag(SERF_C_WARNINGS "-Werror=unknown-warning-option") # Additional warning flags for more pedantic checks - list(APPEND SERF_C_WARNINGS "-Wimplicit-function-declaration") - list(APPEND SERF_C_WARNINGS "-Wmissing-variable-declarations") - list(APPEND SERF_C_WARNINGS "-Wunreachable-code") - list(APPEND SERF_C_WARNINGS "-Wshorten-64-to-32") - list(APPEND SERF_C_WARNINGS "-Wno-system-headers") - list(APPEND SERF_C_WARNINGS "-Wextra-tokens") - list(APPEND SERF_C_WARNINGS "-Wnewline-eof") + CheckCFlag(SERF_C_WARNINGS "-Wimplicit-function-declaration") + CheckCFlag(SERF_C_WARNINGS "-Wmissing-variable-declarations") + CheckCFlag(SERF_C_WARNINGS "-Wunreachable-code") + CheckCFlag(SERF_C_WARNINGS "-Wshorten-64-to-32") + CheckCFlag(SERF_C_WARNINGS "-Wno-system-headers") + CheckCFlag(SERF_C_WARNINGS "-Wextra-tokens") + CheckCFlag(SERF_C_WARNINGS "-Wnewline-eof") endif() endif() else() Modified: serf/trunk/SConstruct URL: http://svn.apache.org/viewvc/serf/trunk/SConstruct?rev=1926999&r1=1926998&r2=1926999&view=diff ============================================================================== --- serf/trunk/SConstruct (original) +++ serf/trunk/SConstruct Sun Jul 6 12:54:56 2025 @@ -368,13 +368,16 @@ if sys.platform != 'win32': # env.Append(CCFLAGS=['-g']) env.SerfAppendIf(['CFLAGS', 'CCFLAGS'], r'-g\S*', CCFLAGS=['-g']) env.Append(CPPDEFINES=['DEBUG', '_DEBUG']) - env.Append(CCFLAGS=['-Wimplicit-function-declaration', - '-Wmissing-variable-declarations', - '-Wunreachable-code', - '-Wshorten-64-to-32', - '-Wno-system-headers', - '-Wextra-tokens', - '-Wnewline-eof']) + for flag in ['-Werror=unknown-warning-option', + '-Wimplicit-function-declaration', + '-Wmissing-variable-declarations', + '-Wunreachable-code', + '-Wshorten-64-to-32', + '-Wno-system-headers', + '-Wextra-tokens', + '-Wnewline-eof']: + if env.SerfCheckCFlag(flag): + env.Append(CCFLAGS=[flag]) else: # env.Append(CCFLAGS=['-O2']) env.SerfAppendIf(['CFLAGS', 'CCFLAGS'], r'-O\S*', CCFLAGS=['-O2']) Modified: serf/trunk/build/SerfChecks.cmake URL: http://svn.apache.org/viewvc/serf/trunk/build/SerfChecks.cmake?rev=1926999&r1=1926998&r2=1926999&view=diff ============================================================================== --- serf/trunk/build/SerfChecks.cmake (original) +++ serf/trunk/build/SerfChecks.cmake Sun Jul 6 12:54:56 2025 @@ -18,6 +18,7 @@ # =================================================================== include(CheckCSourceCompiles) +include(CheckCCompilerFlag) include(CheckIncludeFile) include(CheckTypeSize) @@ -141,3 +142,13 @@ macro(CheckType name_ header_ symbol_) list(APPEND SERF_C_DEFINES "${symbol_}") endif() endmacro(CheckType) + + +macro(CheckCFlag list_ flag_) + string(REGEX REPLACE "[/=-]" "__" __c__ "serf_feature_CheckCFlag_${flag_}") + check_c_compiler_flag(${flag_} ${__c__}) + if(${__c__}) + list(APPEND ${list_} ${flag_}) + endif() + unset(__c__) +endmacro(CheckCFlag) Modified: serf/trunk/build/scons_extras.py URL: http://svn.apache.org/viewvc/serf/trunk/build/scons_extras.py?rev=1926999&r1=1926998&r2=1926999&view=diff ============================================================================== --- serf/trunk/build/scons_extras.py (original) +++ serf/trunk/build/scons_extras.py Sun Jul 6 12:54:56 2025 @@ -22,6 +22,7 @@ import re import SCons.Environment +import SCons.SConf import SCons.Util @@ -54,6 +55,20 @@ def __env_munge_if(env, method, variable getattr(env, method)(**kwargs) +def __env_check_c_flag(env, flag): + '''Check if the C compiler accepts the `flag`''' + + xenv = env.Clone() + xenv.Append(CCFLAGS=[flag]) + xonf = SCons.SConf.SConf(xenv) + xmsg = SCons.SConf.CheckContext(xonf) + xmsg.Display('Checking if the C compiler accepts %s... ' % (flag,)) + result = xonf.TryCompile('int main(void) { return 0; }', '.c') + xmsg.Result(result) + xonf.Finish() + return result + + def AddEnvironmentMethods(): SCons.Util.AddMethod( SCons.Environment.Environment, @@ -65,6 +80,9 @@ def AddEnvironmentMethods(): lambda env, variables, pattern, **kwargs: __env_munge_if(env, 'Prepend', variables, pattern, **kwargs), 'SerfPrependIf') + SCons.Util.AddMethod( + SCons.Environment.Environment, + __env_check_c_flag, 'SerfCheckCFlag') #