Dies ist der Befehl makepp_build_algorithm, der im kostenlosen OnWorks-Hosting-Provider mit einer unserer zahlreichen kostenlosen Online-Workstations wie Ubuntu Online, Fedora Online, Windows-Online-Emulator oder MAC OS-Online-Emulator ausgeführt werden kann
PROGRAMM:
NAME/FUNKTION
makepp_build_algorithm -- Wie makepp ein Makefile ausführt
BESCHREIBUNG
Die Interna von Makepp unterscheiden sich in wesentlichen Punkten vom Standard-Unix-Make. Diese Seite
beschreibt die unterschiedliche Philosophie im Detail.
Gleicht vs Inferenz
Makepp arbeitet in die entgegengesetzte Richtung zum Standard-Unix-Make. Traditionelles Unix-Make
erhält ein zu erstellendes Ziel und findet dann eine Regel, die zu den Zeichen im
Zieldateiname. Wenn das Ziel älter ist als eine seiner Abhängigkeiten von der Regel, wird es
wird umgebaut.
Betrachten Sie zum Beispiel diese Musterregel:
%.o: %.cxx
$(CXX) $(CXXFLAGS) -c $(Eingabe) -o $(Ausgabe)
Wenn make erkennt, dass es eine Datei namens "xyz.o" erstellen muss, durchsucht es seine Liste von
Musterregeln, bis "xyz.o" mit dem Muster "%.o" übereinstimmt, und dann gilt es
diese Regel.
Makepp funktioniert in die entgegengesetzte Richtung. Es berechnet zuerst alle Dateien, die es möglicherweise
erstellen, indem Regeln angewendet werden, die den Zeichen in den Dateinamen der Abhängigkeit entsprechen. Dann wenn
Es muss eine Datei erstellen, es sieht einfach nach, ob es eine der Dateien ist, die es kennt
wie zu bauen. Die Liste der bekannten Dateien wird basierend auf dem absoluten Dateinamen gespeichert.
Wenn makepp auf die obige Musterregel stößt, sucht es nach allen Dateien im Verzeichnis
Übereinstimmung mit dem Muster "%.cxx" (dh "*.cxx"). Für jede dieser Dateien merkt es sich dann
dass es die entsprechende ".o"-Datei erzeugen kann. Wenn Makepp später entdeckt, dass es
eine andere ".cxx"-Datei erstellen kann, die derzeit nicht existiert, wird diese Regel ebenfalls angewendet
und die entsprechende ".o"-Datei wird markiert.
Dies mag etwas ineffizient erscheinen, aber es stellt sich heraus, dass es in den meisten Fällen nicht so langsam ist.
und es stimmt oft, dass praktisch alle Dateien, die erstellt werden können, tatsächlich erstellt werden.
Und die Kenntnis der vollständigen Liste der Dateien, die erstellt werden können, hat mehrere Vorteile:
· Wildcards können Dateien abgleichen, die noch nicht existieren, aber erstellt werden können.
· Header-Dateien, die vom automatischen Abhängigkeitsscanner erkannt wurden, haben kein
existieren; makepp weiß, wo sie sein werden. (Die meisten anderen Lösungen für dieses Problem
Gehen Sie davon aus, dass sich alle Header, die noch nicht existieren, im aktuellen Verzeichnis befinden.)
· Repositorys sind viel einfacher zu implementieren, da makepp im Voraus weiß, welche Dateien es enthält
kann machen. (Weitere Informationen finden Sie unter makepp_repositories.)
· Es ist leicht zu bestimmen, welche Dateien erstellt werden können (siehe die
"$(only_targets )"-Funktion.
· Makepps "$(infer_objects)"-Funktion wird stark vereinfacht, indem man weiß, was Objekte sind
erhältlich.
Mappen vs textuell Muster
Makepp verknüpft Build-Befehle mit einer Zieldatei, nicht mit einem Textmuster für a
Dateiname. Sie wird daher nicht durch unterschiedliche Namen für dieselbe Datei verwechselt. Also für
makepp weiß beispielsweise, dass "./xyz" und "xyz" dieselbe Datei sind, während andere make
Versorgungsunternehmen möglicherweise nicht.
Dies ist besonders wichtig, da makepp (im Gegensatz zum Standard-Make) Makefiles lädt
aus verschiedenen Verzeichnissen. Damit die Makefiles relativ unabhängig sind, mit
einem Makefile der obersten Ebene wird keine besondere Position zugewiesen, jedes Makefile bezieht sich auf alle Dateien
relativ zu seinem eigenen Verzeichnis. Wenn Sie also ein Makefile aus dem Unterverzeichnis laden
"other_stuff", und dieses Makefile verweist auf "../xyz", wird makepp wieder erkennen, dass es
dieselbe Datei wie oben erwähnt. (Es wird auch nicht durch ein Soft-Linked-Verzeichnis verwechselt
Namen.)
Gelagert bauen Information
Makepp speichert viel mehr Informationen zu jeder Datei, die es erstellt, über das Datum hinaus
Stempel (das ist alles, worum sich die Standardmarke kümmert). Diese Informationen umfassen:
· Die Signatur dieser Datei beim letzten Build, damit wir wissen, ob die Datei selbst
geändert.
· Die Namen jeder Abhängigkeitsdatei, einschließlich Include-Dateien und anderer abgeleiteter Dateien
automatisch. Wenn sich diese Liste ändert, geht makepp davon aus, dass sie neu erstellt werden muss.
· Die Signatur jeder Abhängigkeit. Auf diese Weise weiß makepp, dass es nicht nur dann wieder aufbauen kann, wenn die
Abhängigkeiten sind neuer als das Ziel, aber wenn sie sich überhaupt ändern. Das macht auch
es ist möglich, stattdessen andere Arten von Signaturen zu verwenden, wie z. B. kryptografische Prüfsummen
als das Dateidatum.
· Der gesamte Build-Befehl (und sein cwd). Auf diese Weise, wenn Sie den Build-Befehl ändern
(zB die Compiler-Optionen ändern), makepp weiß, dass es neu erstellt werden muss, auch wenn die Dateien
selbst haben sich nicht verändert.
· Die Architektur. Wenn Sie Ihr Programm unter Linux kompiliert haben und dann zu wechseln
Solaris weiß makepp automatisch alles neu zu kompilieren.
Makepp erstellt in jedem Verzeichnis, das es berührt, ein Unterverzeichnis namens ".makepp". Die
Build-Informationen für eine Datei Dateinamen in einem Verzeichnis wird gespeichert in .makepp/Dateiname. Wenn
Wenn Sie dieses Unterverzeichnis löschen oder die Dateien ändern, erstellt makepp alle betroffenen Dateien neu.
Implizit Laden
Wenn makepp versucht, ein Ziel in einem Verzeichnis zu erstellen und noch keine Regel dafür hat,
oder wenn es nach Dateien sucht, die einem Platzhalter in einem Verzeichnis entsprechen, wird es darin suchen
Verzeichnis, um zu sehen, ob ein Makefile vorhanden ist. Wenn ja, wird das Makefile geladen
automatisch.
Das bedeutet, dass Sie makepp normalerweise nicht explizit sagen müssen, wo es zu finden ist
makefiles – alles, was Sie tun müssen, ist, auf eine Datei in einem anderen Verzeichnis zu verweisen, und makepp wird es tun
automatisch herausfinden, wie man es baut.
Das implizite Laden erfolgt nur, wenn das Verzeichnis für Sie beschreibbar ist. Also wenn du willst
Verhindern Sie, dass Makepp versucht, eine Reihe von Dingen zu erstellen, die sich nie ändern
Verzeichnis schreibgeschützt.
Implizites Laden findet nicht statt, wenn Sie sich in einem Baum unter a . befinden RootMakeppfile(.mk) und den
ein anderes Makefile befindet sich außerhalb dieses Baums. Wenn Sie dies einmal möchten, können Sie eine
"--do-build=/" Option für makepp, um alles außerhalb des Baumes baubar zu machen. wenn du
Wenn Sie dies immer wollen, können Sie eine "load_makefile"-Anweisung irgendwo innerhalb des Baums platzieren, um
Verbinden Sie es explizit mit dem Baum.
Wenn Ihnen das implizite Laden im Weg steht (dh makepp lädt zu viele Makefiles und es wird verschwendet
Zeit, oder Sie wollen wirklich nicht, dass es versucht, all das Zeug neu aufzubauen, das in der
makefiles), können Sie es mit dem Befehl "--noimplicit_load" für alle Verzeichnisse deaktivieren
line-Option, oder Sie können sie für ausgewählte Verzeichnisse mit "no_implicit_load" deaktivieren.
-Anweisung in Ihrem Makefile.
Verwenden Sie makepp_build_algorithm online mit den onworks.net-Diensten