Skip to content

Commit

Permalink
meson: cleanup compiler detection
Browse files Browse the repository at this point in the history
Detect all compilers at the beginning of meson.build, and store
the available languages in an array.

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
bonzini committed Dec 19, 2022
1 parent 334e25b commit 9d41139
Showing 1 changed file with 35 additions and 27 deletions.
62 changes: 35 additions & 27 deletions meson.build
Expand Up @@ -14,15 +14,27 @@ keyval = import('keyval')
ss = import('sourceset')
fs = import('fs')

targetos = host_machine.system()
sh = find_program('sh')
cc = meson.get_compiler('c')
config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
enable_modules = 'CONFIG_MODULES' in config_host
enable_static = 'CONFIG_STATIC' in config_host

# Allow both shared and static libraries unless --enable-static
static_kwargs = enable_static ? {'static': true} : {}

cc = meson.get_compiler('c')
all_languages = ['c']
if add_languages('cpp', required: false, native: false)
all_languages += ['cpp']
cxx = meson.get_compiler('cpp')
endif
if targetos == 'darwin' and \
add_languages('objc', required: get_option('cocoa'), native: false)
all_languages += ['objc']
objc = meson.get_compiler('objc')
endif

# Temporary directory used for files created while
# configure runs. Since it is in the build directory
# we can safely blow away any previous version of it
Expand Down Expand Up @@ -58,8 +70,6 @@ if cpu in ['riscv32', 'riscv64']
cpu = 'riscv'
endif

targetos = host_machine.system()

target_dirs = config_host['TARGET_DIRS'].split()
have_linux_user = false
have_bsd_user = false
Expand Down Expand Up @@ -165,7 +175,7 @@ if 'dtrace' in get_option('trace_backends')
# semaphores are linked into the main binary and not the module's shared
# object.
add_global_arguments('-DSTAP_SDT_V2',
native: false, language: ['c', 'cpp', 'objc'])
native: false, language: all_languages)
endif
endif

Expand Down Expand Up @@ -207,7 +217,7 @@ endif
if get_option('fuzzing')
add_project_link_arguments(['-Wl,-T,',
(meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
native: false, language: ['c', 'cpp', 'objc'])
native: false, language: all_languages)

# Specify a filter to only instrument code that is directly related to
# virtual-devices.
Expand All @@ -220,7 +230,7 @@ if get_option('fuzzing')
args: ['-fsanitize-coverage-allowlist=/dev/null',
'-fsanitize-coverage=trace-pc'] )
add_global_arguments('-fsanitize-coverage-allowlist=instrumentation-filter',
native: false, language: ['c', 'cpp', 'objc'])
native: false, language: all_languages)
endif

if get_option('fuzzing_engine') == ''
Expand All @@ -229,9 +239,9 @@ if get_option('fuzzing')
# everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
# unable to bind the fuzzer-related callbacks added by instrumentation.
add_global_arguments('-fsanitize=fuzzer-no-link',
native: false, language: ['c', 'cpp', 'objc'])
native: false, language: all_languages)
add_global_link_arguments('-fsanitize=fuzzer-no-link',
native: false, language: ['c', 'cpp', 'objc'])
native: false, language: all_languages)
# For the actual fuzzer binaries, we need to link against the libfuzzer
# library. They need to be configurable, to support OSS-Fuzz
fuzz_exe_ldflags = ['-fsanitize=fuzzer']
Expand All @@ -242,15 +252,11 @@ if get_option('fuzzing')
endif
endif

add_global_arguments(qemu_cflags, native: false, language: ['c'])
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')
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
Expand All @@ -259,7 +265,6 @@ if add_languages('cpp', required: false, native: false)
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'
Expand All @@ -275,22 +280,21 @@ if targetos != 'sunos' and not config_host.has_key('CONFIG_TSAN')
qemu_ldflags += linker.get_supported_link_arguments('-Wl,--warn-common')
endif

add_global_link_arguments(qemu_ldflags, native: false, language: ['c', 'cpp', 'objc'])
add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)

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')
if targetos == 'linux'
add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
'-isystem', 'linux-headers',
language: ['c', 'cpp'])
language: all_languages)
endif

add_project_arguments('-iquote', '.',
'-iquote', meson.current_source_dir(),
'-iquote', meson.current_source_dir() / 'include',
language: ['c', 'cpp', 'objc'])

if host_machine.system() == 'darwin'
add_languages('objc', required: false, native: false)
endif
language: all_languages)

sparse = find_program('cgcc', required: get_option('sparse'))
if sparse.found()
Expand Down Expand Up @@ -472,7 +476,7 @@ if get_option('tcg').allowed()
tcg_arch = 'ppc'
endif
add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
language: ['c', 'cpp', 'objc'])
language: all_languages)

accelerators += 'CONFIG_TCG'
config_host += { 'CONFIG_TCG': 'y' }
Expand All @@ -498,7 +502,7 @@ endif
# The path to glib.h is added to all compilation commands. This was
# grandfathered in from the QEMU Makefiles.
add_project_arguments(config_host['GLIB_CFLAGS'].split(),
native: false, language: ['c', 'cpp', 'objc'])
native: false, language: all_languages)
glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
link_args: config_host['GLIB_LIBS'].split(),
version: config_host['GLIB_VERSION'],
Expand Down Expand Up @@ -1723,8 +1727,8 @@ if get_option('cfi')
error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
endif
endif
add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
add_global_arguments(cfi_flags, native: false, language: all_languages)
add_global_link_arguments(cfi_flags, native: false, language: all_languages)
endif

have_host_block_device = (targetos != 'darwin' or
Expand Down Expand Up @@ -3768,8 +3772,12 @@ if link_args.length() > 0
summary_info += {'LDFLAGS': ' '.join(link_args)}
endif
summary_info += {'QEMU_CFLAGS': ' '.join(qemu_cflags)}
summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_cxxflags)}
summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_objcflags)}
if 'cpp' in all_languages
summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_cxxflags)}
endif
if 'objc' in all_languages
summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_objcflags)}
endif
summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
summary_info += {'profiler': get_option('profiler')}
summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Expand Down

0 comments on commit 9d41139

Please sign in to comment.