qemu-devel
[Top][All Lists]
Advanced

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

Re: [PATCH 4/5] configure, meson: move C++ compiler detection to meson.b


From: Marc-André Lureau
Subject: Re: [PATCH 4/5] configure, meson: move C++ compiler detection to meson.build
Date: Tue, 27 Sep 2022 15:00:30 +0400

On Tue, Sep 27, 2022 at 1:59 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> The test is slightly weaker than before, because it does not
> call an extern "C" function from a C source file.  However,
> in practice what we seek to detect is ABI compatibility of the
> various sanitizer flags, and for that it is enough to compile
> anything with CC and link it with CXX.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


> ---
>  configure      | 57 --------------------------------------------------
>  meson.build    | 37 ++++++++++++++++++++++----------
>  scripts/main.c |  1 +
>  3 files changed, 27 insertions(+), 68 deletions(-)
>  create mode 100644 scripts/main.c
>
> diff --git a/configure b/configure
> index 680d96d09f..0a6f57c371 100755
> --- a/configure
> +++ b/configure
> @@ -75,7 +75,6 @@ fi
>  TMPB="qemu-conf"
>  TMPC="${TMPDIR1}/${TMPB}.c"
>  TMPO="${TMPDIR1}/${TMPB}.o"
> -TMPCXX="${TMPDIR1}/${TMPB}.cxx"
>  TMPM="${TMPDIR1}/${TMPB}.m"
>  TMPE="${TMPDIR1}/${TMPB}.exe"
>
> @@ -158,10 +157,6 @@ do_cc() {
>      do_compiler_werror "$cc" $CPU_CFLAGS "$@"
>  }
>
> -do_cxx() {
> -    do_compiler_werror "$cxx" $CPU_CFLAGS "$@"
> -}
> -
>  do_objc() {
>      do_compiler_werror "$objcc" $CPU_CFLAGS "$@"
>  }
> @@ -171,24 +166,6 @@ add_to() {
>      eval $1=\${$1:+\"\$$1 \"}\$2
>  }
>
> -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="-D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS 
> -D__STDC_FORMAT_MACROS"
> -    CONFIGURE_CXXFLAGS=$(echo "$CONFIGURE_CFLAGS" | sed 
> s/-std=gnu11/-std=gnu++11/)
> -    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() {
>    local_cflags="$1"
>    do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags 
> -c -o $TMPO $TMPC
> @@ -2371,38 +2348,6 @@ fi
>  #######################################
>  # generate config-host.mak
>
> -# Check that the C++ compiler exists and works with the C compiler.
> -# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to 
> don't miss any other that could be added.
> -if has $cxx; then
> -    cat > $TMPC <<EOF
> -int c_function(void);
> -int main(void) { return c_function(); }
> -EOF
> -
> -    compile_object
> -
> -    cat > $TMPCXX <<EOF
> -extern "C" {
> -   int c_function(void);
> -}
> -int c_function(void) { return 42; }
> -EOF
> -
> -    update_cxxflags
> -
> -    if do_cxx $CXXFLAGS $EXTRA_CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS 
> -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
> -        # C++ compiler $cxx works ok with C compiler $cc
> -        :
> -    else
> -        echo "C++ compiler $cxx does not work with C compiler $cc"
> -        echo "Disabling C++ specific optional code"
> -        cxx=
> -    fi
> -else
> -    echo "No C++ compiler available; disabling C++ specific optional code"
> -    cxx=
> -fi
> -
>  if ! (GIT="$git" "$source_path/scripts/git-submodule.sh" 
> "$git_submodules_action" "$git_submodules"); then
>      exit 1
>  fi
> @@ -2486,7 +2431,6 @@ echo "MESON=$meson" >> $config_host_mak
>  echo "NINJA=$ninja" >> $config_host_mak
>  echo "CC=$cc" >> $config_host_mak
>  echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
> -echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
>  echo "QEMU_OBJCFLAGS=$QEMU_OBJCFLAGS" >> $config_host_mak
>  echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
>  echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
> @@ -2608,7 +2552,6 @@ if test "$skip_meson" = no; then
>        echo "${a}-softmmu = '$c'" >> $cross
>    done
>
> -  test -z "$cxx" && echo "link_language = 'c'" >> $cross
>    echo "[built-in options]" >> $cross
>    echo "c_args = [$(meson_quote $CFLAGS $EXTRA_CFLAGS)]" >> $cross
>    echo "cpp_args = [$(meson_quote $CXXFLAGS $EXTRA_CXXFLAGS)]" >> $cross
> diff --git a/meson.build b/meson.build
> index e1700d1d55..f57a60ac4c 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -180,7 +180,6 @@ endif
>  ##################
>
>  qemu_cflags = config_host['QEMU_CFLAGS'].split()
> -qemu_cxxflags = config_host['QEMU_CXXFLAGS'].split()
>  qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
>  qemu_ldflags = config_host['QEMU_LDFLAGS'].split()
>
> @@ -194,7 +193,6 @@ endif
>
>  if get_option('gprof')
>    qemu_cflags += ['-p']
> -  qemu_cxxflags += ['-p']
>    qemu_objcflags += ['-p']
>    qemu_ldflags += ['-p']
>  endif
> @@ -240,8 +238,33 @@ if get_option('fuzzing')
>  endif
>
>  add_global_arguments(qemu_cflags, native: false, language: ['c'])
> -add_global_arguments(qemu_cxxflags, native: false, language: ['cpp'])
>  add_global_arguments(qemu_objcflags, native: false, language: ['objc'])
> +
> +# Check that the C++ compiler exists and works with the C compiler.
> +link_language = 'c'
> +linker = cc
> +qemu_cxxflags = []
> +if add_languages('cpp', required: false, native: false)
> +  cxx = meson.get_compiler('cpp')
> +  add_global_arguments(['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', 
> '-D__STDC_FORMAT_MACROS'],
> +                       native: false, language: 'cpp')
> +  foreach k: qemu_cflags
> +    if k not in ['-Wstrict-prototypes', '-Wmissing-prototypes', 
> '-Wnested-externs',
> +                 '-Wold-style-declaration', '-Wold-style-definition', 
> '-Wredundant-decls']
> +      qemu_cxxflags += [k]
> +    endif
> +  endforeach
> +  add_global_arguments(qemu_cxxflags, native: false, language: 'cpp')
> +
> +  if cxx.links(files('scripts/main.c'), args: qemu_cflags)
> +    link_language = 'cpp'
> +    linker = cxx
> +  else
> +    message('C++ compiler does not work with C compiler')
> +    message('Disabling C++-specific optional code')
> +  endif
> +endif
> +
>  add_global_link_arguments(qemu_ldflags, native: false, language: ['c', 
> 'cpp', 'objc'])
>
>  if targetos == 'linux'
> @@ -255,14 +278,6 @@ add_project_arguments('-iquote', '.',
>                        '-iquote', meson.current_source_dir() / 'include',
>                        language: ['c', 'cpp', 'objc'])
>
> -link_language = meson.get_external_property('link_language', 'cpp')
> -if link_language == 'cpp'
> -  add_languages('cpp', required: true, native: false)
> -  cxx = meson.get_compiler('cpp')
> -  linker = cxx
> -else
> -  linker = cc
> -endif
>  if host_machine.system() == 'darwin'
>    add_languages('objc', required: false, native: false)
>  endif
> diff --git a/scripts/main.c b/scripts/main.c
> new file mode 100644
> index 0000000000..b552c8e4ed
> --- /dev/null
> +++ b/scripts/main.c
> @@ -0,0 +1 @@
> +int main(void) {}
> --
> 2.37.3
>




reply via email to

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