Makefiles und ihre Rolle bei der Automatisierung von Programmieraufgaben verstehen
Makefiles sind wichtige Werkzeuge, mit denen Entwickler Softwareprozesse wie Kompilieren und Erstellen organisieren und automatisieren. Wenn Sie mit großen Softwareprojekten zu tun haben, bieten Makefiles eine effektive Möglichkeit, sich wiederholende Aufgaben zu vereinfachen und die Produktivität zu steigern. Indem Sie spezifische Anweisungen in ein Makefile schreiben, können Sie die Schritte zum Erstellen des Programms steuern und sicherstellen, dass sie genau und in der gewünschten Reihenfolge ausgeführt werden. In diesem Artikel gehen wir auf das Konzept von Makefiles, ihre wichtigsten Verwendungszwecke und wie Sie mit der Erstellung eigener Makefiles beginnen, um Ihren Programmierworkflow zu verbessern, ein.
die Haupt-Punkte
- Make verwendet Make-Dateien, die Build-Prozesse über Make-Dateien automatisieren, um Code effizient zu kompilieren.
- Stellen Sie sicher, dass Dateien aus Regeln bestehen, die Ziele, Abhängigkeiten und Aktionen enthalten.
- Make-Dateien erfordern Einrückungen mit Tabulatoren und nicht mit Leerzeichen. Achten Sie daher beim Arbeiten mit Make-Dateien auf Leerzeichen.
Wenn Sie Software aus dem Quellcode installiert haben, haben Sie wahrscheinlich Make verwendet. Aber was ist dieses Programm und wie funktioniert es? Erfahren Sie alles über Make-Dateien und wie sie Ihren Erstellungsprozess revolutionieren können.
Was sind Makefiles?
Hersteller- und Montagedateien sind eng miteinander verbunden. Obwohl es nicht nur für den Zusammenbau gedacht ist, wurde Make aus den Frustrationen heraus geboren, die der Zusammenbau verursachen kann.
Bei der Kompilierung werden Quelldateien übernommen und in ein anderes Format konvertiert. Das klassische Beispiel ist eine .c-Datei, die in eine .o-Objektdatei kompiliert wird. C-Programme durchlaufen außerdem einen Verknüpfungsprozess, der .o-Dateien in eine endgültige ausführbare Datei konvertiert. Tatsächlich umfasst die Erstellung eines C-Projekts vier separate Phasen:
Die Kompilierung wurde in den frühen 1970er Jahren mit der Entwicklung von C populär, aber auch neuere Sprachen wie Typescript, Rust und Sass verwenden sie. Eine Alternative ist die Interpretation, bei der eine Middleware zum Ausführen des Codes verwendet wird, anstatt eine eigenständige ausführbare Datei zu erstellen. Zu den interpretierten Sprachen gehören JavaScript, Python und Ruby.
Kompilierte Programme laufen normalerweise schneller – manchmal sogar viel schneller – als interpretierte Programme. Die Kompilierung überprüft Ihren Code auch auf bestimmte Arten von Fehlern, die durch die Interpretation nur zur Laufzeit überprüft werden können, sodass Sie einfacher sicherstellen können, dass kompilierte Programme korrekt sind. Die Kompilierung kann jedoch ein langsamer Prozess sein, insbesondere bei Projekten mit Hunderten oder Tausenden von Quelldateien.
Was machen Makefiles?
Makefiles werden von Make verwendet, einem Programm, das Ihnen hilft, Ihren Build-Prozess zu automatisieren, einschließlich Aufgaben wie der Montage.
Wenn Sie den Befehl „make“ ausführen, sucht er standardmäßig nach einer Datei mit dem Namen „Makefile“ oder „makefile“. Diese Datei sollte Anweisungen zum Kompilieren oder Erstellen jeder Datei in Ihrem Programm enthalten.
Makefiles basieren auf dem Konzept einer „Abhängigkeit“ (oder „Voraussetzung“), die Make-Prüfungen mithilfe von Dateizeitstempeln durchführt. Dies bedeutet, dass Make den Kompilierungsprozess erheblich beschleunigen kann: Anstatt jede Quelldatei neu zu kompilieren, erstellt Make nur das Nötigste neu. Wenn sich die Quelldatei ändert, kompiliert Make sie im Allgemeinen neu, andernfalls bleibt sie unverändert.
Wie sehen Makefiles aus?
Das Erste, was Sie über Makefiles wissen sollten, ist, dass Leerzeichen groß sind. Dies wird allgemein als schlechte Designentscheidung angesehen, aber wir bleiben dabei, seien Sie also vorsichtig!
Makefiles enthalten eine Reihe von Regeln, die beschreiben, wie die einzelnen Komponenten erstellt werden. Das allgemeine Muster der Regel sieht folgendermaßen aus:
target: dependencies
actions
Hier ist im Grunde das einfachste Makefile, das eine einzelne Quelldatei in eine ausführbare Datei kompiliert:
program: program.c
gcc -o program program.c
Warnung
Die zweite Zeile dieses Makefiles ist eingerückt und der Abstand sollte einen Tabulator betragen. Unabhängig davon, ob Sie ein Makefile kopieren und einfügen oder es von Hand schreiben, achten Sie sehr darauf, ein einzelnes Tabulatorzeichen am Anfang der gezackten Zeilen beizubehalten. Wenn Sie beispielsweise vier Leerzeichen anstelle eines Tabulators verwenden, wird eine Fehlermeldung wie „Makefile:2:*** fehlt Trennzeichen“ angezeigt. Stoppen."
In diesem Beispiel ist das Ziel der Name der endgültigen ausführbaren Datei: Programm. Das Ziel und der Dateiname müssen nicht übereinstimmen, was aber normalerweise der Fall ist.
Es gibt nur eine Abhängigkeit für dieses Ziel – program.c – die Make verwendet, um zu bestimmen, was zu tun ist. Wenn die Datei „program“ neuer als „program.c“ ist, führt Make nichts aus.
Schreiben Sie das erste Makefile
Es gibt nichts Schöneres als praktische Erfahrung, und glücklicherweise ist Make in seiner einfachsten Form benutzerfreundlich.
Installieren Sie Make
Auf einer Linux-Distribution, die apt verwendet, wie Ubuntu, Mint oder Debian, können Sie Make wie folgt installieren:
sudo apt install make
Unter macOS können Sie Make über Xcode installieren, indem Sie diesen Befehl ausführen:
xcode-select --install
Wenn Sie Homebrew installiert haben, führen Sie alternativ Folgendes aus:
brew install make
Rat
Wenn Sie beim Versuch, ihn auszuführen, eine Fehlermeldung wie „make: Befehl nicht gefunden“ sehen, bedeutet das, dass make nicht in Ihrem PATH installiert ist. Sie können dieses Problem beheben, indem Sie überprüfen, ob es korrekt installiert ist.
Schreiben Sie ein einfaches Testprogramm
Sie können Make selbst in Aktion sehen, indem Sie die Make-Datei oben mit einem einfachen C-Programm testen. Sie müssen lediglich gcc und make installiert haben, um dies auszuprobieren.
Erstellen Sie eine Datei mit dem Namen „program.c“ und füllen Sie sie mit Folgendem:
#include <stdio.h>
int main()
{
printf("Hello, world.\n");
}
Testen Sie an dieser Stelle Ihr Programm, um sicherzustellen, dass es korrekt ist (und dass Sie gcc installiert haben), indem Sie den folgenden Befehl ausführen:
gcc -o program program.c
Stellen Sie sicher, dass gcc das Programm erfolgreich erstellt, und entfernen Sie es dann:
rm program
Schreiben Sie das grundlegende Makefile
Erstellen Sie nun das Beispiel-Makefile (entweder mit dem Namen „Makefile“ oder „makefile“) mit folgendem Inhalt:
program: program.c
gcc -o program program.c
Führen Sie Make aus
Stellen Sie in Ihrem Terminal sicher, dass Ihr Arbeitsverzeichnis die Dateien Makefile und program.c enthält, und führen Sie dann Make aus:
make
Wenn Sie sicher sind, dass Make Ihr Programm kompiliert und erstellt hat, testen Sie sein Verhalten, indem Sie es erneut ausführen:
make
Make sagt Ihnen, dass alles auf dem neuesten Stand ist, macht also jetzt nichts. Dies ist einer der größten Vorteile von Make: Es wird nur Zeit damit verbracht, Komponenten zu erstellen, die umgestaltet werden müssen. Versuchen Sie, die Quelldatei zu aktualisieren, und Sie werden den Unterschied bemerken:
touch program.c
make
ملاحظة
Der Touch-Befehl aktualisiert hier nur die Dateiänderungszeit auf die aktuelle Zeit. Dies ist nur eine schnelle Möglichkeit, Make vorzutäuschen, dass sich die Datei geändert hat.
Was kann Make sonst noch tun?
Make ist aufgrund seiner dateibasierten Natur wirklich eingeschränkt. Jede Datei kann Teil Ihres Build-Prozesses sein und als Ziel oder Abhängigkeit fungieren.
Damit eignet sich Make für ein breites Spektrum an Projekten. Alles mit vorhersehbaren, wiederholbaren Build-Schritten ist geeignet.
Nehmen Sie zum Beispiel einen statischen Site-Generator, der Webseiten aus anderen Quellen generiert, oft einschließlich Markdown-Textdateien. Diese Make-Datei erstellt eine bestimmte Webseite neu:
index.html: index.md
pandoc index.md index.html
Hier haben wir gerade erst die Oberfläche dessen berührt, was Make leisten kann. Tatsächlich enthalten Make-Dateien Muster, um Regeln für viele verschiedene Dateien zu definieren, wodurch komplexe Abhängigkeitsketten entstehen.
Wenn Sie das nächste Mal ein Programm erstellen, prüfen Sie, ob eine Make-Datei vorhanden ist, und versuchen Sie, deren Inhalt zu erkunden. Hoffentlich können Sie einige der Grundlagen verstehen und ein Gefühl dafür bekommen, was unter der Haube vor sich geht. Mit dem GNU-Handbuch dort mach es zur Hand, Sie können Make für Ihre eigenen Projekte verwenden, um unnötige Ausfallzeiten zu vermeiden.