GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Einführung in GNU Autotools

Haben Sie jemals den Quellcode für ein beliebtes Softwareprojekt heruntergeladen, bei dem Sie das fast rituelle ./configure; make &&make install Befehlsfolge zum Erstellen und Installieren? Wenn ja, haben Sie GNU Autotools verwendet. Wenn Sie sich jemals einige der Dateien angesehen haben, die ein solches Projekt begleiten, waren Sie wahrscheinlich auch erschrocken über die offensichtliche Komplexität eines solchen Build-Systems.

Gute Nachrichten! GNU Autotools ist viel einfacher einzurichten, als Sie denken, und es ist GNU Autotools selbst, das diese 1.000-Zeilen-Konfigurationsdateien für Sie generiert. Ja, Sie können 20 oder 30 Zeilen Installationscode schreiben und erhalten die anderen 4.000 kostenlos.

Autotools bei der Arbeit

Das Linux-Terminal

  • Die 7 besten Terminalemulatoren für Linux
  • 10 Befehlszeilentools für die Datenanalyse unter Linux
  • Jetzt herunterladen:SSH-Spickzettel
  • Spickzettel für fortgeschrittene Linux-Befehle
  • Linux-Befehlszeilen-Tutorials

Wenn Sie ein Linux-Neuling sind und nach Informationen zur Installation von Anwendungen suchen, müssen Sie diesen Artikel nicht lesen! Sie können es gerne lesen, wenn Sie nachforschen möchten, wie Software erstellt wird, aber wenn Sie nur eine neue Anwendung installieren, lesen Sie meinen Artikel über die Installation von Anwendungen unter Linux.

Für Entwickler ist Autotools eine schnelle und einfache Möglichkeit, Quellcode zu verwalten und zu packen, damit Benutzer Software kompilieren und installieren können. Autotools wird auch von wichtigen Paketierungsformaten wie DEB und RPM gut unterstützt, sodass Betreuer von Software-Repositories problemlos ein mit Autotools erstelltes Projekt vorbereiten können.

Autotools arbeitet stufenweise:

  1. Zunächst während der ./configure Schritt scannt Autotools das Hostsystem (den Computer, auf dem es ausgeführt wird), um die Standardeinstellungen zu ermitteln. Zu den Standardeinstellungen gehört, wo sich Support-Bibliotheken befinden und wo neue Software auf dem System installiert werden soll.
  2. Als nächstes beim make Schritt baut Autotools die Anwendung, normalerweise durch Konvertieren von menschenlesbarem Quellcode in Maschinensprache.
  3. Schließlich beim make install Schritt kopiert Autotools die von ihm erstellten Dateien an die entsprechenden Speicherorte (wie während der Konfigurationsphase erkannt) auf Ihrem Computer.

Dieser Prozess scheint einfach zu sein und ist es auch, solange Sie Autotools verwenden.

Der Autotools-Vorteil

GNU Autotools ist eine große und wichtige Software, die die meisten von uns für selbstverständlich halten. Zusammen mit GCC (der GNU Compiler Collection) ist Autotools das Gerüst, das es erlaubt, Freie Software zu konstruieren und auf einem laufenden System zu installieren. Wenn Sie ein POSIX-System betreiben, ist es keine Untertreibung zu sagen, dass der größte Teil Ihres Betriebssystems aufgrund dieser Projekte als lauffähige Software auf Ihrem Computer vorhanden ist.

Für den wahrscheinlichen Fall, dass Ihr Lieblingsprojekt kein Betriebssystem ist, könnten Sie davon ausgehen, dass Autotools für Ihre Anforderungen zu viel des Guten ist. Aber trotz seines guten Rufs hat Autotools viele kleine Funktionen, von denen Sie profitieren können, selbst wenn Ihr Projekt eine relativ einfache Anwendung oder eine Reihe von Skripten ist.

Portabilität

Zunächst einmal geht es bei Autotools um Portabilität. Obwohl es Ihr Projekt nicht auf allen POSIX-Plattformen zum Laufen bringen kann (das liegt an Ihnen als Programmierer), kann Autotools sicherstellen, dass die Dateien, die Sie für die Installation markiert haben, an den sinnvollsten Orten auf einer bekannten Plattform installiert werden. Und dank Autotools ist es für Power-User trivial, nicht optimale Werte gemäß ihrem eigenen System anzupassen und zu überschreiben.

Mit Autotools müssen Sie nur wissen, welche Dateien an welchem ​​allgemeinen Ort installiert werden müssen. Es kümmert sich um alles andere. Keine benutzerdefinierten Installationsskripte mehr, die auf ungetesteten Betriebssystemen kaputt gehen.

Verpackung

