From e3c689245562ec5eaf06730ef33d697efccf0d62 Mon Sep 17 00:00:00 2001 From: igo95862 Date: Sat, 24 Jul 2021 10:30:42 +0300 Subject: [PATCH] Export D-Bus interfaces to /usr/share/dbus-1/interfaces Pass -Ddbus-interfaces-dir=no to meson to disable export Interfaces from: org.freedesktop.home1 org.freedesktop.hostname1 org.freedesktop.import1 org.freedesktop.locale1 org.freedesktop.LogControl1 org.freedesktop.login1 org.freedesktop.machine1 org.freedesktop.oom1 org.freedesktop.portable1 org.freedesktop.resolve1 org.freedesktop.systemd1 org.freedesktop.timedate1 --- meson.build | 37 +++++++++++++++++-------- meson_options.txt | 3 +++ tools/dbus_exporter.py | 61 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 11 deletions(-) create mode 100755 tools/dbus_exporter.py diff --git a/meson.build b/meson.build index d92136aa64..daa19f0ed7 100644 --- a/meson.build +++ b/meson.build @@ -1693,6 +1693,7 @@ update_hwdb_sh = find_program('tools/update-hwdb.sh') update_hwdb_autosuspend_sh = find_program('tools/update-hwdb-autosuspend.sh') update_syscall_tables_sh = find_program('tools/update-syscall-tables.sh') xml_helper_py = find_program('tools/xml_helper.py') +export_dbus_interfaces_py = find_program('tools/dbus_exporter.py') ##################################################################### @@ -1708,6 +1709,13 @@ add_project_arguments('-include', 'config.h', language : 'c') # usually, but not always, installed in /bin. public_programs = [] +# D-Bus introspection XML export +dbus_programs = [] +dbus_interfaces_dir = get_option('dbus-interfaces-dir') +if dbus_interfaces_dir == '' + dbus_interfaces_dir = get_option('datadir') + '/dbus-1' +endif + tests = [] fuzzers = [] @@ -1975,7 +1983,7 @@ endforeach ############################################################ -executable( +dbus_programs += executable( 'systemd', systemd_sources, include_directories : includes, @@ -2144,7 +2152,7 @@ if conf.get('HAVE_BLKID') == 1 endif if conf.get('ENABLE_RESOLVE') == 1 - executable( + dbus_programs += executable( 'systemd-resolved', systemd_resolved_sources, include_directories : resolve_includes, @@ -2181,7 +2189,7 @@ if conf.get('ENABLE_RESOLVE') == 1 endif if conf.get('ENABLE_LOGIND') == 1 - executable( + dbus_programs += executable( 'systemd-logind', systemd_logind_sources, include_directories : includes, @@ -2327,7 +2335,7 @@ public_programs += executable( install_dir : rootbindir) if conf.get('ENABLE_PORTABLED') == 1 - executable( + dbus_programs += executable( 'systemd-portabled', systemd_portabled_sources, include_directories : includes, @@ -2407,7 +2415,7 @@ if conf.get('ENABLE_HOMED') == 1 install : true, install_dir : rootlibexecdir) - executable( + dbus_programs += executable( 'systemd-homed', systemd_homed_sources, include_directories : home_includes, @@ -2610,7 +2618,7 @@ if conf.get('ENABLE_XDG_AUTOSTART') == 1 endif if conf.get('ENABLE_HOSTNAMED') == 1 - executable( + dbus_programs += executable( 'systemd-hostnamed', 'src/hostname/hostnamed.c', include_directories : includes, @@ -2637,7 +2645,7 @@ if conf.get('ENABLE_LOCALED') == 1 deps = [] endif - executable( + dbus_programs += executable( 'systemd-localed', systemd_localed_sources, include_directories : includes, @@ -2657,7 +2665,7 @@ if conf.get('ENABLE_LOCALED') == 1 endif if conf.get('ENABLE_TIMEDATED') == 1 - executable( + dbus_programs += executable( 'systemd-timedated', 'src/timedate/timedated.c', include_directories : includes, @@ -2701,7 +2709,7 @@ if conf.get('ENABLE_TIMESYNCD') == 1 endif if conf.get('ENABLE_MACHINED') == 1 - executable( + dbus_programs += executable( 'systemd-machined', systemd_machined_sources, include_directories : includes, @@ -2726,7 +2734,7 @@ if conf.get('ENABLE_MACHINED') == 1 endif if conf.get('ENABLE_IMPORTD') == 1 - executable( + dbus_programs += executable( 'systemd-importd', systemd_importd_sources, include_directories : includes, @@ -2885,7 +2893,7 @@ if conf.get('ENABLE_PSTORE') == 1 endif if conf.get('ENABLE_OOMD') == 1 - executable('systemd-oomd', + dbus_programs += executable('systemd-oomd', systemd_oomd_sources, include_directories : includes, link_with : [libshared], @@ -3829,6 +3837,13 @@ run_target( alias_target('update-dbus-docs', update_dbus_docs) alias_target('update-man-rules', update_man_rules) +custom_target( + 'export-dbus-interfaces', + output : 'interfaces', + install : dbus_interfaces_dir != 'no', + install_dir : dbus_interfaces_dir, + command : [export_dbus_interfaces_py, '@OUTPUT@', dbus_programs]) + ############################################################ alt_time_epoch = run_command('date', '-Is', '-u', '-d', '@@0@'.format(time_epoch), diff --git a/meson_options.txt b/meson_options.txt index ed51fae43a..914434e37c 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -479,3 +479,6 @@ option('analyze', type: 'boolean', value: 'true', option('bpf-framework', type : 'combo', choices : ['auto', 'true', 'false'], description: 'build BPF programs from source code in restricted C') + +option('dbus-interfaces-dir', type : 'string', + description : 'export D-Bus introspection XML as standalone files') diff --git a/tools/dbus_exporter.py b/tools/dbus_exporter.py new file mode 100755 index 0000000000..4da8b82af4 --- /dev/null +++ b/tools/dbus_exporter.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: LGPL-2.1-or-later +from argparse import ArgumentParser +from pathlib import Path +from subprocess import run, PIPE + + +def extract_interfaces_xml(output_dir, executable): + list_interfaces_process = run( + args=[executable.absolute(), '--bus-introspect', 'list'], + stdout=PIPE, + check=True, + universal_newlines=True, + ) + + interfaces_lines = list_interfaces_process.stdout.splitlines() + + interface_names = [x.split()[1] for x in interfaces_lines] + + for interface_name in interface_names: + interface_introspection_run = run( + args=[executable.absolute(), '--bus-introspect', interface_name], + stdout=PIPE, + check=True, + universal_newlines=True, + ) + + interface_file_name = output_dir / (interface_name + '.xml') + with open(interface_file_name, mode='w') as f: + f.write(interface_introspection_run.stdout) + interface_file_name.chmod(0o644) + + +def iterate_executables(output_dir, executables): + output_dir.mkdir(mode=0o755, exist_ok=True) + + for exe in executables: + extract_interfaces_xml(output_dir, exe) + + +def main(): + parser = ArgumentParser() + + parser.add_argument( + 'output', + type=Path, + ) + + parser.add_argument( + 'executables', + type=Path, + nargs='+', + ) + + args = parser.parse_args() + + iterate_executables(args.output, args.executables) + + +if __name__ == '__main__': + main()