summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--meson.build37
-rw-r--r--meson_options.txt3
-rwxr-xr-xtools/dbus_exporter.py61
3 files changed, 90 insertions, 11 deletions
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()