configure, meson: move C++ compiler detection to meson.build
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. Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
6d3226357f
commit
b485458e00
57
configure
vendored
57
configure
vendored
@ -75,7 +75,6 @@ fi
|
|||||||
TMPB="qemu-conf"
|
TMPB="qemu-conf"
|
||||||
TMPC="${TMPDIR1}/${TMPB}.c"
|
TMPC="${TMPDIR1}/${TMPB}.c"
|
||||||
TMPO="${TMPDIR1}/${TMPB}.o"
|
TMPO="${TMPDIR1}/${TMPB}.o"
|
||||||
TMPCXX="${TMPDIR1}/${TMPB}.cxx"
|
|
||||||
TMPM="${TMPDIR1}/${TMPB}.m"
|
TMPM="${TMPDIR1}/${TMPB}.m"
|
||||||
TMPE="${TMPDIR1}/${TMPB}.exe"
|
TMPE="${TMPDIR1}/${TMPB}.exe"
|
||||||
|
|
||||||
@ -158,10 +157,6 @@ do_cc() {
|
|||||||
do_compiler_werror "$cc" $CPU_CFLAGS "$@"
|
do_compiler_werror "$cc" $CPU_CFLAGS "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
do_cxx() {
|
|
||||||
do_compiler_werror "$cxx" $CPU_CFLAGS "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
do_objc() {
|
do_objc() {
|
||||||
do_compiler_werror "$objcc" $CPU_CFLAGS "$@"
|
do_compiler_werror "$objcc" $CPU_CFLAGS "$@"
|
||||||
}
|
}
|
||||||
@ -171,24 +166,6 @@ add_to() {
|
|||||||
eval $1=\${$1:+\"\$$1 \"}\$2
|
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() {
|
compile_object() {
|
||||||
local_cflags="$1"
|
local_cflags="$1"
|
||||||
do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
|
do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
|
||||||
@ -2362,38 +2339,6 @@ fi
|
|||||||
#######################################
|
#######################################
|
||||||
# generate config-host.mak
|
# 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
|
if ! (GIT="$git" "$source_path/scripts/git-submodule.sh" "$git_submodules_action" "$git_submodules"); then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@ -2474,7 +2419,6 @@ echo "MESON=$meson" >> $config_host_mak
|
|||||||
echo "NINJA=$ninja" >> $config_host_mak
|
echo "NINJA=$ninja" >> $config_host_mak
|
||||||
echo "CC=$cc" >> $config_host_mak
|
echo "CC=$cc" >> $config_host_mak
|
||||||
echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $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 "QEMU_OBJCFLAGS=$QEMU_OBJCFLAGS" >> $config_host_mak
|
||||||
echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
|
echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
|
||||||
echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
|
echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
|
||||||
@ -2665,7 +2609,6 @@ if test "$skip_meson" = no; then
|
|||||||
echo "${a}-softmmu = '$c'" >> $cross
|
echo "${a}-softmmu = '$c'" >> $cross
|
||||||
done
|
done
|
||||||
|
|
||||||
test -z "$cxx" && echo "link_language = 'c'" >> $cross
|
|
||||||
echo "[built-in options]" >> $cross
|
echo "[built-in options]" >> $cross
|
||||||
echo "c_args = [$(meson_quote $CFLAGS $EXTRA_CFLAGS)]" >> $cross
|
echo "c_args = [$(meson_quote $CFLAGS $EXTRA_CFLAGS)]" >> $cross
|
||||||
echo "cpp_args = [$(meson_quote $CXXFLAGS $EXTRA_CXXFLAGS)]" >> $cross
|
echo "cpp_args = [$(meson_quote $CXXFLAGS $EXTRA_CXXFLAGS)]" >> $cross
|
||||||
|
37
meson.build
37
meson.build
@ -180,7 +180,6 @@ endif
|
|||||||
##################
|
##################
|
||||||
|
|
||||||
qemu_cflags = config_host['QEMU_CFLAGS'].split()
|
qemu_cflags = config_host['QEMU_CFLAGS'].split()
|
||||||
qemu_cxxflags = config_host['QEMU_CXXFLAGS'].split()
|
|
||||||
qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
|
qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
|
||||||
qemu_ldflags = config_host['QEMU_LDFLAGS'].split()
|
qemu_ldflags = config_host['QEMU_LDFLAGS'].split()
|
||||||
|
|
||||||
@ -194,7 +193,6 @@ endif
|
|||||||
|
|
||||||
if get_option('gprof')
|
if get_option('gprof')
|
||||||
qemu_cflags += ['-p']
|
qemu_cflags += ['-p']
|
||||||
qemu_cxxflags += ['-p']
|
|
||||||
qemu_objcflags += ['-p']
|
qemu_objcflags += ['-p']
|
||||||
qemu_ldflags += ['-p']
|
qemu_ldflags += ['-p']
|
||||||
endif
|
endif
|
||||||
@ -240,8 +238,33 @@ if get_option('fuzzing')
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
add_global_arguments(qemu_cflags, native: false, language: ['c'])
|
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'])
|
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'])
|
add_global_link_arguments(qemu_ldflags, native: false, language: ['c', 'cpp', 'objc'])
|
||||||
|
|
||||||
if targetos == 'linux'
|
if targetos == 'linux'
|
||||||
@ -255,14 +278,6 @@ add_project_arguments('-iquote', '.',
|
|||||||
'-iquote', meson.current_source_dir() / 'include',
|
'-iquote', meson.current_source_dir() / 'include',
|
||||||
language: ['c', 'cpp', 'objc'])
|
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'
|
if host_machine.system() == 'darwin'
|
||||||
add_languages('objc', required: false, native: false)
|
add_languages('objc', required: false, native: false)
|
||||||
endif
|
endif
|
||||||
|
1
scripts/main.c
Normal file
1
scripts/main.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
int main(void) {}
|
Loading…
Reference in New Issue
Block a user