Autotools wird ebenfalls gut unterstützt. Übergeben Sie ein Projekt mit Autotools an einen Distributionspaketierer, egal ob sie ein RPM, DEB, TGZ oder irgendetwas anderes packen, und ihre Aufgabe ist einfach. Verpackungstools kennen Autotools, sodass wahrscheinlich kein Patchen, Hacken oder Anpassen erforderlich ist. In vielen Fällen kann das Einbinden eines Autotools-Projekts in eine Pipeline sogar automatisiert werden.

So verwenden Sie Autotools

Um Autotools verwenden zu können, müssen Sie zuerst Autotools installiert haben. Ihre Distribution kann ein Paket bereitstellen, das Entwicklern helfen soll, Projekte zu erstellen, oder es kann separate Pakete für jede Komponente bereitstellen, sodass Sie möglicherweise einige Nachforschungen auf Ihrer Plattform anstellen müssen, um herauszufinden, welche Pakete Sie installieren müssen.

Die Hauptkomponenten von Autotools sind:

  • Automarke
  • autoconf
  • machen

Während Sie wahrscheinlich den für Ihr Projekt erforderlichen Compiler (z. B. GCC) installieren müssen, funktioniert Autotools problemlos mit Skripten oder binären Assets, die nicht kompiliert werden müssen. Tatsächlich können Autotools für solche Projekte nützlich sein, da es ein make uninstall bietet Skript zum einfachen Entfernen.

Sobald Sie alle Komponenten installiert haben, ist es an der Zeit, sich die Struktur der Dateien Ihres Projekts anzusehen.

Autotools-Projektstruktur

GNU Autotools hat sehr spezifische Erwartungen, und die meisten von ihnen sind wahrscheinlich vertraut, wenn Sie häufig Quellcode herunterladen und erstellen. Zunächst wird erwartet, dass sich der Quellcode selbst in einem Unterverzeichnis namens src befindet .

Ihr Projekt muss nicht all diesen Erwartungen entsprechen, aber wenn Sie Dateien an nicht standardmäßigen Speicherorten ablegen (aus Sicht von Autotools), müssen Sie dies später in Ihrem Makefile anpassen.

Zusätzlich werden diese Dateien benötigt:

  • NACHRICHTEN
  • README
  • AUTOREN
  • Änderungsprotokoll

Sie müssen die Dateien nicht aktiv verwenden und sie können symbolische Links zu einem monolithischen Dokument sein (wie README.md ), die all diese Informationen umfasst, aber sie müssen vorhanden sein.

Autotools-Konfiguration

Erstellen Sie eine Datei namens configure.ac im Stammverzeichnis Ihres Projekts. Diese Datei wird von autoconf verwendet um die configure zu erstellen Shell-Skript, das Benutzer vor dem Erstellen ausführen. Die Datei muss mindestens die AC_INIT enthalten und AC_OUTPUT M4-Makros. Sie müssen nichts über die M4-Sprache wissen, um diese Makros zu verwenden; Sie sind bereits für Sie geschrieben, und alle für Autotools relevanten sind in der Dokumentation definiert.

Öffnen Sie die Datei in Ihrem bevorzugten Texteditor. Die AC_INIT Das Makro kann aus dem Paketnamen, der Version, einer E-Mail-Adresse für Fehlerberichte, der Projekt-URL und optional dem Namen der TAR-Quelldatei bestehen.

Der AC_OUTPUT Makro ist viel einfacher und akzeptiert keine Argumente.

AC_INIT([Pinguin], [2019.3.6], [[email protected]])
AC_OUTPUT

Wenn Sie autoconf ausführen würden an dieser Stelle ein Konfigurieren Skript würde aus Ihrer configure.ac generiert werden Datei, und es würde erfolgreich ausgeführt werden. Das wäre jedoch alles, denn bisher haben Sie lediglich die Metadaten Ihres Projekts definiert und die Erstellung eines Konfigurationsskripts aufgerufen.

Die nächsten Makros müssen Sie in Ihrer configure.ac aufrufen file sind Funktionen zum Erstellen eines Makefiles. Ein Makefile teilt dem make mit Befehl, was zu tun ist (normalerweise, wie ein Programm kompiliert und gelinkt wird).

Die Makros zum Erstellen eines Makefiles sind AM_INIT_AUTOMAKE , die keine Argumente akzeptiert, und AC_CONFIG_FILES , das den Namen akzeptiert, den Sie Ihre Ausgabedatei nennen möchten.

Schließlich müssen Sie ein Makro hinzufügen, um den Compiler zu berücksichtigen, den Ihr Projekt benötigt. Welches Makro Sie verwenden, hängt natürlich von Ihrem Projekt ab. Wenn Ihr Projekt in C++ geschrieben ist, ist das entsprechende Makro AC_PROG_CXX , während ein in C geschriebenes Projekt AC_PROG_CC erfordert , und so weiter, wie im Abschnitt Programme und Bibliotheken erstellen in der Autoconf-Dokumentation beschrieben.

