mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-27 04:13:53 -06:00
modules: generates per-target modinfo
This patch changes the way modinfo is generated and built. Instead of one modinfo.c it generates one modinfo-<target>-softmmu.c per target. It aims a fine-tune control of modules by configuring Kconfig. Signed-off-by: Jose R. Ziviani <jziviani@suse.de> Signed-off-by: Dario Faggioli <dfaggioli@suse.com> Message-Id: <165369003038.5857.13084289285185196779.stgit@work> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
24ce7aa77d
commit
05d6814c3e
2 changed files with 52 additions and 22 deletions
21
meson.build
21
meson.build
|
@ -3175,14 +3175,23 @@ foreach d, list : target_modules
|
||||||
endforeach
|
endforeach
|
||||||
|
|
||||||
if enable_modules
|
if enable_modules
|
||||||
modinfo_src = custom_target('modinfo.c',
|
foreach target : target_dirs
|
||||||
output: 'modinfo.c',
|
if target.endswith('-softmmu')
|
||||||
|
config_target = config_target_mak[target]
|
||||||
|
config_devices_mak = target + '-config-devices.mak'
|
||||||
|
modinfo_src = custom_target('modinfo-' + target + '.c',
|
||||||
|
output: 'modinfo-' + target + '.c',
|
||||||
input: modinfo_files,
|
input: modinfo_files,
|
||||||
command: [modinfo_generate, '@INPUT@'],
|
command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
|
||||||
capture: true)
|
capture: true)
|
||||||
modinfo_lib = static_library('modinfo', modinfo_src)
|
|
||||||
modinfo_dep = declare_dependency(link_whole: modinfo_lib)
|
modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
|
||||||
softmmu_ss.add(modinfo_dep)
|
modinfo_dep = declare_dependency(link_with: modinfo_lib)
|
||||||
|
|
||||||
|
arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
|
||||||
|
hw_arch[arch].add(modinfo_dep)
|
||||||
|
endif
|
||||||
|
endforeach
|
||||||
endif
|
endif
|
||||||
|
|
||||||
nm = find_program('nm')
|
nm = find_program('nm')
|
||||||
|
|
|
@ -32,7 +32,7 @@ def parse_line(line):
|
||||||
continue
|
continue
|
||||||
return (kind, data)
|
return (kind, data)
|
||||||
|
|
||||||
def generate(name, lines):
|
def generate(name, lines, enabled):
|
||||||
arch = ""
|
arch = ""
|
||||||
objs = []
|
objs = []
|
||||||
deps = []
|
deps = []
|
||||||
|
@ -49,7 +49,13 @@ def generate(name, lines):
|
||||||
elif kind == 'arch':
|
elif kind == 'arch':
|
||||||
arch = data;
|
arch = data;
|
||||||
elif kind == 'kconfig':
|
elif kind == 'kconfig':
|
||||||
pass # ignore
|
# don't add a module which dependency is not enabled
|
||||||
|
# in kconfig
|
||||||
|
if data.strip() not in enabled:
|
||||||
|
print(" /* module {} isn't enabled in Kconfig. */"
|
||||||
|
.format(data.strip()))
|
||||||
|
print("/* },{ */")
|
||||||
|
return None
|
||||||
else:
|
else:
|
||||||
print("unknown:", kind)
|
print("unknown:", kind)
|
||||||
exit(1)
|
exit(1)
|
||||||
|
@ -60,8 +66,8 @@ def generate(name, lines):
|
||||||
print_array("objs", objs)
|
print_array("objs", objs)
|
||||||
print_array("deps", deps)
|
print_array("deps", deps)
|
||||||
print_array("opts", opts)
|
print_array("opts", opts)
|
||||||
print("},{");
|
print("},{")
|
||||||
return deps
|
return {dep.strip('" ') for dep in deps}
|
||||||
|
|
||||||
def print_pre():
|
def print_pre():
|
||||||
print("/* generated by scripts/modinfo-generate.py */")
|
print("/* generated by scripts/modinfo-generate.py */")
|
||||||
|
@ -74,20 +80,35 @@ def print_post():
|
||||||
print("}};")
|
print("}};")
|
||||||
|
|
||||||
def main(args):
|
def main(args):
|
||||||
deps = {}
|
if len(args) < 3 or args[0] != '--devices':
|
||||||
|
print('Expected: modinfo-generate.py --devices '
|
||||||
|
'config-device.mak [modinfo files]', file=sys.stderr)
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
# get all devices enabled in kconfig, from *-config-device.mak
|
||||||
|
enabled = set()
|
||||||
|
with open(args[1]) as file:
|
||||||
|
for line in file.readlines():
|
||||||
|
config = line.split('=')
|
||||||
|
if config[1].rstrip() == 'y':
|
||||||
|
enabled.add(config[0][7:]) # remove CONFIG_
|
||||||
|
|
||||||
|
deps = set()
|
||||||
|
modules = set()
|
||||||
print_pre()
|
print_pre()
|
||||||
for modinfo in args:
|
for modinfo in args[2:]:
|
||||||
with open(modinfo) as f:
|
with open(modinfo) as f:
|
||||||
lines = f.readlines()
|
lines = f.readlines()
|
||||||
print(" /* %s */" % modinfo)
|
print(" /* %s */" % modinfo)
|
||||||
(basename, ext) = os.path.splitext(modinfo)
|
(basename, _) = os.path.splitext(modinfo)
|
||||||
deps[basename] = generate(basename, lines)
|
moddeps = generate(basename, lines, enabled)
|
||||||
|
if moddeps is not None:
|
||||||
|
modules.add(basename)
|
||||||
|
deps.update(moddeps)
|
||||||
print_post()
|
print_post()
|
||||||
|
|
||||||
flattened_deps = {flat.strip('" ') for dep in deps.values() for flat in dep}
|
|
||||||
error = False
|
error = False
|
||||||
for dep in flattened_deps:
|
for dep in deps.difference(modules):
|
||||||
if dep not in deps.keys():
|
|
||||||
print("Dependency {} cannot be satisfied".format(dep),
|
print("Dependency {} cannot be satisfied".format(dep),
|
||||||
file=sys.stderr)
|
file=sys.stderr)
|
||||||
error = True
|
error = True
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue