Eine kurze Einführung in Makefiles in der Open -Source -Softwareentwicklung mit GNU Make

Eine kurze Einführung in Makefiles in der Open -Source -Softwareentwicklung mit GNU Make

Gnu machen ist ein Entwicklungsdienstprogramm, das die Teile einer bestimmten Codebasis bestimmt, die neu kompiliert werden sollen und Befehle ausstellen können, um diese Vorgänge auf der Codebasis durchzuführen. Diese besondere machen Das Dienstprogramm kann mit jeder Programmiersprache verwendet werden.

Makefiles in Linux

Um zu verwenden Gnu machen, Wir müssen einige Regeln haben, die die Beziehung zwischen verschiedenen Dateien in unserem Programm und Befehle für die Aktualisierung jeder Datei definieren. Diese werden in eine spezielle Datei namens 'geschrieben' geschriebenMakefile''. Der 'machen"Befehl verwendet den"Makefile'Datenbank und die letzten Änderungszeiten der Dateien, um zu entscheiden, welche Dateien erneut kompilieren sollen.

Inhalt eines Makefile

Allgemein 'Makefiles'enthalten 5 Arten von Dingen, nämlich: implizite Regeln, explizite Regeln, Variable Definitionen, Richtlinien, Und Kommentare.

  1. Ein explizite Regel Gibt an, wie ein oder mehrere Dateien (genannte Ziele genannt werden, später erklärt/neu) und wann Sie dasselbe tun sollen.
  2. Ein implizite Regel Gibt an, wie eine oder mehrere Dateien basierend auf ihren Namen erstellt/neu gestaltet werden können. Es beschreibt, wie ein Zieldateiname mit einer Datei mit einem ähnlichen Namen wie dem Ziel bezieht.
  3. A Variable Definition ist eine Zeile, die einen Stringwert für eine später ersetzende Variable angibt.
  4. A Richtlinie ist eine Anweisung für Make, etwas Besonderes beim Lesen des Makefile zu tun.
  5. A '#'Symbol wird verwendet, repräsentieren den Beginn von a Kommentar innen Makefiles. Eine Linie beginnt mit '#'wird einfach ignoriert.

Struktur von Makefiles

Die Informationen, die sagen machen Wie man ein System neu kompiliert, stammt aus dem Lesen einer Datenbank namens die Makefile. Eine einfache Makefile wird aus Regeln der folgenden Syntax bestehen:

Ziel…: Voraussetzungen… Rezept… 

A Ziel ist definiert als die vom Programm generierte Ausgabedatei. Es kann auch sein falsche Ziele, die unten erklärt werden. Beispiele für Zieldateien umfassen ausführbare Säle, Objektdateien oder falsche Ziele wie sauber, Installieren, deinstallieren usw.

A Voraussetzung ist eine Datei, die als Eingabe verwendet wird, um die Zieldateien zu erstellen.

A Rezept ist die Aktion, die machen Erstellt die Zieldatei basierend auf den Voraussetzungen. Es ist notwendig, das Registerkartenzeichen vor jedem Rezept in die Rezept zu setzen Makefiles es sei denn, wir geben das an 'an'.Rezeprefix'Variable, um ein anderes Zeichen als Präfix für Rezept zu definieren.

Ein Beispiel Makefile

Finale: Main.o Ende.o inter.o Starten Sie.O GCC -o Final Main.o Ende.o inter.o Starten Sie.o Main.O: Main.C Global.H GCC -c Main.c Ende.O: Ende.C LOCAL.H Global.h gcc -c Ende.c inter.O: Inter.C Global.h gcc -c inter.c Start.O: Start.C Global.H GCC -c Start.C sauber: RM -f Main.o Ende.o inter.o Starten Sie.Ö

Im obigen Beispiel haben wir verwendet 4 c Quelldateien und zwei Header -Dateien zum Erstellen der ausführbaren Dateien Finale. Hier jeder ''Datei ist sowohl ein Ziel als auch eine Voraussetzung innerhalb der Makefile. Schauen Sie sich nun den letzten Zielnamen an sauber. Es ist nur eine Aktion als eine Zieldatei.

Da wir dies normalerweise während der Zusammenstellung nicht benötigen, ist es nicht als Voraussetzung in anderen Regeln geschrieben. Ziele, die sich nicht auf Dateien beziehen, sondern nur Aktionen werden genannt falsche Ziele. Sie haben keine Voraussetzungen als andere Zieldateien.

Wie GNU einen Makefile machen

Standardmäßig machen beginnt mit dem ersten Ziel im ''Makefile"Und heißt als"Standardziel''. In Anbetracht unseres Beispiels haben wir Finale Als unser erstes Ziel. Da seine Voraussetzungen andere Objektdateien enthalten, müssen diese vor dem Erstellen aktualisiert werden Finale. Jede dieser Voraussetzungen wird nach ihren eigenen Regeln verarbeitet.

Neukompilation tritt auf, wenn Änderungen vorgenommen werden Quelldaten oder Header -Dateien oder wenn die Objektdatei existiert überhaupt nicht. Nach der Neukompilierung der erforderlichen Objektdateien, machen entscheidet, ob man neu verbindet Finale oder nicht. Dies muss erledigt werden, wenn die Datei Finale existiert nicht oder wenn eine der Objektdateien neuer ist als sie.

Wenn wir also die Datei ändern Inter.C, dann beim Laufen machen Es wird die Quelldatei neu kompilieren, um die Objektdatei zu aktualisieren Inter.Ö und dann Link Finale.

Verwenden von Variablen in Makefiles

In unserem Beispiel mussten wir alle auflisten Objektdateien zweimal in der Regel für Finale Wie nachfolgend dargestellt.

Finale: Main.o Ende.o inter.o Starten Sie.O GCC -o Final Main.o Ende.o inter.o Starten Sie.Ö

Um solche Duplikationen zu vermeiden, können wir Variablen einführen, um die Liste der Objektdateien zu speichern, die in der verwendet werden Makefile. Durch Verwendung der Variablen Obj Wir können die Probe neu schreiben Makefile zu einem ähnlichen unten gezeigten unten gezeigt.

Obj = main.o Ende.o inter.o Starten Sie.o Finale: $ (OBJ) GCC -O Final $ (OBJ) Main.O: Main.C Global.H GCC -c Main.c Ende.O: Ende.C LOCAL.H Global.h gcc -c Ende.c inter.O: Inter.C Global.h gcc -c inter.c Start.O: Start.C Global.H GCC -c Start.C sauber: RM -f $ (OBJ)

Regeln für die Reinigung des Quellverzeichnisses

Wie wir im Beispiel gesehen haben Makefile, Wir können Regeln definieren Aufräumen Das Quellverzeichnis durch Entfernen der unerwünschten Objektdateien nach der Kompilierung. Angenommen, wir haben zufällig eine Zieldatei aufgerufen sauber. Wie kann machen Differenzieren Sie die oben genannten zwei Situationen? Hier kommt das Konzept von falsche Ziele.

A Falsches Ziel ist einer, der nicht wirklich der Name einer Datei ist, sondern nur ein Name für ein Rezept, das ausgeführt wird, wenn eine explizite Anfrage aus dem gestellt wird Makefile. Ein Hauptgrund zu verwenden Falsches Ziel ist, einen Konflikt mit einer gleichnamigen Datei zu vermeiden. Anderer Grund ist die Verbesserung der Leistung.

Um dieses Ding zu erklären, werde ich eine unerwartete Wendung enthüllen. Das Rezept für sauber wird beim Ausführen standardmäßig nicht ausgeführt machen. Stattdessen ist es notwendig, dasselbe durch Ausgabe des Befehls aufzurufen sauber machen.

.Falsch: Clean Clean: RM -f $ (OBJ)

Versuchen Sie nun zu erstellen Makefiles Für Ihre eigene Codebasis. Fühlen Sie sich frei, hier mit Ihren Zweifeln zu kommentieren.