Zum Beispiel könnte ich Folgendes für mein C++-Programm hinzufügen:

AC_INIT([Pinguin], [2019.3.6], [[email protected]])
AC_OUTPUT
AM_INIT_AUTOMAKE
AC_CONFIG_FILES([Makefile])
AC_PROG_CXX

Speicher die Datei. Es ist Zeit, zum Makefile überzugehen.

Autotools-Makefile-Generierung

Makefiles sind nicht schwer manuell zu schreiben, aber Autotools kann eines für Sie schreiben, und das generierte verwendet die während ./configure erkannten Konfigurationsoptionen Schritt, und es wird weitaus mehr Optionen enthalten, als Sie denken oder selbst schreiben möchten. Autotools kann jedoch nicht alles erkennen, was Ihr Projekt zum Erstellen benötigt, daher müssen Sie einige Details in der Datei Makefile.am hinzufügen , die wiederum von automake verwendet wird beim Erstellen eines Makefiles.

Makefile.am verwendet die gleiche Syntax wie ein Makefile. Wenn Sie also jemals ein Makefile von Grund auf neu geschrieben haben, wird dieser Prozess vertraut und einfach sein. Häufig eine Makefile.am -Datei benötigt nur wenige Variablendefinitionen, um anzugeben, welche Dateien erstellt und wo sie installiert werden sollen.

Variablen, die auf _PROGRAMS enden Identifizieren Sie den Code, der erstellt werden soll (dies wird normalerweise als primärer angesehen Ziel; es ist der Hauptgrund, warum das Makefile existiert). Automake erkennt andere Vorwahlen wie _SCRIPTS , _DATA , _BIBLIOTHEKEN , und andere gemeinsame Teile, aus denen ein Softwareprojekt besteht.

Wenn Ihre Anwendung während des Build-Prozesses buchstäblich kompiliert wird, dann identifizieren Sie sie als Binärprogramm mit den bin_PROGRAMS -Variable und verweisen Sie dann auf einen beliebigen Teil des Quellcodes, der zum Erstellen erforderlich ist (diese Teile können eine oder mehrere zu kompilierende und zu verknüpfende Dateien sein), indem Sie den Programmnamen als Variablenpräfix verwenden:

bin_PROGRAMS =Pinguin
penguin_SOURCES =Pinguin.cpp

Das Ziel von bin_PROGRAMS wird in das bindir installiert , die während der Kompilierung vom Benutzer konfiguriert werden kann.

Wenn Ihre Anwendung nicht wirklich kompiliert ist, benötigt Ihr Projekt kein bin_PROGRAMS überhaupt variabel. Wenn Ihr Projekt beispielsweise ein Skript ist, das in Bash, Perl oder einer ähnlichen interpretierten Sprache geschrieben ist, dann definieren Sie ein _SCRIPTS Variable stattdessen:

bin_SCRIPTS =bin/Pinguin

Automake erwartet, dass sich Quellen in einem Verzeichnis namens src befinden , wenn Ihr Projekt also eine alternative Verzeichnisstruktur für sein Layout verwendet, müssen Sie Automake anweisen, Code aus externen Quellen zu akzeptieren:

AUTOMAKE_OPTIONS =fremde Unterverzeichnis-Objekte

Schließlich können Sie in Makefile.am beliebige benutzerdefinierte Makefile-Regeln erstellen und sie werden wörtlich in das generierte Makefile kopiert. Wenn Sie beispielsweise wissen, dass ein temporärer Wert in Ihrem Quellcode ersetzt werden muss, bevor die Installation fortgesetzt wird, können Sie eine benutzerdefinierte Regel für diesen Prozess erstellen:

all-am:penguin
        touch bin/penguin.sh
       
pinguin:bin/penguin.sh
        @sed "s|__datadir__|@datadir@|" $<>bin/$@

Ein besonders nützlicher Trick besteht darin, das vorhandene clean zu erweitern Ziel, zumindest während der Entwicklung. Die sauber machen Der Befehl entfernt im Allgemeinen alle generierten Build-Dateien mit Ausnahme der Automake-Infrastruktur. Es ist so konzipiert, weil die meisten Benutzer selten sauber machen wollen um die Dateien zu löschen, die es einfach machen, ihren Code zu erstellen.

Während der Entwicklung möchten Sie jedoch möglicherweise eine Methode, mit der Sie Ihr Projekt zuverlässig in einen Zustand zurückversetzen können, der von Autotools relativ unbeeinflusst ist. In diesem Fall möchten Sie vielleicht Folgendes hinzufügen:

clean-local:
        @rm config.status configure config.log
        @rm Makefile
        @rm -r autom4te.cache/
        @rm aclocal.m4
        @rm kompilieren install-sh fehlt Makefile.in

