build: move warning flag selection to meson
Meson already knows to test with the positive form of the flag, which simplifies the test. Warnings are now tested explicitly for the C++ compiler, instead of hardcoding those that are only available for the C language. At this point all compiler flags in QEMU_CFLAGS are global and only depend on the OS. No feature tests are performed in configure. Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
911d4caaa2
commit
95caf1fb42
86
configure
vendored
86
configure
vendored
@ -79,7 +79,6 @@ fi
|
||||
TMPB="qemu-conf"
|
||||
TMPC="${TMPDIR1}/${TMPB}.c"
|
||||
TMPO="${TMPDIR1}/${TMPB}.o"
|
||||
TMPM="${TMPDIR1}/${TMPB}.m"
|
||||
TMPE="${TMPDIR1}/${TMPB}.exe"
|
||||
|
||||
rm -f config.log
|
||||
@ -162,15 +161,6 @@ do_cc() {
|
||||
do_compiler_werror "$cc" $CPU_CFLAGS "$@"
|
||||
}
|
||||
|
||||
do_objc() {
|
||||
do_compiler_werror "$objcc" $CPU_CFLAGS "$@"
|
||||
}
|
||||
|
||||
# Append $2 to the variable named $1, with space separation
|
||||
add_to() {
|
||||
eval $1=\${$1:+\"\$$1 \"}\$2
|
||||
}
|
||||
|
||||
compile_object() {
|
||||
local_cflags="$1"
|
||||
do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
|
||||
@ -1186,81 +1176,6 @@ if ! compile_prog "" "" ; then
|
||||
error_exit "You need at least GCC v7.4 or Clang v10.0 (or XCode Clang v12.0)"
|
||||
fi
|
||||
|
||||
# Accumulate -Wfoo and -Wno-bar separately.
|
||||
# We will list all of the enable flags first, and the disable flags second.
|
||||
# Note that we do not add -Werror, because that would enable it for all
|
||||
# configure tests. If a configure test failed due to -Werror this would
|
||||
# just silently disable some features, so it's too error prone.
|
||||
|
||||
warn_flags=
|
||||
add_to warn_flags -Wundef
|
||||
add_to warn_flags -Wwrite-strings
|
||||
add_to warn_flags -Wmissing-prototypes
|
||||
add_to warn_flags -Wstrict-prototypes
|
||||
add_to warn_flags -Wredundant-decls
|
||||
add_to warn_flags -Wold-style-declaration
|
||||
add_to warn_flags -Wold-style-definition
|
||||
add_to warn_flags -Wtype-limits
|
||||
add_to warn_flags -Wformat-security
|
||||
add_to warn_flags -Wformat-y2k
|
||||
add_to warn_flags -Winit-self
|
||||
add_to warn_flags -Wignored-qualifiers
|
||||
add_to warn_flags -Wempty-body
|
||||
add_to warn_flags -Wnested-externs
|
||||
add_to warn_flags -Wendif-labels
|
||||
add_to warn_flags -Wexpansion-to-defined
|
||||
add_to warn_flags -Wimplicit-fallthrough=2
|
||||
add_to warn_flags -Wmissing-format-attribute
|
||||
|
||||
if test "$targetos" != "darwin"; then
|
||||
add_to warn_flags -Wthread-safety
|
||||
fi
|
||||
|
||||
nowarn_flags=
|
||||
add_to nowarn_flags -Wno-initializer-overrides
|
||||
add_to nowarn_flags -Wno-missing-include-dirs
|
||||
add_to nowarn_flags -Wno-shift-negative-value
|
||||
add_to nowarn_flags -Wno-string-plus-int
|
||||
add_to nowarn_flags -Wno-typedef-redefinition
|
||||
add_to nowarn_flags -Wno-tautological-type-limit-compare
|
||||
add_to nowarn_flags -Wno-psabi
|
||||
add_to nowarn_flags -Wno-gnu-variable-sized-type-not-at-end
|
||||
|
||||
gcc_flags="$warn_flags $nowarn_flags"
|
||||
|
||||
cc_has_warning_flag() {
|
||||
write_c_skeleton;
|
||||
|
||||
# Use the positive sense of the flag when testing for -Wno-wombat
|
||||
# support (gcc will happily accept the -Wno- form of unknown
|
||||
# warning options).
|
||||
optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
|
||||
compile_prog "-Werror $optflag" ""
|
||||
}
|
||||
|
||||
objcc_has_warning_flag() {
|
||||
cat > $TMPM <<EOF
|
||||
int main(void) { return 0; }
|
||||
EOF
|
||||
|
||||
# Use the positive sense of the flag when testing for -Wno-wombat
|
||||
# support (gcc will happily accept the -Wno- form of unknown
|
||||
# warning options).
|
||||
optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
|
||||
do_objc -Werror $optflag \
|
||||
$OBJCFLAGS $EXTRA_OBJCFLAGS $CONFIGURE_OBJCFLAGS $QEMU_OBJCFLAGS \
|
||||
-o $TMPE $TMPM
|
||||
}
|
||||
|
||||
for flag in $gcc_flags; do
|
||||
if cc_has_warning_flag $flag ; then
|
||||
QEMU_CFLAGS="$QEMU_CFLAGS $flag"
|
||||
fi
|
||||
if objcc_has_warning_flag $flag ; then
|
||||
QEMU_OBJCFLAGS="$QEMU_OBJCFLAGS $flag"
|
||||
fi
|
||||
done
|
||||
|
||||
if test "$static" = "yes" ; then
|
||||
if test "$plugins" = "yes"; then
|
||||
error_exit "static and plugins are mutually incompatible"
|
||||
@ -2017,7 +1932,6 @@ echo "NINJA=$ninja" >> $config_host_mak
|
||||
echo "PKG_CONFIG=${pkg_config}" >> $config_host_mak
|
||||
echo "CC=$cc" >> $config_host_mak
|
||||
echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
|
||||
echo "QEMU_OBJCFLAGS=$QEMU_OBJCFLAGS" >> $config_host_mak
|
||||
echo "EXESUF=$EXESUF" >> $config_host_mak
|
||||
|
||||
# use included Linux headers
|
||||
|
@ -27,8 +27,7 @@ SONAMES := $(addsuffix .so,$(addprefix lib,$(NAMES)))
|
||||
# The main QEMU uses Glib extensively so it's perfectly fine to use it
|
||||
# in plugins (which many example do).
|
||||
CFLAGS := $(shell $(PKG_CONFIG) --cflags glib-2.0)
|
||||
CFLAGS += -fPIC -Wall $(filter -W%, $(QEMU_CFLAGS))
|
||||
CFLAGS += $(if $(findstring no-psabi,$(QEMU_CFLAGS)),-Wpsabi)
|
||||
CFLAGS += -fPIC -Wall
|
||||
CFLAGS += $(if $(CONFIG_DEBUG_TCG), -ggdb -O0)
|
||||
CFLAGS += -I$(SRC_PATH)/include/qemu
|
||||
|
||||
|
68
meson.build
68
meson.build
@ -190,16 +190,8 @@ endif
|
||||
# Compiler flags #
|
||||
##################
|
||||
|
||||
qemu_common_flags = []
|
||||
qemu_common_flags = config_host['QEMU_CFLAGS'].split()
|
||||
qemu_cflags = []
|
||||
foreach arg : config_host['QEMU_CFLAGS'].split()
|
||||
if arg.startswith('-W')
|
||||
qemu_cflags += arg
|
||||
else
|
||||
qemu_common_flags += arg
|
||||
endif
|
||||
endforeach
|
||||
qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
|
||||
qemu_ldflags = []
|
||||
|
||||
if get_option('gprof')
|
||||
@ -369,20 +361,47 @@ endif
|
||||
add_global_arguments(qemu_common_flags, native: false, language: all_languages)
|
||||
add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
|
||||
|
||||
# Collect warnings that we want to enable
|
||||
|
||||
warn_flags = [
|
||||
'-Wundef',
|
||||
'-Wwrite-strings',
|
||||
'-Wmissing-prototypes',
|
||||
'-Wstrict-prototypes',
|
||||
'-Wredundant-decls',
|
||||
'-Wold-style-declaration',
|
||||
'-Wold-style-definition',
|
||||
'-Wtype-limits',
|
||||
'-Wformat-security',
|
||||
'-Wformat-y2k',
|
||||
'-Winit-self',
|
||||
'-Wignored-qualifiers',
|
||||
'-Wempty-body',
|
||||
'-Wnested-externs',
|
||||
'-Wendif-labels',
|
||||
'-Wexpansion-to-defined',
|
||||
'-Wimplicit-fallthrough=2',
|
||||
'-Wmissing-format-attribute',
|
||||
'-Wno-initializer-overrides',
|
||||
'-Wno-missing-include-dirs',
|
||||
'-Wno-shift-negative-value',
|
||||
'-Wno-string-plus-int',
|
||||
'-Wno-typedef-redefinition',
|
||||
'-Wno-tautological-type-limit-compare',
|
||||
'-Wno-psabi',
|
||||
'-Wno-gnu-variable-sized-type-not-at-end',
|
||||
]
|
||||
|
||||
if targetos != 'darwin'
|
||||
warn_flags += ['-Wthread-safety']
|
||||
endif
|
||||
|
||||
# Check that the C++ compiler exists and works with the C compiler.
|
||||
link_language = 'c'
|
||||
linker = cc
|
||||
qemu_cxxflags = []
|
||||
if 'cpp' in all_languages
|
||||
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
|
||||
|
||||
qemu_cxxflags = ['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'] + qemu_cflags
|
||||
if cxx.links(files('scripts/main.c'), args: qemu_cflags)
|
||||
link_language = 'cpp'
|
||||
linker = cxx
|
||||
@ -403,8 +422,15 @@ if get_option('optimization') != '0' and targetos == 'linux'
|
||||
endif
|
||||
|
||||
add_project_arguments(qemu_cflags, native: false, language: 'c')
|
||||
add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
|
||||
add_project_arguments(qemu_objcflags, native: false, language: 'objc')
|
||||
add_project_arguments(cc.get_supported_arguments(warn_flags), native: false, language: 'c')
|
||||
if 'cpp' in all_languages
|
||||
add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
|
||||
add_project_arguments(cxx.get_supported_arguments(warn_flags), native: false, language: 'cpp')
|
||||
endif
|
||||
if 'objc' in all_languages
|
||||
# Note sanitizer flags are not applied to Objective-C sources!
|
||||
add_project_arguments(objc.get_supported_arguments(warn_flags), native: false, language: 'objc')
|
||||
endif
|
||||
if targetos == 'linux'
|
||||
add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
|
||||
'-isystem', 'linux-headers',
|
||||
@ -4007,7 +4033,7 @@ if 'cpp' in all_languages
|
||||
summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_common_flags + qemu_cxxflags)}
|
||||
endif
|
||||
if 'objc' in all_languages
|
||||
summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_common_flags + qemu_objcflags)}
|
||||
summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_common_flags)}
|
||||
endif
|
||||
summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
|
||||
summary_info += {'profiler': get_option('profiler')}
|
||||
|
Loading…
Reference in New Issue
Block a user