Welche Garantien bietet Ubuntu hinsichtlich der Binärkompatibilität zwischen Releases?

7

Ich weiß im Allgemeinen, dass die Antwort "PPA verwenden" lautet, aber getrennt davon ...

Wie lautet die Ubuntu-Richtlinie zur Kompatibilität zwischen Ubuntu-Versionen für eine bestimmte Architektur? Wenn beispielsweise eine Binärdatei in einem Paket auf 10.04 LTS basiert und dieselben Bibliotheken in Ubuntu 12.04 LTS vorhanden sind, garantiert Ubuntu die Kompatibilität? Gibt es Richtlinien für ISVs?

Ich habe ziemlich viel gesucht und Referenzen zur Kompatibilität mit LSB, anderen Distributionen usw. gefunden. Ich finde kein Dokument, das alle Ubuntu-Release-Versionen beschreibt.

Matt Ingenthron
quelle

Antworten:

6

Was ein Binärpaket mit einer Bibliothek inkompatibel macht, ist eine API- oder ABI-Unterbrechung.

  • Eine API-Unterbrechung tritt auf, wenn sich die von der Bibliothek angebotene Schnittstelle auf eine Weise ändert, die nicht mehr mit der vorherigen Version kompatibel ist. Ein Beispiel ist das Hinzufügen oder Entfernen eines Arguments aus einer Methodensignatur.

    API-Unterbrechungen erfordern im Allgemeinen, dass Sie Ihre Software an die neue Benutzeroberfläche anpassen, und werden von Bibliotheksentwicklern so weit wie möglich vermieden.

  • Eine ABI-Unterbrechung tritt auf, wenn sich die Größe oder Ausrichtung von Datentypen oder die Konventionen auf niedriger Ebene (z. B. Aufrufkonventionen) ändern. Ein Beispiel ist das Ändern des Parametertyps einer Funktion von intbis size_t. ABI-Unterbrechungen werden im Allgemeinen nur durch Fehlerkorrekturen oder durch Änderungen an der API eingeführt.

    Bei ABI-Unterbrechungen müssen Sie Ihr Programm nur mit den neuesten Bibliotheksheadern neu kompilieren.

Was ist die Ubuntu-Richtlinie für API- und ABI-Verstöße?

  • Neuere Ubuntu-Versionen versuchen, immer die neueste Software anzubieten, einschließlich der neuesten Softwarebibliotheken.

  • Neuere Ubuntu-Versionen versuchen, so weit wie möglich abwärtskompatibel zu sein. Beispielsweise bietet Ubuntu sowohl GTK + 2 als auch GTK + 3 gleichzeitig an.

  • Sobald eine Ubuntu-Version erstellt wurde, wird sie eingefroren , in dem Sinne, dass nur wichtige Fehlerkorrekturen das Archiv für diese Version erreichen können (es gibt Ausnahmen und Sonderfälle in Bezug auf diese Regel, aber solche Ausnahmen sind auf eine kleine Anzahl von Anwendungen beschränkt).

  • Bei Updates einer einzelnen Ubuntu-Version besteht keine Wahrscheinlichkeit von API-Unterbrechungen. Dies wird durch die Richtlinie "Nur Bugfixes" impliziert.

  • Wie ich bereits sagte, können einige Bugfixes ABI-Unterbrechungen verursachen. Dies ist zwar ein seltener Fall, aber möglich. Wenn eine ABI-Unterbrechung erforderlich ist, um einen wichtigen Fehler zu beheben, wird sie eingeführt.

  • In allen Hauptversionen von Ubuntu können sowohl API- als auch ABI-Unterbrechungen eingeführt werden. Dies liegt daran, dass versucht wird, immer die neueste Software anzubieten.

Lange Rede, kurzer Sinn: Ob Ihr Programm in allen Ubuntu-Versionen funktioniert, hängt wirklich von den verwendeten Bibliotheken und den damit verbundenen Richtlinien ab. Außerdem können Sie nicht sicher sein, ob Ihr Paket mit allen Ubuntu-Release-Updates kompatibel ist.

Das war der technischste Teil. Nach diesem wichtigen Vorwort können wir das Problem aus einem anderen Blickwinkel bekämpfen: Denken Sie daran, dass 1. viele Standards existieren, 2. freie Software versucht, die Standards so weit wie möglich zu respektieren, und 3. die meisten Bibliotheken (auch kleine und unwichtige) ) werden ihre API / ABI sehr unwahrscheinlich über Releases hinweg ändern.

Sie können also gerne ein einziges Binärpaket für mehrere Ubuntu-Versionen anbieten, aber behalten Sie die Änderungsprotokolle im Auge. Denken Sie auch daran, Ihre Paketabhängigkeiten klar zu definieren: Sagen Sie z. B. nicht, dass dies von GTK + 3 abhängt, sondern geben Sie die Bereiche (von 3.X bis 3.Y) klar an. Dies hilft Ihren Benutzern, schwerwiegende Fehler zu vermeiden.

