]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Export D-Bus interfaces to /usr/share/dbus-1/interfaces
authorigo95862 <igo95862@yandex.ru>
Sat, 24 Jul 2021 07:30:42 +0000 (10:30 +0300)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 10 Dec 2021 07:51:58 +0000 (08:51 +0100)
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
meson_options.txt
tools/dbus_exporter.py [new file with mode: 0755]

index d92136aa64b957b3ab8fef8baa8b1528070feb4a..daa19f0ed796fb53a3293478165fab1647c8396d 100644 (file)
@@ -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),
index ed51fae43ad2dd1d28dbeb48cc7c0bc452734a22..914434e37c43902990f56cf5bdbb01fc201330d6 100644 (file)
@@ -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 (executable)
index 0000000..4da8b82
--- /dev/null
@@ -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()