|
|
|
@ -9,6 +9,7 @@ ss = import('sourceset') |
|
|
|
sh = find_program('sh') |
|
|
|
cc = meson.get_compiler('c') |
|
|
|
config_host = keyval.load(meson.current_build_dir() / 'config-host.mak') |
|
|
|
config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak') |
|
|
|
|
|
|
|
add_project_arguments(config_host['QEMU_CFLAGS'].split(), |
|
|
|
native: false, language: ['c', 'objc']) |
|
|
|
@ -151,16 +152,96 @@ if 'CONFIG_LIBUDEV' in config_host |
|
|
|
libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split()) |
|
|
|
endif |
|
|
|
|
|
|
|
create_config = find_program('scripts/create_config') |
|
|
|
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_mak = {} |
|
|
|
kconfig_external_symbols = [ |
|
|
|
'CONFIG_KVM', |
|
|
|
'CONFIG_XEN', |
|
|
|
'CONFIG_TPM', |
|
|
|
'CONFIG_SPICE', |
|
|
|
'CONFIG_IVSHMEM', |
|
|
|
'CONFIG_OPENGL', |
|
|
|
'CONFIG_X11', |
|
|
|
'CONFIG_VHOST_USER', |
|
|
|
'CONFIG_VHOST_KERNEL', |
|
|
|
'CONFIG_VIRTFS', |
|
|
|
'CONFIG_LINUX', |
|
|
|
'CONFIG_PVRDMA', |
|
|
|
] |
|
|
|
foreach target : target_dirs |
|
|
|
have_user = have_user or target.endswith('-user') |
|
|
|
have_system = have_system or target.endswith('-softmmu') |
|
|
|
config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host |
|
|
|
|
|
|
|
if target.endswith('-softmmu') |
|
|
|
have_system = true |
|
|
|
|
|
|
|
base_kconfig = [] |
|
|
|
foreach sym : kconfig_external_symbols |
|
|
|
if sym in config_target |
|
|
|
base_kconfig += '@0@=y'.format(sym) |
|
|
|
endif |
|
|
|
endforeach |
|
|
|
|
|
|
|
config_devices_mak = target + '-config-devices.mak' |
|
|
|
config_devices_mak = configure_file( |
|
|
|
input: ['default-configs' / target + '.mak', 'Kconfig'], |
|
|
|
output: config_devices_mak, |
|
|
|
depfile: config_devices_mak + '.d', |
|
|
|
capture: true, |
|
|
|
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_mak_list += config_devices_mak |
|
|
|
config_target += keyval.load(config_devices_mak) |
|
|
|
endif |
|
|
|
config_target_mak += {target: config_target} |
|
|
|
endforeach |
|
|
|
have_tools = 'CONFIG_TOOLS' in config_host |
|
|
|
have_block = have_system or have_tools |
|
|
|
|
|
|
|
grepy = find_program('scripts/grepy.sh') |
|
|
|
# This configuration is used to build files that are shared by |
|
|
|
# multiple binaries, and then extracted out of the "common" |
|
|
|
# static_library target. |
|
|
|
# |
|
|
|
# We do not use all_sources()/all_dependencies(), because it would |
|
|
|
# build literally all source files, including devices only used by |
|
|
|
# targets that are not built for this compilation. The CONFIG_ALL |
|
|
|
# pseudo symbol replaces it. |
|
|
|
|
|
|
|
if have_system |
|
|
|
config_all_devices_mak = configure_file( |
|
|
|
output: 'config-all-devices.mak', |
|
|
|
input: config_devices_mak_list, |
|
|
|
capture: true, |
|
|
|
command: [grepy, '@INPUT@'], |
|
|
|
) |
|
|
|
config_all_devices = keyval.load(config_all_devices_mak) |
|
|
|
else |
|
|
|
config_all_devices = {} |
|
|
|
endif |
|
|
|
config_all = config_all_devices |
|
|
|
config_all += config_host |
|
|
|
config_all += config_all_disas |
|
|
|
config_all += { |
|
|
|
'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'), |
|
|
|
'CONFIG_SOFTMMU': have_system, |
|
|
|
'CONFIG_USER_ONLY': have_user, |
|
|
|
'CONFIG_ALL': true, |
|
|
|
} |
|
|
|
|
|
|
|
# Generators |
|
|
|
|
|
|
|
genh = [] |
|
|
|
@ -202,6 +283,13 @@ 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'], |
|
|
|
@ -228,6 +316,16 @@ genh += hxdep |
|
|
|
util_ss = ss.source_set() |
|
|
|
stub_ss = ss.source_set() |
|
|
|
trace_ss = ss.source_set() |
|
|
|
common_ss = ss.source_set() |
|
|
|
softmmu_ss = ss.source_set() |
|
|
|
user_ss = ss.source_set() |
|
|
|
bsd_user_ss = ss.source_set() |
|
|
|
linux_user_ss = ss.source_set() |
|
|
|
specific_ss = ss.source_set() |
|
|
|
|
|
|
|
hw_arch = {} |
|
|
|
target_arch = {} |
|
|
|
target_softmmu_arch = {} |
|
|
|
|
|
|
|
############### |
|
|
|
# Trace files # |
|
|
|
@ -336,10 +434,10 @@ subdir('ui') |
|
|
|
|
|
|
|
# Build targets from sourcesets |
|
|
|
|
|
|
|
stub_ss = stub_ss.apply(config_host, strict: false) |
|
|
|
stub_ss = stub_ss.apply(config_all, strict: false) |
|
|
|
|
|
|
|
util_ss.add_all(trace_ss) |
|
|
|
util_ss = util_ss.apply(config_host, strict: false) |
|
|
|
util_ss = util_ss.apply(config_all, strict: false) |
|
|
|
libqemuutil = static_library('qemuutil', |
|
|
|
sources: util_ss.sources() + stub_ss.sources() + genh, |
|
|
|
dependencies: [util_ss.dependencies(), m, glib, socket]) |
|
|
|
@ -350,6 +448,68 @@ subdir('io') |
|
|
|
subdir('fsdev') |
|
|
|
subdir('target') |
|
|
|
|
|
|
|
common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss) |
|
|
|
common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss) |
|
|
|
|
|
|
|
common_all = common_ss.apply(config_all, strict: false) |
|
|
|
common_all = static_library('common', |
|
|
|
build_by_default: false, |
|
|
|
sources: common_all.sources() + genh, |
|
|
|
dependencies: common_all.dependencies(), |
|
|
|
name_suffix: 'fa') |
|
|
|
|
|
|
|
foreach target : target_dirs |
|
|
|
config_target = config_target_mak[target] |
|
|
|
target_name = config_target['TARGET_NAME'] |
|
|
|
arch = config_target['TARGET_BASE_ARCH'] |
|
|
|
arch_srcs = [] |
|
|
|
|
|
|
|
target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])] |
|
|
|
if targetos == 'linux' |
|
|
|
target_inc += include_directories('linux-headers', is_system: true) |
|
|
|
endif |
|
|
|
if target.endswith('-softmmu') |
|
|
|
qemu_target_name = 'qemu-system-' + target_name |
|
|
|
target_type='system' |
|
|
|
arch_srcs += config_devices_h[target] |
|
|
|
else |
|
|
|
target_type='user' |
|
|
|
qemu_target_name = 'qemu-' + target_name |
|
|
|
if 'CONFIG_LINUX_USER' in config_target |
|
|
|
base_dir = 'linux-user' |
|
|
|
target_inc += include_directories('linux-user/host/' / config_host['ARCH']) |
|
|
|
else |
|
|
|
base_dir = 'bsd-user' |
|
|
|
endif |
|
|
|
target_inc += include_directories( |
|
|
|
base_dir, |
|
|
|
base_dir / config_target['TARGET_ABI_DIR'], |
|
|
|
) |
|
|
|
endif |
|
|
|
|
|
|
|
target_common = common_ss.apply(config_target, strict: false) |
|
|
|
objects = common_all.extract_objects(target_common.sources()) |
|
|
|
|
|
|
|
# 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() |
|
|
|
|
|
|
|
static_library('qemu-' + target, |
|
|
|
sources: arch_srcs + [config_target_h] + genh, |
|
|
|
objects: objects, |
|
|
|
include_directories: target_inc, |
|
|
|
c_args: ['-DNEED_CPU_H', |
|
|
|
'-DCONFIG_TARGET="@0@-config-target.h"'.format(target), |
|
|
|
'-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)], |
|
|
|
name_suffix: 'fa') |
|
|
|
endforeach |
|
|
|
|
|
|
|
# Other build targets |
|
|
|
if 'CONFIG_GUEST_AGENT' in config_host |
|
|
|
subdir('qga') |
|
|
|
|