qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] configure: Make C++ test work with --enable-wer


From: Thomas Huth
Subject: Re: [Qemu-devel] [PATCH] configure: Make C++ test work with --enable-werror
Date: Tue, 25 Feb 2014 08:44:57 +0100

On Mon, 24 Feb 2014 19:08:18 +0000
Peter Maydell <address@hidden> wrote:

> gcc's C++ compiler complains about being passed some -W options
> which make sense for C but not for C++. This means we mustn't try
> a C++ compile with QEMU_CFLAGS, but only with a filtered version
> that removes the offending options. This filtering was already being
> done for uses of C++ in the build itself, but was omitted for the
> "does C++ work?" configure test. This only showed up when doing
> builds which explicitly enabled -Werror with --enable-werror,
> because the "do the compilers work" tests were mistakenly placed
> above the "default werror based on whether compiling from git" code.
> Further, when the test did fail configure would plunge on regardless
> of the error since we were running do_cc in a subshell. Fix this
> complex of errors:
> 
> 1. Move the default-werror code up so that there are no invocations
> of compile_object and friends between it and the point where we
> set $werror explicitly based on the --enable-werror command line
> option.
> 
> 2. Provide a mechanism for filtering QEMU_CFLAGS to create
> QEMU_CXXFLAGS, and use it for the test we run here.
> 
> 3. Provide a do_cxx function to run a test with the C++ compiler
> rather than doing cute tricks with subshells and do_cc.
> 
> Signed-off-by: Peter Maydell <address@hidden>
> ---
> This was pretty confusing to debug (mostly because I got tripped
> up by the issue fixed by 1. above)...
> 
> We could probably roll do_libtool into do_compiler, but I'd rather
> not mix that cleanup up with this build-breakage fix.
> 
>  configure | 70 
> +++++++++++++++++++++++++++++++++++++++++++++------------------
>  1 file changed, 50 insertions(+), 20 deletions(-)
> 
> diff --git a/configure b/configure
> index 00f9070..d5929d6 100755
> --- a/configure
> +++ b/configure
> @@ -54,10 +54,13 @@ error_exit() {
>      exit 1
>  }
> 
> -do_cc() {
> -    # Run the compiler, capturing its output to the log.
> -    echo $cc "$@" >> config.log
> -    $cc "$@" >> config.log 2>&1 || return $?
> +do_compiler() {
> +    # Run the compiler, capturing its output to the log. First argument
> +    # is compiler binary to execute.
> +    local compiler="$1"
> +    shift
> +    echo $compiler "$@" >> config.log
> +    $compiler "$@" >> config.log 2>&1 || return $?
>      # Test passed. If this is an --enable-werror build, rerun
>      # the test with -Werror and bail out if it fails. This
>      # makes warning-generating-errors in configure test code
> @@ -71,14 +74,39 @@ do_cc() {
>             return 0
>          ;;
>      esac
> -    echo $cc -Werror "$@" >> config.log
> -    $cc -Werror "$@" >> config.log 2>&1 && return $?
> +    echo $compiler -Werror "$@" >> config.log
> +    $compiler -Werror "$@" >> config.log 2>&1 && return $?
>      error_exit "configure test passed without -Werror but failed with 
> -Werror." \
>          "This is probably a bug in the configure script. The failing 
> command" \
>          "will be at the bottom of config.log." \
>          "You can run configure with --disable-werror to bypass this check."
>  }
> 
> +do_cc() {
> +    do_compiler "$cc" "$@"
> +}
> +
> +do_cxx() {
> +    do_compiler "$cxx" "$@"
> +}
> +
> +update_cxxflags() {
> +    # Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those
> +    # options which some versions of GCC's C++ compiler complain about
> +    # because they only make sense for C programs.
> +    QEMU_CXXFLAGS=
> +    for arg in $QEMU_CFLAGS; do
> +        case $arg in
> +            -Wstrict-prototypes|-Wmissing-prototypes|-Wnested-externs|\
> +            -Wold-style-declaration|-Wold-style-definition|-Wredundant-decls)
> +                ;;
> +            *)
> +                QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }$arg
> +                ;;
> +        esac
> +    done
> +}
> +
>  compile_object() {
>    do_cc $QEMU_CFLAGS -c -o $TMPO $TMPC
>  }
> @@ -1320,6 +1348,19 @@ if test "$ARCH" = "unknown"; then
>      fi
>  fi
> 
> +# Consult white-list to determine whether to enable werror
> +# by default.  Only enable by default for git builds
> +z_version=`cut -f3 -d. $source_path/VERSION`
> +
> +if test -z "$werror" ; then
> +    if test -d "$source_path/.git" -a \
> +        "$linux" = "yes" ; then
> +        werror="yes"
> +    else
> +        werror="no"
> +    fi
> +fi
> +
>  # check that the C compiler works.
>  cat > $TMPC <<EOF
>  int main(void) { return 0; }
> @@ -1347,7 +1388,9 @@ extern "C" {
>  int c_function(void) { return 42; }
>  EOF
> 
> -    if (cc=$cxx do_cc $QEMU_CFLAGS -o $TMPE $TMPC $TMPO $LDFLAGS); then
> +    update_cxxflags
> +
> +    if do_cxx $QEMU_CXXFLAGS -o $TMPE $TMPC $TMPO $LDFLAGS; then
>          # C++ compiler $cxx works ok with C compiler $cc
>          :
>      else
> @@ -1360,19 +1403,6 @@ else
>      cxx=
>  fi
> 
> -# Consult white-list to determine whether to enable werror
> -# by default.  Only enable by default for git builds
> -z_version=`cut -f3 -d. $source_path/VERSION`
> -
> -if test -z "$werror" ; then
> -    if test -d "$source_path/.git" -a \
> -        "$linux" = "yes" ; then
> -        werror="yes"
> -    else
> -        werror="no"
> -    fi
> -fi
> -
>  gcc_flags="-Wold-style-declaration -Wold-style-definition -Wtype-limits"
>  gcc_flags="-Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers 
> $gcc_flags"
>  gcc_flags="-Wmissing-include-dirs -Wempty-body -Wnested-externs $gcc_flags"

Looks fine to me.
Reviewed-by: Thomas Huth <address@hidden>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]