Hier gibt es viel Flexibilität, und wenn Sie nicht bereits mit Makefiles vertraut sind, kann es schwierig sein zu wissen, was Ihre Makefile.am ist braucht. Das Nötigste ist ein primäres Ziel, ob es sich um ein Binärprogramm oder ein Skript handelt, und eine Angabe, wo sich der Quellcode befindet (ob durch _SOURCES Variable oder durch Verwendung von AUTOMAKE_OPTIONS um Automake mitzuteilen, wo es nach dem Quellcode suchen soll).

Sobald Sie diese Variablen und Einstellungen definiert haben, können Sie versuchen, Ihre Build-Skripts zu generieren, wie Sie im nächsten Abschnitt sehen, und fehlende Anpassungen vornehmen.

Autotools-Build-Skript-Generierung

Sie haben die Infrastruktur aufgebaut, jetzt ist es an der Zeit, Autotools das tun zu lassen, was es am besten kann:Ihre Projektwerkzeuge automatisieren. Die Art und Weise, wie der Entwickler (Sie) mit Autotools interagiert, unterscheidet sich von der Vorgehensweise der Benutzer, die Ihren Code erstellen.

Bauherren verwenden im Allgemeinen diese bekannte Sequenz:

$ ./configure
$ make
$ sudo make install

Damit diese Beschwörung jedoch funktioniert, müssen Sie als Entwickler die Build-Infrastruktur booten. Führen Sie zuerst autoreconf aus zum Generieren des Konfigurationsskripts, das Benutzer aufrufen, bevor sie make ausführen . Verwenden Sie die –Installation Option zum Einfügen von Hilfsdateien, wie z. B. einem symbolischen Link zu depcomp , ein Skript zum Generieren von Abhängigkeiten während des Kompilierungsprozesses und eine Kopie der compile script, ein Wrapper für Compiler, um Syntaxabweichungen zu berücksichtigen, und so weiter.

$ autoreconf --install
configure.ac:3:Installation von './compile'
configure.ac:2:Installation von './install-sh'
configure.ac:2:'./missing' installieren

Mit dieser Entwicklungsumgebung können Sie dann ein Paket für die Verteilung des Quellcodes erstellen:

$ make dist

Die Distanz target ist eine Regel, die Sie kostenlos von Autotools erhalten.

Es ist eine Funktion, die in das Makefile integriert wird, das aus Ihrem bescheidenen Makefile.am generiert wird Aufbau. Dieses Ziel erzeugt eine tar.gz Archiv, das Ihren gesamten Quellcode und die gesamte wesentliche Autotools-Infrastruktur enthält, damit Personen, die das Paket herunterladen, das Projekt erstellen können.

An dieser Stelle sollten Sie den Inhalt des Archivs sorgfältig überprüfen, um sicherzustellen, dass es alles enthält, was Sie an Ihre Benutzer senden möchten. Sie sollten natürlich auch versuchen, selbst daraus zu bauen:

$ tar --extract --file pinguin-0.0.1.tar.gz
$ cd pinguin-0.0.1
$ ./configure
$ make
$ DESTDIR=/tmp/penguin-test-build make install

Wenn Ihr Build erfolgreich ist, finden Sie eine lokale Kopie Ihrer kompilierten Anwendung, die durch DESTDIR angegeben wird (in diesem Beispiel /tmp/penguin-test-build ).

$ /tmp/example-test-build/usr/local/bin/example 
Hallo Welt von GNU Autotools

Zeit für die Verwendung von Autotools

Autotools ist eine großartige Sammlung von Skripten für einen vorhersehbaren und automatisierten Freigabeprozess. Dieses Toolset mag neu für Sie sein, wenn Sie an Python- oder Bash-Builder gewöhnt sind, aber es lohnt sich wahrscheinlich, es für die Struktur und Anpassungsfähigkeit zu lernen, die es Ihrem Projekt bietet.

Und Autotools ist auch nicht nur für Code. Autotools kann verwendet werden, um Docbook-Projekte zu erstellen, Medien zu organisieren (ich verwende Autotools für meine Musikveröffentlichungen), Dokumentationsprojekte und alles andere, was von anpassbaren Installationszielen profitieren könnte.


Linux
  1. Eine Einführung in die GNU Core Utilities

  2. Eine Einführung in den diff-Befehl

  3. Einführung in iptables

  4. Plesk:Einführung

  5. Einführung in GIT unter Linux – Installieren, Projekt erstellen, Dateien übertragen

Eine Einführung in Virtual Machine Manager

Eine Einführung in bpftrace für Linux

Einführung in Python-Pandas

Einführung in das Linux-Dateisystem

Eine Einführung in den Vivaldi-Browser unter Linux

Eine Einführung in Ansible-Fakten