Auswirkung des Kompilierens aus dem Quellcode auf bereits installierte Anwendungen


8

Ich benutze Ubuntu 12.04. Angenommen, ich habe package xin Version 1.7 aus dem Repository (mit all seinen Abhängigkeiten) installiert , benötige jedoch einige Funktionen, die nur in Version 1.8 verfügbar sind. Daher lade ich den Quell-Tar herunter und kompiliere ihn:

./configure  
make  
make install
  • Überschreibt dies die vorhandenen 1.7-Binärdateien?
  • Wenn die vorhandenen Binärdateien überschrieben werden, spiegelt der Paketmanager die neue Version (1.8) wider und kann package xin Zukunft vom Paketmanager aktualisiert werden?
  • Wenn package yeine Abhängigkeit von package x 1.8- besteht, wird sie erfüllt?

Ich habe versucht, online eine gute Quelle zu finden, die dies erklärt. Wenn Sie Empfehlungen haben, lassen Sie es mich bitte wissen.


Wenn Sie den Paketmanager absichtlich umgehen, was in aller Welt lässt Sie denken, dass er später erkennt, was Sie installiert haben?
Shadur

@Shadur Dieser Aspekt dieser Frage hängt im Wesentlichen von der Frage ab, was genau passiert, wenn Sie Software von der Quelle mit installieren make install. Ich denke, aus den Antworten geht hervor, dass im Wesentlichen nur Dateien in Verzeichnisse innerhalb des Installationspräfixes kopiert werden (obwohl sich herausstellt, dass möglicherweise einige Konfigurationsdateien eingegeben werden /etcund einige dynamisch veränderbare Daten eine Initiale darstellen Zustand von etwas kann eingegeben werden /var). Wenn Sie jedoch der Meinung sind, dass dies nicht klar ist, würde ich meine Antwort gerne bearbeiten, um sie zu erklären.
Eliah Kagan

@EliahKagan Ich war dort meistens rhetorisch gegenüber Philip.
Shadur

Antworten:


12

Die überwiegende Mehrheit der .debPakete, unabhängig davon, ob sie von offiziellen Repositorys bereitgestellt werden oder nicht, wird mit dem Präfix installiert /usr.

Dies bedeutet, dass ausführbare Dateien, die vom Benutzer ausgeführt werden sollen, /usr/binoder /usr/sbin(oder /usr/gameswenn es sich um ein Spiel handelt), gemeinsam genutzte Bibliotheken /usr/lib, plattformunabhängige gemeinsam genutzte Daten /usr/share, Header-Dateien /usr/includeund automatisch installierter Quellcode eingegeben werden /usr/src.

Ein kleiner Prozentsatz der Pakete wird /als Präfix verwendet. Zum Beispiel bashfügt das Paket die bashausführbare Datei ein /bin, nicht /usr/bin. Dies gilt für Pakete, die das Nötigste bieten, um im Einzelbenutzermodus (z. B. im Wiederherstellungsmodus) ausgeführt und im Mehrbenutzermodus gestartet zu werden (denken Sie jedoch daran, dass dies häufig Funktionen zum Mounten einiger Arten von Netzwerkfreigaben enthält ... falls dies der Fall /usrist ein entferntes Dateisystem).

Ein kleiner Prozentsatz der .debPakete, hauptsächlich der mit Quickly erstellten , erstellt einen paketspezifischen Ordner /optund legt alle ihre Dateien dort ab. Abgesehen davon wird meistens /optder Speicherort von Software verwendet, die von einem ausführbaren Installationsprogramm installiert wird, das den Paketmanager des Systems nicht verwendet, jedoch kein Kompilieren aus dem Quellcode umfasst. (Wenn Sie beispielsweise ein proprietäres Programm wie MATLAB installieren, werden Sie es wahrscheinlich einfügen /opt.)

Wenn Sie im Gegensatz dazu ein Quellarchiv herunterladen (oder Quellcode von einem Revisionskontrollsystem wie Bazaar oder git abrufen), erstellen und installieren, wird es normalerweise mit dem Präfix installiert /usr/local(es sei denn, Sie weisen es an, dies zu tun) Andernfalls). Dies bedeutet , dass Ihre ausführbaren Dateien gehen in /usr/local/bin, /usr/local/liboder /usr/local/games, Ihre Bibliotheken in /usr/local/libund so weiter.

