|
@@ -9,6 +9,7 @@ ss = import('sourceset')
|
|
sh = find_program('sh')
|
|
sh = find_program('sh')
|
|
cc = meson.get_compiler('c')
|
|
cc = meson.get_compiler('c')
|
|
config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
|
|
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(),
|
|
add_project_arguments(config_host['QEMU_CFLAGS'].split(),
|
|
native: false, language: ['c', 'objc'])
|
|
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())
|
|
libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
|
|
endif
|
|
endif
|
|
|
|
|
|
|
|
+create_config = find_program('scripts/create_config')
|
|
|
|
+minikconf = find_program('scripts/minikconf.py')
|
|
target_dirs = config_host['TARGET_DIRS'].split()
|
|
target_dirs = config_host['TARGET_DIRS'].split()
|
|
have_user = false
|
|
have_user = false
|
|
have_system = 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
|
|
foreach target : target_dirs
|
|
have_user = have_user or target.endswith('-user')
|
|
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
|
|
endforeach
|
|
have_tools = 'CONFIG_TOOLS' in config_host
|
|
have_tools = 'CONFIG_TOOLS' in config_host
|
|
have_block = have_system or have_tools
|
|
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
|
|
# Generators
|
|
|
|
|
|
genh = []
|
|
genh = []
|
|
@@ -202,6 +283,13 @@ qemu_version = custom_target('qemu-version.h',
|
|
build_always_stale: true)
|
|
build_always_stale: true)
|
|
genh += qemu_version
|
|
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 = []
|
|
hxdep = []
|
|
hx_headers = [
|
|
hx_headers = [
|
|
['qemu-options.hx', 'qemu-options.def'],
|
|
['qemu-options.hx', 'qemu-options.def'],
|
|
@@ -228,6 +316,16 @@ genh += hxdep
|
|
util_ss = ss.source_set()
|
|
util_ss = ss.source_set()
|
|
stub_ss = ss.source_set()
|
|
stub_ss = ss.source_set()
|
|
trace_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 #
|
|
# Trace files #
|
|
@@ -336,10 +434,10 @@ subdir('ui')
|
|
|
|
|
|
# Build targets from sourcesets
|
|
# 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.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',
|
|
libqemuutil = static_library('qemuutil',
|
|
sources: util_ss.sources() + stub_ss.sources() + genh,
|
|
sources: util_ss.sources() + stub_ss.sources() + genh,
|
|
dependencies: [util_ss.dependencies(), m, glib, socket])
|
|
dependencies: [util_ss.dependencies(), m, glib, socket])
|
|
@@ -350,6 +448,68 @@ subdir('io')
|
|
subdir('fsdev')
|
|
subdir('fsdev')
|
|
subdir('target')
|
|
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
|
|
# Other build targets
|
|
if 'CONFIG_GUEST_AGENT' in config_host
|
|
if 'CONFIG_GUEST_AGENT' in config_host
|
|
subdir('qga')
|
|
subdir('qga')
|