Andrea Corbellini
quelle
1

Ich bin vielleicht ein bisschen daneben, aber lassen Sie mich sagen, wie wenig ich darüber weiß. Ich werde als Beispiel das Paket nvidia-313mit Version verwenden313.18-0ubuntu1~xedgers~raring2

Wenn ein Paket für eine bestimmte Ubuntu-Version erstellt wird, gilt Folgendes:

  • Architektur, für die es gemacht wurde (zB: 32 Bit, 64 Bit)
  • Für welche Veröffentlichung wurde es gemacht (zB: 12.04, 12.10, raring, oneric ..)
  • Welche spezifische Version dieses Pakets ist (In meinem obigen Beispiel sehen Sie raring2, was bedeuten würde, dass entweder die 3. Version davon ab 0 oder die 2. Version ab 1 ist. Dies hängt natürlich von der von mir verwendeten PPA ab und was der Betreuer hatte im Sinn)

Was bedeutet das alles? Es garantiert, dass:

  1. Das Paket funktioniert "korrekt" für diese bestimmte Ubuntu-Version mit dieser bestimmten Architektur. Dies setzt voraus, dass die Bibliotheken, die möglicherweise vom Paket verwendet werden, in einer sauberen Umgebung nicht manuell geändert oder anderweitig manipuliert wurden.

  2. Das Paket weiß, für welche Architekturen es sich um eine Version handelt. Wenn es in einem anderen verwendet wird, erhalten Sie eine Warnung oder können einfach nicht installiert werden.

  3. Die meisten PPA-Entwickler und Haupt-Repositorys von Ubuntu verfügen über eine Version eines Pakets. Es könnte dieselbe Version sein (wie ein Nvidia 313 für 13.04, 12.10, 12.04 ...), aber als es gepackt wurde, wurden bestimmte Versionen einiger anderer Pakete (Abhängigkeiten oder Voraussetzungen) und einige spezifische Versionen einiger Bibliotheken verwendet benötigt für diese Version von Ubuntu. Daher wird das gleiche Paket für verschiedene Ubuntu-Versionen angezeigt.

Funktioniert es, wenn es in einer zukünftigen oder älteren Version verwendet wird, für die es gemacht wurde, die meisten mögen es nicht. In einigen Fällen wird es aber zumindest eine Warnung geben. In den meisten Fällen hängt dies wirklich von den Abhängigkeiten des Pakets ab, da dieses Paket, wenn es beispielsweise in 12.04 einige Bibliotheken verwendet hat, die sich zum 13.04 nicht oder nur geringfügig geändert haben, unter 13.04 möglicherweise sogar noch ordnungsgemäß funktioniert (auch wenn dies der Fall ist) wurde für 12.04 gemacht), vorausgesetzt natürlich, es ist mindestens die gleiche Architektur, um andere Probleme zu vermeiden.

Um zu einer bestimmten Frage zu gelangen, die Sie stellen:

Wenn eine Binärdatei in einem Paket auf 10.04 LTS basiert und dieselben Bibliotheken in Ubuntu 12.04 LTS vorhanden sind, garantiert Ubuntu die Kompatibilität?

Wenn in beiden Versionen 10.04 und 12.04 dieselben Bibliotheken mit derselben Version, derselben Architektur (und denselben Vorabhängigkeiten, Versionen davon usw.) vorhanden sind, wird das Paket meiner Meinung nach in beiden Versionen von Ubuntu funktionieren. Dies ist nicht sehr wahrscheinlich, da die Geschwindigkeit, mit der sich eine Linux-Distribution über einen Zeitraum von ein paar Monaten ändert, enorm ist.

Viele Bibliotheken ändern sich, viele Updates werden vorgenommen, viele Verbesserungen werden hinzugefügt. So könnte etwas, das beispielsweise in 10.04 nicht vorhanden war, in 12.04 vorhanden sein, wodurch beispielsweise weniger Bibliotheken benötigt werden (wie wenn ein Paket in 10.04 12 Bibliotheken verwendet hätte, in 12.04 jedoch nur 2, um das zu erreichen) gleiches Ziel). Dies berücksichtigt auch Änderungen an den Tools, die jede App kompilieren und verpacken. Jedes Jahr erscheinen viele neue Techniken, viele Möglichkeiten, Pakete zu optimieren, zu komprimieren, zu lesen usw.

Wenn ich das alles auf mein kleines Wissen stütze, würde ich vermuten, je mehr Zeit zwischen einem Paket auf verschiedenen Ubuntu-Versionen liegt, desto weniger wahrscheinlich ist die Garantie, dass das Paket zwischen beiden Ubuntu-Versionen funktioniert.

Luis Alvarado
quelle