Hiervon gibt es einige Ausnahmen - einige Programme werden standardmäßig mit dem /usrPräfix installiert und überschreiben daher Installationen derselben Programme aus .debPaketen. In der Regel können Sie dies verhindern, indem Sie sie ausführen, ./configure --prefix=/usr/localanstatt ./configuresie zu erstellen. Ich betone noch einmal, dass dies normalerweise nicht notwendig ist.

(Aus diesem Grund ist es für Sie sehr sinnvoll, den von Ihnen erstellten Quellcode einzufügen /usr/local/src, der für die systemweite Verwendung in dem zu diesem Zweck vorhandenen Code installiert wird .)

Angenommen, die gepackte Version ist installiert in /usrund die Version, die Sie von der Quelle installiert haben, ist in /usr/local:

  • Dateien aus dem installierten Paket werden nicht überschrieben.

    In der Regel wird die neuere Version ausgeführt, wenn Sie das Programm manuell über die Befehlszeile aufrufen (vorausgesetzt, /usr/local/binoder wo immer die ausführbaren Dateien installiert sind, befindet sie sich in Ihrer PATHUmgebungsvariablen und wird vor dem entsprechenden /usrVerzeichnis mit Präfix angezeigt, z /usr/bin.

    Es kann jedoch einige Probleme geben, welche Starter durch Menüs oder Suchen erstellt und zugänglich gemacht werden. Wenn Sie mehr als eine Version einer Bibliothek an verschiedenen Orten installiert haben, kann es außerdem etwas komplizierter werden, zu bestimmen, welche von welcher Software verwendet wird.

    Wenn Sie sich eigentlich nicht verwenden beide Versionen des Programms oder der Bibliothek, dann oft sollten Sie die man entfernen , dass Sie nicht verwenden, obwohl in bestimmten Situationen , die Sie möglicherweise eine Paketabhängigkeiten erfüllen installiert bleiben soll.

Wenn jedoch aus irgendeinem Grund Dateien überschrieben werden (z. B. wenn der Quellcode nicht installiert ist, /usrsondern /usr/local):

  • Der Paketmanager weiß nichts darüber, wie die installierte Software geändert wurde. Es wird denken, dass die alte Version installiert ist. Dies kann zu schlimmen Problemen führen. Sie sollten dies vermeiden. Wenn Sie diese Situation erstellt haben, sollten Sie die von der Quelle installierte Software (normalerweise mit sudo make uninstallim Verzeichnis) deinstallieren und dann das Paket oder die Pakete deinstallieren, die die überschriebenen Dateien enthalten (da sie durch Deinstallation der installierten Version nicht wiederhergestellt werden) von der Quelle). Installieren Sie dann die gewünschte Version neu./usr/local/src/program-or-library-name

Wie zur Erfüllung von Abhängigkeiten:

  • Wenn es ein .debPaket gibt, das von der von der Quelle installierten Software abhängt und die von der Quelle (oder höher) installierte Version erfordert, wird dieses Paket nicht erfolgreich installiert. (Genauer gesagt, Sie können es möglicherweise "installieren", es wird jedoch nie "konfiguriert", sodass Sie es nicht verwenden können.) Abhängigkeiten werden durch die installierten Paketversionen gelöst, nicht durch Welche Software hast du eigentlich?

    Ebenso wird die Software zumindest versuchen, vollständig zu installieren, selbst wenn Sie die von Paketen bereitgestellten Dateien, von denen die zu installierende Software abhängt, manuell gelöscht haben. (Sie sollten im Allgemeinen nicht versuchen, dies für irgendeinen Zweck zu nutzen. Der auf falschen Informationen basierende Paketmanager ist fast immer eine schlechte Sache.)

Wenn Sie daher kein Paket finden, das die Version der benötigten Software enthält, müssen Sie möglicherweise .debaus der von Ihnen kompilierten Software ein eigenes Paket erstellen und aus diesem Paket installieren. Dann weiß der Paketmanager, was los ist. Das Erstellen eines Pakets für den eigenen Gebrauch, das auf den Computern anderer Benutzer nicht gut funktioniert, ist eigentlich nicht sehr schwierig. (Aber ich bin der Meinung, dass dies möglicherweise außerhalb des Rahmens Ihrer Frage liegt, wie sie derzeit formuliert ist.)


