This patch changes the way modinfo is generated and built. Today we have only modinfo.c being genereated and linked to all targets, now it generates (and link) one modinfo per target.
It also makes use of the module_need to add modules that makes sense for the selected target. Signed-off-by: Jose R. Ziviani <jzivi...@suse.de> --- meson.build | 25 +++++++++++++++-------- scripts/modinfo-generate.py | 40 +++++++++++++++++++++---------------- 2 files changed, 40 insertions(+), 25 deletions(-) diff --git a/meson.build b/meson.build index 2711cbb789..9d25ebb2f9 100644 --- a/meson.build +++ b/meson.build @@ -2395,14 +2395,23 @@ foreach d, list : target_modules endforeach if enable_modules - modinfo_src = custom_target('modinfo.c', - output: 'modinfo.c', - input: modinfo_files, - command: [modinfo_generate, '@INPUT@'], - capture: true) - modinfo_lib = static_library('modinfo', modinfo_src) - modinfo_dep = declare_dependency(link_whole: modinfo_lib) - softmmu_ss.add(modinfo_dep) + foreach target : target_dirs + 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, + command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'], + capture: true) + + modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src) + 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 nm = find_program('nm') diff --git a/scripts/modinfo-generate.py b/scripts/modinfo-generate.py index 9d3e037b15..25fb241b2d 100755 --- a/scripts/modinfo-generate.py +++ b/scripts/modinfo-generate.py @@ -32,7 +32,7 @@ def parse_line(line): continue return (kind, data) -def generate(name, lines): +def generate(name, lines, core_modules): arch = "" objs = [] deps = [] @@ -49,7 +49,11 @@ def generate(name, lines): elif kind == 'arch': arch = data; elif kind == 'need': - pass # ignore + # don't add a module which dependency is not enabled + # in kconfig + if data.strip() not in core_modules: + print(" /* module {} is missing. */\n".format(data)) + return [] else: print("unknown:", kind) exit(1) @@ -60,7 +64,7 @@ def generate(name, lines): print_array("objs", objs) print_array("deps", deps) print_array("opts", opts) - print("},{"); + print("},{") return deps def print_pre(): @@ -74,26 +78,28 @@ def print_post(): print("}};") def main(args): + 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_core_modules = set() + with open(args[1]) as file: + for line in file.readlines(): + config = line.split('=') + if config[1].rstrip() == 'y': + enabled_core_modules.add(config[0][7:]) # remove CONFIG_ + deps = {} print_pre() - for modinfo in args: + for modinfo in args[2:]: with open(modinfo) as f: lines = f.readlines() print(" /* %s */" % modinfo) - (basename, ext) = os.path.splitext(modinfo) - deps[basename] = generate(basename, lines) + (basename, _) = os.path.splitext(modinfo) + deps[basename] = generate(basename, lines, enabled_core_modules) print_post() - flattened_deps = {flat.strip('" ') for dep in deps.values() for flat in dep} - error = False - for dep in flattened_deps: - if dep not in deps.keys(): - print("Dependency {} cannot be satisfied".format(dep), - file=sys.stderr) - error = True - - if error: - exit(1) - if __name__ == "__main__": main(sys.argv[1:]) -- 2.33.0