meson: replace create-config with meson configure_file

Move the create-config logic to meson.build; create a
configuration_data object and let meson handle the
quoting and output.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2020-08-04 18:14:26 +02:00
parent 484e2cc730
commit 859aef026e
7 changed files with 81 additions and 168 deletions

View file

@ -12,6 +12,8 @@ config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
enable_modules = 'CONFIG_MODULES' in config_host
build_docs = 'BUILD_DOCS' in config_host
config_host_data = configuration_data()
genh = []
add_project_arguments(config_host['QEMU_CFLAGS'].split(),
native: false, language: ['c', 'objc'])
@ -359,13 +361,43 @@ if 'CONFIG_LIBPMEM' in config_host
link_args: config_host['LIBPMEM_LIBS'].split())
endif
create_config = find_program('scripts/create_config')
# Create config-host.h
config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'qemu_confdir', 'qemu_datadir',
'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath']
foreach k, v: config_host
if arrays.contains(k)
if v != ''
v = '"' + '", "'.join(v.split()) + '", '
endif
config_host_data.set(k, v)
elif k == 'ARCH'
config_host_data.set('HOST_' + v.to_upper(), 1)
elif strings.contains(k)
if not k.startswith('CONFIG_')
k = 'CONFIG_' + k.to_upper()
endif
config_host_data.set_quoted(k, v)
elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
config_host_data.set(k, v == 'y' ? 1 : v)
endif
endforeach
genh += configure_file(output: 'config-host.h', configuration: config_host_data)
minikconf = find_program('scripts/minikconf.py')
target_dirs = config_host['TARGET_DIRS'].split()
have_user = false
have_system = false
config_devices_mak_list = []
config_devices_h = {}
config_target_h = {}
config_target_mak = {}
kconfig_external_symbols = [
'CONFIG_KVM',
@ -381,16 +413,36 @@ kconfig_external_symbols = [
'CONFIG_LINUX',
'CONFIG_PVRDMA',
]
ignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS']
foreach target : target_dirs
have_user = have_user or target.endswith('-user')
config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak')
config_target_data = configuration_data()
foreach k, v: config_target
if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
# do nothing
elif ignored.contains(k)
# do nothing
elif k == 'TARGET_BASE_ARCH'
config_target_data.set('TARGET_' + v.to_upper(), 1)
elif k == 'TARGET_NAME'
config_target_data.set_quoted(k, v)
elif v == 'y'
config_target_data.set(k, 1)
else
config_target_data.set(k, v)
endif
endforeach
config_target_h += {target: configure_file(output: target + '-config-target.h',
configuration: config_target_data)}
if target.endswith('-softmmu')
have_system = true
base_kconfig = []
foreach sym : kconfig_external_symbols
if sym in config_target
if sym in config_target or sym in config_host
base_kconfig += '@0@=y'.format(sym)
endif
endforeach
@ -404,14 +456,16 @@ foreach target : target_dirs
command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
config_devices_mak, '@DEPFILE@', '@INPUT@',
base_kconfig])
config_devices_h += {target: custom_target(
target + '-config-devices.h',
input: config_devices_mak,
output: target + '-config-devices.h',
capture: true,
command: [create_config, '@INPUT@'])}
config_devices_data = configuration_data()
config_devices = keyval.load(config_devices_mak)
foreach k, v: config_devices
config_devices_data.set(k, 1)
endforeach
config_devices_mak_list += config_devices_mak
config_target += keyval.load(config_devices_mak)
config_devices_h += {target: configure_file(output: target + '-config-devices.h',
configuration: config_devices_data)}
config_target += config_devices
endif
config_target_mak += {target: config_target}
endforeach
@ -451,7 +505,6 @@ config_all += {
# Generators
genh = []
hxtool = find_program('scripts/hxtool')
shaderinclude = find_program('scripts/shaderinclude.pl')
qapi_gen = find_program('scripts/qapi-gen.py')
@ -481,7 +534,7 @@ tracetool = [
qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
meson.current_source_dir(),
config_host['PKGVERSION'], config_host['VERSION']]
config_host['PKGVERSION'], meson.project_version()]
qemu_version = custom_target('qemu-version.h',
output: 'qemu-version.h',
command: qemu_version_cmd,
@ -490,13 +543,6 @@ qemu_version = custom_target('qemu-version.h',
build_always_stale: true)
genh += qemu_version
config_host_h = custom_target('config-host.h',
input: meson.current_build_dir() / 'config-host.mak',
output: 'config-host.h',
capture: true,
command: [create_config, '@INPUT@'])
genh += config_host_h
hxdep = []
hx_headers = [
['qemu-options.hx', 'qemu-options.def'],
@ -830,13 +876,14 @@ foreach target : target_dirs
config_target = config_target_mak[target]
target_name = config_target['TARGET_NAME']
arch = config_target['TARGET_BASE_ARCH']
arch_srcs = []
arch_srcs = [config_target_h[target]]
arch_deps = []
c_args = ['-DNEED_CPU_H',
'-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
'-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
link_args = []
config_target += config_host
target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
if targetos == 'linux'
target_inc += include_directories('linux-headers', is_system: true)
@ -897,19 +944,12 @@ foreach target : target_dirs
objects = common_all.extract_objects(target_common.sources())
deps = target_common.dependencies()
# TODO: Change to generator once obj-y goes away
config_target_h = custom_target(target + '-config-target.h',
input: meson.current_build_dir() / target / 'config-target.mak',
output: target + '-config-target.h',
capture: true,
command: [create_config, '@INPUT@'])
target_specific = specific_ss.apply(config_target, strict: false)
arch_srcs += target_specific.sources()
arch_deps += target_specific.dependencies()
lib = static_library('qemu-' + target,
sources: arch_srcs + [config_target_h] + genh,
sources: arch_srcs + genh,
objects: objects,
include_directories: target_inc,
c_args: c_args,