Vielen Dank für Ihre ausführliche Antwort, es hat viele Konzepte klar gemacht
Philip D'Rozario

5

Was Sie vom Software Center oder mit einem APT-Befehl ( apt-get, aptitude) oder mit installieren , dpkgist dem Paketverwaltungssystem bekannt. dpkgist das Tool zur Manipulation von Paketen auf niedriger Ebene. APT und Freunde sind Tools auf höherer Ebene, die aufgerufen werden dpkg, um die eigentliche Installation durchzuführen und auch Abhängigkeiten und Paketdownloads zu verarbeiten.

Wenn Sie ein Programm aus dem Quellcode kompilieren, ist es dem Paketmanager nicht bekannt. Die Konvention unter Linux, die Sie befolgen sollten, wenn Sie Schwierigkeiten haben, den Überblick zu behalten und Ihre Installationen überschreiben zu lassen, lautet:

  • /bin, /lib, /sbin, /usrSind reserviert zum Paket - Manager;
  • außer dass dies /usr/localfür den Systemadministrator gilt - beachten Sie die dortige Verzeichnishierarchie, aber Sie müssen die Dateien selbst verwalten.

Siehe Bester Weg, um vim / gvim auf 7.3 in Ubuntu 10.04 zu aktualisieren? Hier finden Sie eine Liste der Möglichkeiten, um neuere Softwareversionen zu erhalten. Der einfachste Weg ist, eine PPA zu bekommen , falls es eine gibt. Wenn Sie ein Binärpaket erhalten oder aus dem Quellcode kompilieren, empfehle ich die Verwendung von stow , um Ihre manuell installierte Software zu verwalten. Alternativ können Sie Ihr eigenes .debPaket erstellen - es ist mehr Arbeit, aber es zahlt sich aus, wenn Sie häufig aktualisieren (normalerweise ist das Wiederherstellen des Pakets für die nächste Nebenversion sehr schnell) oder wenn Sie es auf vielen Computern bereitstellen, auf denen dieselbe Distribution ausgeführt wird.

Wenn Sie mit den meisten Programmen ausgeführt werden ./configure && make && sudo make install, wird das Programm unter installiert /usr/local. Überprüfen Sie die mit der Quelle gelieferte Dokumentation (normalerweise in einer Datei mit dem Namen READMEoder INSTALL) oder führen Sie sie aus ./configure --help, um zu überprüfen, ob dies der Fall ist. Wenn das Programm unter installiert ist /usr/local, wird die vom Paketmanager bereitgestellte Version nicht beeinträchtigt. /usr/local/binkommt zuerst auf dem System PATH. Beachten Sie, dass Sie make installals Administrator (root) ausgeführt werden müssen. nicht als root kompilieren. Wie oben erwähnt, empfehle ich die Verwendung von stow anstelle der direkten Installation in /usr/local.


1

Dies hängt vom Paket und vielen anderen Dingen ab

  1. Verwendete Namenskonventionen - Enthält die Binärdatei Versionsnummern in Dateinamen?
  2. Installationsort - ist dies standardmäßig in opt, aber die gepackte Version ist in / usr
  3. viele weitere Möglichkeiten

Lange Rede, kurzer Sinn:
Es gibt keine generische Antwort. Es ist stark paketabhängig. Sie sollten nach Möglichkeit offizielle +1 PPAs verwenden, anstatt aus dem Quellcode zu kompilieren.


1
Es ist eigentlich ziemlich ungewöhnlich, dass Programme oder Bibliotheken, die aus dem Quellcode kompiliert wurden, installiert werden /opt. /usr/localist das Standardpräfix und sogar /usrein häufigeres Standardpräfix als /opt. /optwird am häufigsten für Software verwendet, die in einem dedizierten Verzeichnis installiert wird, das für die jeweilige Anwendung benannt ist (so kann beispielsweise eine Anwendung namens Foo mit allen darin enthaltenen Dateien installiert werden /opt/foo).
Eliah Kagan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.