Squelette SPM minimal pour un binding Swift de D-Bus sous Linux. Cible : Ubuntu 24.04.3 + Swift 6.2 (installé via Swiftly).
# Swift via Swiftly (https://swiftlang.github.io/swiftly/)
# Assurez-vous d'avoir Swift 6.2 actif dans votre shell.
swift --version
# Headers/SDK D-Bus
sudo apt update
sudo apt install -y libdbus-1-devgit clone <votre-repo-ou-ce-dossier> swift-dbus
cd swift-dbus
# Construire la librairie et l'exécutable d'exemple
swift build
# Lancer l'exemple
swift run swift-dbus-examplesVous devriez voir la version de libdbus ainsi qu'un indicateur de disponibilité.
bash scripts/test.sh– lanceswift testdans undbus-run-sessiondédié (utile sur CI/sandbox).bash scripts/format.sh– appliqueswift-formatpuisswiftlint --fix && lint --strict.
Les tests d’intégration ouvrent un vrai bus session temporaire, requièrent donc libdbus-1 et dbus-run-session.
Package.swift– Dépendance système verslibdbus-1via un target.systemLibrary(CDbus).Sources/CDbus– Module système SPM avecmodule.modulemappointant versshim.hqui inclut<dbus/dbus.h>.Sources/SwiftDBus– API Swift de plus haut niveau (placeholder à étendre).Sources/swift-dbus-examples– Petit binaire de démonstration.Tests/SwiftDBusTests– Tests unitaires minimalistes.
let connection = try DBusConnection(bus: .session)
_ = try connection.requestName("org.example.App")
let id = try connection.getBusId()
let machineId = try connection.getMachineId()
let names = try connection.listNames()
let owner = try connection.getNameOwner("org.freedesktop.DBus")
try connection.pingPeer()let proxy = DBusProxy(
connection: connection,
destination: "org.freedesktop.DBus",
path: "/org/freedesktop/DBus",
interface: "org.freedesktop.DBus"
)
let status: UInt32 = try proxy.callExpectingSingle(
"RequestName",
typedArguments: DBusArguments("org.example.App", UInt32(0))
)
struct ListNamesResponse: DBusReturnDecodable {
let names: [String]
init(from decoder: inout DBusDecoder) throws {
names = try decoder.next([String].self)
}
}
let namesResult: ListNamesResponse = try proxy.callExpecting(
"ListNames",
as: ListNamesResponse.self
)
print("Bus exposes \(namesResult.names.count) names")
// Helper DBusArguments(...) construit la liste d'arguments (ici String + UInt32)Pour les méthodes qui renvoient plusieurs valeurs, utilisez les helper DBusTuple2 / DBusTuple3 ou faites
conformer votre propre struct à DBusReturnDecodable.
let rule = DBusMatchRule.signal(
interface: "org.freedesktop.DBus",
member: "NameOwnerChanged",
arg0: "org.example.App"
)
for await signal in try connection.signals(matching: rule) {
print("Signal from \(signal.sender ?? "-"): \(signal.args)")
}L’API signals(matching:) inscrit automatiquement la règle côté bus (AddMatch) et la retire (RemoveMatch) à la fin du flux.
let proxy = DBusProxy(
connection: connection,
destination: "org.freedesktop.DBus",
path: "/org/freedesktop/DBus",
interface: "org.freedesktop.DBus"
)
let busId = try proxy.callExpectingFirstString("GetId")
for await change in try proxy.signals(member: "NameOwnerChanged", arg0: "org.example.App") {
print("Change: \(change.args)")
}let features: [String] = try proxy.getProperty("Features")
let all = try proxy.getAllProperties()
print(all["Features"] ?? .unsupported(0))
let cache = DBusPropertyCache()
let cachedFeatures: [String] = try proxy.getProperty("Features", cache: cache)
let refreshedFeatures: [String] = try proxy.getProperty(
"Features",
cache: cache,
refreshCache: true
)
print("Cached features \(cachedFeatures), live value \(refreshedFeatures)")struct NameOwnerChangedSignal: DBusSignalPayload {
static let member = "NameOwnerChanged"
let name: String
let oldOwner: String
let newOwner: String
init(from decoder: inout DBusDecoder) throws {
name = try decoder.next()
oldOwner = try decoder.next()
newOwner = try decoder.next()
}
}
let typedStream = try proxy.signals(NameOwnerChangedSignal.self, arg0: "org.example.App")
for await signal in typedStream {
print("\(signal.name) moved from \(signal.oldOwner) -> \(signal.newOwner)")
}Un workflow GitHub Actions est fourni pour builder et tester sur ubuntu-24.04 avec Swift 6.2.
Le projet swift-dbus vise à offrir une couverture complète et moderne de l’API D-Bus en Swift (6.2+), pour Linux.
La feuille de route détaillant les différentes étapes (wrappers bas niveau, API Swift, proxies, export d’objets, génération de code, etc.) est disponible ici :
Tu y trouveras la progression prévue, les milestones et les futurs objectifs de compatibilité et d’outillage.