Control Werror by converting to Wno-error (#30882)
Using `-Werror` is good practice for development and testing, but causes us a great deal of heartburn supporting multiple compiler versions, especially as newer compiler versions add warnings for released packages. This PR adds support for suppressing `-Werror` through spack's compiler wrappers. There are currently three modes for the `flags:keep_werror` setting: * `none`: (default) cancel all `-Werror`, `-Werror=*` and `-Werror-*` flags by converting them to `-Wno-error[=]*` flags * `specific`: preserve explicitly selected warnings as errors, such as `-Werror=format-truncation`, but reverse the blanket `-Werror` * `all`: keeps all `-Werror` flags These can be set globally in config.yaml, through the config command-line flags, or overridden by a particular package (some packages use Werror as a proxy for determining support for other compiler features). We chose to use this approach because: 1. removing `-Werror` flags entirely broke *many* build systems, especially autoconf based ones, because of things like checking `-Werror=feature` and making the assumption that if that did not error other flags related to that feature would also work 2. Attempting to preserve `-Werror` in some phases but not others caused similar issues 3. The per-package setting came about because some packages, even with all these protections, still use `-Werror` unsafely. Currently there are roughly 3 such packages known.
This commit is contained in:
		
							
								
								
									
										41
									
								
								lib/spack/env/cc
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								lib/spack/env/cc
									
									
									
									
										vendored
									
									
								
							@@ -440,6 +440,47 @@ while [ $# -ne 0 ]; do
 | 
			
		||||
        continue
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if [ -n "${SPACK_COMPILER_FLAGS_KEEP}" ] ; then
 | 
			
		||||
        # NOTE: the eval is required to allow `|` alternatives inside the variable
 | 
			
		||||
        eval "\
 | 
			
		||||
        case \"\$1\" in
 | 
			
		||||
            $SPACK_COMPILER_FLAGS_KEEP)
 | 
			
		||||
                append other_args_list \"\$1\"
 | 
			
		||||
                shift
 | 
			
		||||
                continue
 | 
			
		||||
                ;;
 | 
			
		||||
        esac
 | 
			
		||||
        "
 | 
			
		||||
    fi
 | 
			
		||||
    # the replace list is a space-separated list of pipe-separated pairs,
 | 
			
		||||
    # the first in each pair is the original prefix to be matched, the
 | 
			
		||||
    # second is the replacement prefix
 | 
			
		||||
    if [ -n "${SPACK_COMPILER_FLAGS_REPLACE}" ] ; then
 | 
			
		||||
        for rep in ${SPACK_COMPILER_FLAGS_REPLACE} ; do
 | 
			
		||||
            before=${rep%|*}
 | 
			
		||||
            after=${rep#*|}
 | 
			
		||||
            eval "\
 | 
			
		||||
            stripped=\"\${1##$before}\"
 | 
			
		||||
            "
 | 
			
		||||
            if [ "$stripped" = "$1" ] ; then
 | 
			
		||||
                continue
 | 
			
		||||
            fi
 | 
			
		||||
 | 
			
		||||
            replaced="$after$stripped" 
 | 
			
		||||
 | 
			
		||||
            # it matched, remove it
 | 
			
		||||
            shift
 | 
			
		||||
 | 
			
		||||
            if [ -z "$replaced" ] ; then
 | 
			
		||||
                # completely removed, continue OUTER loop
 | 
			
		||||
                continue 2
 | 
			
		||||
            fi
 | 
			
		||||
 | 
			
		||||
            # re-build argument list with replacement
 | 
			
		||||
            set -- "$replaced" "$@"
 | 
			
		||||
        done
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    case "$1" in
 | 
			
		||||
        -isystem*)
 | 
			
		||||
            arg="${1#-isystem}"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user