Jedes Mal, wenn Sie etwas aus dem Quellcode kompilieren, gehen Sie die gleichen drei Schritte durch:
$ ./configure
$ make
$ make install
Ich verstehe, dass es sinnvoll ist, den Installationsprozess in verschiedene Schritte zu unterteilen, aber ich verstehe nicht, warum jeder einzelne Codierer auf diesem Planeten immer wieder dieselben drei Befehle schreiben muss, um nur einen einzigen Job zu erledigen. Aus meiner Sicht wäre es absolut sinnvoll, ein ./install.sh
Skript automatisch mit dem Quellcode zu liefern, der den folgenden Text enthält:
#!/bin/sh
./configure
make
make install
Warum sollten die Leute die 3 Schritte separat machen?
unix
makefile
configure
make-install
erikbwork
quelle
quelle
Antworten:
Weil jeder Schritt andere Dinge tut
Bereiten Sie die (Setup-) Umgebung für das Erstellen vor
Dieses Skript enthält viele Optionen, die Sie ändern sollten. Wie
--prefix
oder--with-dir=/foo
. Das heißt, jedes System hat eine andere Konfiguration../configure
Überprüft auch , ob Bibliotheken fehlen, die installiert werden sollen. Wenn hier etwas nicht stimmt , wird Ihre Anwendung nicht erstellt . Aus diesem Grund haben Distributionen Pakete, die an verschiedenen Orten installiert sind, da jede Distribution der Meinung ist, dass es besser ist, bestimmte Bibliotheken und Dateien in bestimmten Verzeichnissen zu installieren. Es soll laufen./configure
, aber in der Tat sollten Sie es immer ändern.Schauen Sie sich zum Beispiel die Arch Linux-Paketseite an . Hier sehen Sie, dass jedes Paket einen anderen Konfigurationsparameter verwendet (vorausgesetzt, es werden Autotools für das Build-System verwendet).
Aufbau des Systems
Dies ist eigentlich
make all
standardmäßig. Und jede Marke hat andere Aktionen zu tun. Einige erstellen, andere führen Tests nach dem Erstellen durch, andere checken aus externen SCM-Repositorys aus. Normalerweise müssen Sie keine Parameter angeben, aber einige Pakete führen sie wieder anders aus.Auf dem System installieren
Dadurch wird das Paket an der mit configure angegebenen Stelle installiert. Wenn Sie möchten, können Sie angeben
./configure
, dass auf Ihr Home-Verzeichnis verwiesen werden soll. Viele Konfigurationsoptionen zeigen jedoch auf/usr
oder/usr/local
. Das heißt, Sie müssen dann tatsächlich verwenden,sudo make install
da nur root Dateien nach / usr und / usr / local kopieren kann.Jetzt sehen Sie, dass jeder Schritt eine Voraussetzung für den nächsten Schritt ist. Jeder Schritt ist eine Vorbereitung, damit die Dinge problemlos funktionieren. Distros verwenden diese Metapher, um Pakete zu erstellen (wie RPM, Deb usw.).
Hier sehen Sie, dass jeder Schritt tatsächlich einen anderen Zustand hat. Deshalb haben Paketmanager unterschiedliche Wrapper. Unten finden Sie ein Beispiel für einen Wrapper, mit dem Sie das gesamte Paket in einem Schritt erstellen können. Denken Sie jedoch daran, dass jede Anwendung einen anderen Wrapper hat (tatsächlich haben diese Wrapper einen Namen wie spec, PKGBUILD usw.):
Hier kann man Autotools verwenden, das heißt
./configure
,make
undmake install
. Aber ein anderer kann SCons, Python-bezogenes Setup oder etwas anderes verwenden.Wie Sie sehen, erleichtert die Aufteilung jedes Status die Wartung und Bereitstellung erheblich, insbesondere für Paketbetreuer und Distributionen.
quelle
install
hängt davon ab, wirdall
dahermake install
anrufenmake all
make install
Installieren Sie einfach verschiedene Ressourcen an einem vordefinierten Speicherort. Wenn Sie sich nur für die ausführbare Datei interessieren, können Sie die ausführbare Datei aus dem Build-Verzeichnis verwenden und Ihrem PATH ein Build-Verzeichnis hinzufügen.Erstens sollte es sein,
./configure && make && make install
da jeder vom Erfolg des ersteren abhängt. Ein Teil des Grundes ist die Evolution und ein Teil des Grundes ist die Bequemlichkeit für den Entwicklungsworkflow.Ursprünglich
Makefile
enthielten die meisten s nur die Befehle zum Kompilieren eines Programms, und die Installation wurde dem Benutzer überlassen. Eine zusätzliche Regel ermöglicht esmake install
, die kompilierte Ausgabe an einem Ort zu platzieren, der möglicherweise korrekt ist. Es gibt immer noch viele gute Gründe, warum Sie dies möglicherweise nicht tun möchten, einschließlich der Tatsache, dass Sie nicht der Systemadministrator sind und es überhaupt nicht installieren möchten. Wenn ich die Software entwickle, möchte ich sie wahrscheinlich nicht installieren. Ich möchte einige Änderungen vornehmen und die Version in meinem Verzeichnis testen. Dies wird noch ausgeprägter, wenn mehrere Versionen herumliegen../configure
geht und erkennt, was in der Umgebung verfügbar ist und / oder vom Benutzer gewünscht wird, um zu bestimmen, wie die Software erstellt werden soll. Dies muss sich nicht sehr oft ändern und kann oft einige Zeit dauern. Auch hier lohnt es sich nicht, ständig neu zu konfigurieren, wenn ich Entwickler bin. Noch wichtiger istmake
, dass beim erneuten Ausführen von Zeitstempeln zum erneuten Erstellen von Modulen dieconfigure
Möglichkeit besteht, dass sich Flags ändern. Einige der Komponenten in meinem Build werden jetzt mit einem Satz von Flags und andere mit einem anderen Satz von Flags kompiliert, was dazu führen kann anderes, inkompatibles Verhalten. Solange ich nicht erneut ausführeconfigure
, weiß ich, dass meine Kompilierungsumgebung dieselbe bleibt, auch wenn ich meine Quellen ändere. Wenn ich es noch einmal macheconfigure
, sollte ich es tunmake clean
Entfernen Sie zunächst alle erstellten Quellen, um sicherzustellen, dass die Elemente einheitlich erstellt werden.Der einzige Fall, in dem die drei Befehle hintereinander ausgeführt werden, ist, wenn Benutzer das Programm installieren oder ein Paket erstellt wird (z. B. Debians Debuild oder RedHats RPMbuild). Und das setzt voraus, dass die Verpackung eine Ebene erhalten kann
configure
, was bei Verpackungen normalerweise nicht der Fall ist, wenn dies zumindest--prefix=/usr
erwünscht ist. Und Pacakger müssen sich bei der Arbeit gerne mit falschen Wurzeln auseinandersetzenmake install
. Da es viele Ausnahmen gibt,./configure && make && make install
wäre es für viele Leute, die dies viel häufiger tun, unpraktisch , die Regel zu erstellen!quelle
&&
!Erstens findet ./configure nicht immer alles, was es benötigt, oder in anderen Fällen findet es alles, was es benötigt, aber nicht alles, was es verwenden könnte. In diesem Fall möchten Sie etwas darüber wissen (und Ihr Skript ./install.sh würde trotzdem fehlschlagen!). Das klassische Beispiel für Nicht-Fehler mit unbeabsichtigten Konsequenzen ist aus meiner Sicht das Kompilieren großer Anwendungen wie ffmpeg oder mplayer. Diese verwenden Bibliotheken, wenn sie verfügbar sind, kompilieren jedoch trotzdem, wenn dies nicht der Fall ist, und lassen einige Optionen deaktiviert. Das Problem ist, dass Sie später feststellen, dass es ohne Unterstützung für das eine oder andere Format kompiliert wurde, sodass Sie zurückgehen und es wiederholen müssen.
Eine andere Sache, die ./configure etwas interaktiv macht, besteht darin, Ihnen die Möglichkeit zu geben, anzupassen, wo auf dem System die Anwendung installiert wird. Unterschiedliche Distributionen / Umgebungen haben unterschiedliche Konventionen, und Sie möchten sich wahrscheinlich an die Konvention auf Ihrem System halten. Möglicherweise möchten Sie es auch lokal installieren (ausschließlich für sich selbst). Traditionell werden die Schritte ./configure und make nicht als root ausgeführt, während make install (sofern es nicht nur für Sie selbst installiert ist) als root ausgeführt werden muss.
Bestimmte Distributionen stellen häufig Skripte bereit, die diese ./install.sh-Funktionalität verteilungsabhängig ausführen - z. B. Quell-RPMs + Spezifikationsdatei + RPMbuild oder Slackbuilds .
(Fußnote: Davon abgesehen stimme ich zu, dass ./configure; make; make install; extrem langweilig werden kann.)
quelle
configure
kann fehlschlagen, wenn festgestellt wird, dass Abhängigkeiten fehlen.make
führt ein Standardziel aus, das erste, das im Makefile aufgeführt ist. Oft ist dieses Zielall
, aber nicht immer. Sie könnten es also nur,make all install
wenn Sie wüssten, dass dies das Ziel ist.So ...
oder:
Das
$*
ist enthalten, weil man oft Optionen dafür bereitstellen mussconfigure
.Aber warum nicht einfach die Leute es selbst machen lassen? Ist das wirklich so ein großer Gewinn?
quelle
configure
ist Teil des GNU Automake-Toolkits, das eine Art Add-On für Make darstellt. Make gibt es schon seit vielen, vielen Jahren und macht seine Arbeit gut. Das heißt, die Leute haben sich andere Wege ausgedacht, um den Herstellungsprozess zu handhaben. Ameise und cmake haben ihre Anhänger. Die Teile des Erstellungsprozesses (wie Konfigurieren, Erstellen und Installieren) sind jedoch immer noch separate Befehle.