From 9a60da2834074d970ca063c210fe9d2f05c70532 Mon Sep 17 00:00:00 2001 From: Thierry Reding Date: Tue, 23 Nov 2010 21:12:11 +0100 Subject: [PATCH] build-sys: allow cross-compilation When cross-compiling systemd, the introspection XML files fail to be generated because the systemd host binary is not executable. This patch works around this by putting the introspection XML data into separate ELF sections and extracting them from the binary when generating the XML files. The extracted XML data is passed through the strings utility in order to strip the trailing NUL character. A small AWK script is used to prepend the doctype and add the opening and closing node tags respectively. Finally, the C preprocessor is used to substitute the correct doctype information from the D-Bus header files. --- Makefile.am | 6 +++++- configure.ac | 3 +++ introspect.awk | 13 +++++++++++++ src/dbus-automount.c | 2 +- src/dbus-device.c | 2 +- src/dbus-job.c | 2 +- src/dbus-manager.c | 2 +- src/dbus-mount.c | 2 +- src/dbus-path.c | 2 +- src/dbus-service.c | 2 +- src/dbus-snapshot.c | 2 +- src/dbus-socket.c | 2 +- src/dbus-swap.c | 2 +- src/dbus-target.c | 2 +- src/dbus-timer.c | 2 +- src/dbus-unit.c | 2 +- src/macro.h | 1 + 17 files changed, 35 insertions(+), 14 deletions(-) create mode 100644 introspect.awk diff --git a/Makefile.am b/Makefile.am index 4330db06dd..694ec57a9b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1118,8 +1118,12 @@ CLEANFILES += \ ${XML_IN_FILES:.xml.in=.html.in} endif +DBUS_PREPROCESS = $(CPP) -P $(DBUS_CFLAGS) -imacros dbus/dbus-protocol.h + org.freedesktop.systemd1.%.xml: systemd - $(AM_V_GEN)SYSTEMD_SKIP_API_MOUNTS=1 ./systemd --introspect=${@:.xml=} > $@ + $(AM_V_GEN)$(OBJCOPY) -O binary -j introspect.$* $< $@.tmp && \ + $(STRINGS) $@.tmp | $(AWK) -f introspect.awk | \ + $(DBUS_PREPROCESS) -o $@ - && rm $@.tmp CLEANFILES += \ $(dbusinterface_DATA) diff --git a/configure.ac b/configure.ac index 247806d747..f9f5eeea3b 100644 --- a/configure.ac +++ b/configure.ac @@ -48,6 +48,9 @@ AM_PROG_CC_C_O AC_PROG_GCC_TRADITIONAL AC_USE_SYSTEM_EXTENSIONS +AC_CHECK_TOOL(OBJCOPY, objcopy) +AC_CHECK_TOOL(STRINGS, strings) + CC_CHECK_CFLAGS_APPEND([ \ -pipe \ -Wall \ diff --git a/introspect.awk b/introspect.awk new file mode 100644 index 0000000000..593191384a --- /dev/null +++ b/introspect.awk @@ -0,0 +1,13 @@ +BEGIN { + print "" + print "" +} + +// { + print +} + +END { + print "" +} diff --git a/src/dbus-automount.c b/src/dbus-automount.c index 3bccb4e5f7..af277af39c 100644 --- a/src/dbus-automount.c +++ b/src/dbus-automount.c @@ -38,7 +38,7 @@ BUS_INTROSPECTABLE_INTERFACE \ "\n" -const char bus_automount_interface[] = BUS_AUTOMOUNT_INTERFACE; +const char bus_automount_interface[] _introspect_("Automount") = BUS_AUTOMOUNT_INTERFACE; DBusHandlerResult bus_automount_message_handler(Unit *u, DBusConnection *c, DBusMessage *message) { const BusProperty properties[] = { diff --git a/src/dbus-device.c b/src/dbus-device.c index fcb05a441e..aafe5d61fa 100644 --- a/src/dbus-device.c +++ b/src/dbus-device.c @@ -37,7 +37,7 @@ BUS_INTROSPECTABLE_INTERFACE \ "\n" -const char bus_device_interface[] = BUS_DEVICE_INTERFACE; +const char bus_device_interface[] _introspect_("Device") = BUS_DEVICE_INTERFACE; const char bus_device_invalidating_properties[] = "SysFSPath\0" diff --git a/src/dbus-job.c b/src/dbus-job.c index 667eb04a69..18da72d67a 100644 --- a/src/dbus-job.c +++ b/src/dbus-job.c @@ -43,7 +43,7 @@ BUS_INTROSPECTABLE_INTERFACE \ "\n" -const char bus_job_interface[] = BUS_JOB_INTERFACE; +const char bus_job_interface[] _introspect_("Job") = BUS_JOB_INTERFACE; #define INVALIDATING_PROPERTIES \ "State\0" \ diff --git a/src/dbus-manager.c b/src/dbus-manager.c index 28986e5426..d160e7bba3 100644 --- a/src/dbus-manager.c +++ b/src/dbus-manager.c @@ -202,7 +202,7 @@ #define INTROSPECTION_END \ "\n" -const char bus_manager_interface[] = BUS_MANAGER_INTERFACE; +const char bus_manager_interface[] _introspect_("Manager") = BUS_MANAGER_INTERFACE; static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_manager_append_running_as, manager_running_as, ManagerRunningAs); diff --git a/src/dbus-mount.c b/src/dbus-mount.c index 4de00f7fac..fa319febd5 100644 --- a/src/dbus-mount.c +++ b/src/dbus-mount.c @@ -50,7 +50,7 @@ BUS_INTROSPECTABLE_INTERFACE \ "\n" -const char bus_mount_interface[] = BUS_MOUNT_INTERFACE; +const char bus_mount_interface[] _introspect_("Mount") = BUS_MOUNT_INTERFACE; const char bus_mount_invalidating_properties[] = "What\0" diff --git a/src/dbus-path.c b/src/dbus-path.c index c8c302ab37..9692d6a247 100644 --- a/src/dbus-path.c +++ b/src/dbus-path.c @@ -41,7 +41,7 @@ BUS_INTROSPECTABLE_INTERFACE \ "\n" -const char bus_path_interface[] = BUS_PATH_INTERFACE; +const char bus_path_interface[] _introspect_("Path") = BUS_PATH_INTERFACE; static int bus_path_append_paths(Manager *m, DBusMessageIter *i, const char *property, void *data) { Path *p = data; diff --git a/src/dbus-service.c b/src/dbus-service.c index a79f769e94..f929627666 100644 --- a/src/dbus-service.c +++ b/src/dbus-service.c @@ -90,7 +90,7 @@ BUS_INTROSPECTABLE_INTERFACE \ "\n" -const char bus_service_interface[] = BUS_SERVICE_INTERFACE; +const char bus_service_interface[] _introspect_("Service") = BUS_SERVICE_INTERFACE; const char bus_service_invalidating_properties[] = "ExecStartPre\0" diff --git a/src/dbus-snapshot.c b/src/dbus-snapshot.c index efaec7df3d..a9903ec484 100644 --- a/src/dbus-snapshot.c +++ b/src/dbus-snapshot.c @@ -38,7 +38,7 @@ BUS_INTROSPECTABLE_INTERFACE \ "\n" -const char bus_snapshot_interface[] = BUS_SNAPSHOT_INTERFACE; +const char bus_snapshot_interface[] _introspect_("Snapshot") = BUS_SNAPSHOT_INTERFACE; DBusHandlerResult bus_snapshot_message_handler(Unit *u, DBusConnection *c, DBusMessage *message) { const BusProperty properties[] = { diff --git a/src/dbus-socket.c b/src/dbus-socket.c index 5931f006c2..a9cb1c38f8 100644 --- a/src/dbus-socket.c +++ b/src/dbus-socket.c @@ -64,7 +64,7 @@ BUS_INTROSPECTABLE_INTERFACE \ "\n" -const char bus_socket_interface[] = BUS_SOCKET_INTERFACE; +const char bus_socket_interface[] _introspect_("Socket") = BUS_SOCKET_INTERFACE; const char bus_socket_invalidating_properties[] = "ExecStartPre\0" diff --git a/src/dbus-swap.c b/src/dbus-swap.c index 70cccdcab8..06acb22dcc 100644 --- a/src/dbus-swap.c +++ b/src/dbus-swap.c @@ -47,7 +47,7 @@ BUS_INTROSPECTABLE_INTERFACE \ "\n" -const char bus_swap_interface[] = BUS_SWAP_INTERFACE; +const char bus_swap_interface[] _introspect_("Swap") = BUS_SWAP_INTERFACE; const char bus_swap_invalidating_properties[] = "What\0" diff --git a/src/dbus-target.c b/src/dbus-target.c index 69e8212076..1eb3c249f8 100644 --- a/src/dbus-target.c +++ b/src/dbus-target.c @@ -38,7 +38,7 @@ BUS_INTROSPECTABLE_INTERFACE \ "\n" -const char bus_target_interface[] = BUS_TARGET_INTERFACE; +const char bus_target_interface[] _introspect_("Target") = BUS_TARGET_INTERFACE; DBusHandlerResult bus_target_message_handler(Unit *u, DBusConnection *c, DBusMessage *message) { const BusProperty properties[] = { diff --git a/src/dbus-timer.c b/src/dbus-timer.c index e57e97303a..56044661e7 100644 --- a/src/dbus-timer.c +++ b/src/dbus-timer.c @@ -42,7 +42,7 @@ BUS_INTROSPECTABLE_INTERFACE \ "\n" -const char bus_timer_interface[] = BUS_TIMER_INTERFACE; +const char bus_timer_interface[] _introspect_("Timer") = BUS_TIMER_INTERFACE; const char bus_timer_invalidating_properties[] = "Timers\0" diff --git a/src/dbus-unit.c b/src/dbus-unit.c index 47aa8d338c..835eeda329 100644 --- a/src/dbus-unit.c +++ b/src/dbus-unit.c @@ -26,7 +26,7 @@ #include "dbus-unit.h" #include "bus-errors.h" -const char bus_unit_interface[] = BUS_UNIT_INTERFACE; +const char bus_unit_interface[] _introspect_("Unit") = BUS_UNIT_INTERFACE; #define INVALIDATING_PROPERTIES \ "LoadState\0" \ diff --git a/src/macro.h b/src/macro.h index b3da60f13e..85a7fbccfd 100644 --- a/src/macro.h +++ b/src/macro.h @@ -45,6 +45,7 @@ #define _public_ __attribute__ ((visibility("default"))) #define _hidden_ __attribute__ ((visibility("hidden"))) #define _weakref_(x) __attribute__((weakref(#x))) +#define _introspect_(x) __attribute__((section("introspect." x))) /* Rounds up */ static inline size_t ALIGN(size_t l) {