Dies ist der Befehl makepp, der im kostenlosen Hosting-Anbieter OnWorks 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 – Kompatibler, aber verbesserter Ersatz für make
ZUSAMMENFASSUNG
machenpp [ -e ] [ -C dir ] [ -F Makefile] [ -F makefile_or_dir ]
[ -J n] [ -k ] [ -m Methode ] [ --noremake-makefiles ]
[ --nowarn ] [ -q ] [ -R dir] [ --traditional-recursive-make ]
[ -v ] [ --version ] [ VAR=Wert ... ] [ Ziel ... ]
mpp [-Optionen] [ VAR=Wert ... ] [ Ziel ... ]
BESCHREIBUNG
Makepp, ein Build-Programm mit einer Reihe von Funktionen, die zuverlässige Builds ermöglichen und
einfachere Build-Dateien, ist ein Drop-in-Ersatz für GNU make. Es unterstützt fast alle
Syntax, die GNU make unterstützt, und kann mit Makefiles verwendet werden, die von Dienstprogrammen wie
als automake. Es heißt makepp (oder machen++), weil es mit besonderer Unterstützung entwickelt wurde
für C++, die inzwischen auf andere Sprachen wie Swig oder Embedded SQL erweitert wurde. Auch
seine Beziehung zu um ist analog zur Beziehung von C++ zu C: Es ist fast 100%
abwärtskompatibel, bietet aber eine Reihe neuer Funktionen und viel bessere Möglichkeiten zum Schreiben
Makefiles.
Makepp durchläuft eine umfangreiche Testreihe und wird in mehreren großen Projekten eingesetzt. Wenn Sie
Bei Problemen mit der neuesten CVS-Version melden Sie sich bitte, wir werden versuchen, das Problem schnellstmöglich zu beheben. Makepp
läuft mit jeder Perl-Version seit 5.8.
Die folgenden Handbuchseiten enthalten weitere Informationen zur Verwendung von makepp:
Benutzerhandbuch
Wie man ein Makefile schreibt. Dies ist vor allem für jemanden gedacht, der wenig oder keine
Erfahrung mit der Verwendung einer beliebigen Implementierung von make.
Kompilierungs-Tutorial
Was die Unix-Kompilierungsbefehle tun.
Neuigkeiten
Was sich mit jeder Veröffentlichung geändert hat.
Inkompatibilitäten
Was funktioniert zwischen GNU make und makepp anders?
Speedup
Verschiedene Tipps, um das Makepp deutlich zu beschleunigen.
Perl-Leistung
Verschiedene Tipps, wie Sie die Perl-Programmierung (innerhalb Ihrer Makefiles und anderswo) vereinfachen können
schneller.
Kochbuch
Schnelle Antworten auf Fragen wie „Wie kann ich …?“ oder „Wie kann ich am besten …?“
FAQ Schnelle Antworten auf Fragen, über die Leute gestolpert sind.
Algorithmus erstellen
Wie sich der Build-Algorithmus von makepp grundlegend vom herkömmlichen make unterscheidet.
Cache erstellen
Ein Build-Cache ist ein Verzeichnis, das die Ergebnisse früherer Builds speichert, falls diese
wird erneut im selben Verzeichnis oder in einem separaten Build in einem anderen Verzeichnis benötigt.
Build-Check-Methoden
Wie Makepp entscheidet, wann gebaut werden soll.
Integrierte Befehle
Leistungsstarke, effiziente Befehle überall verfügbar, wo Makepp 2.0 oder neuer ist.
Integrierte Regeln
Für sehr einfache Programme benötigen Sie möglicherweise überhaupt kein Makefile. Dies sind die eingebauten
Regeln, die makepp kennt.
Kompatibilität
Wo und mit welcher Perl-Version funktioniert makepp.
Erweitern
So können Sie durch Schreiben Ihres eigenen Perl-Codes Funktionen zu makepp hinzufügen.
Funktionen
Funktionen zur Textmanipulation und verschiedenen anderen Zwecken.
Aufbewahrungsorte
Repositories sind eine Technik, die sowohl den Variantenaufbau als auch die Führung einer zentralen
Quellensatz.
Regeln
Festlegen von Regeln zum Erstellen von Dateien.
Sandkästen
Verwenden von Sandboxen zum Partitionieren des Builds.
Scannen
So sucht Makepp nach Abhängigkeiten wie Include-Dateien.
Unterschriften
Wie makepp entscheidet, wann sich Dateien geändert haben.
Statements
Zusätzliche Anweisungen zur Steuerung von makepp.
Variablen
Verwenden von Variablen zur Vereinfachung von Regeln.
makepp, mpp
Befehlszeilensyntax des Hauptdienstprogramms.
makeppclean, mppc
Ein effizientes eigenständiges Bereinigungsskript zum Entfernen von von Makepp generierten Dateien.
Makeppgraph, MPPG
Ein eigenständiges Dienstprogramm zur grafischen Analyse von Abhängigkeiten und den Gründen für eine
wieder aufbauen.
makeppinfo, mppi
Ein eigenständiges Dienstprogramm zum lesbaren Speichern der Build-Informationen, die makepp über jeden
Datei.
makepplog, mppl
Ein eigenständiges Dienstprogramm zum Analysieren von Abhängigkeiten und den Gründen für einen Neuaufbau.
Makeppreplay, mppr
Ein eigenständiges Dienstprogramm zum Wiederholen von Aufgaben, die Makepp erledigt hat, aber viel schneller.
Index
Alle Schlüsselwörter, Funktionen und Operatoren in Makepp.
Eigenschaften
Automatisches Scannen nach Include-Dateien
Makepp sucht automatisch nach Include-Dateien. Dies macht Tools wie
makedepend. Makepps Scanner funktioniert auch, wenn die enthaltenen Dateien noch nicht existieren, aber
müssen erstellt werden. (Dies gilt unabhängig davon, woher sie im Include-Pfad stammen,
im Gegensatz zu Programmen, die von der Option "-MM -MG" von gcc abhängen.) Makepp hat ein flexibles System
dafür, das auf dem Scannen des Build-Befehls basiert; Sie können es anpassen für
andere Sprachen oder erstellen Sie Befehle, indem Sie eine Perl-Subroutine schreiben.
Besseres System für hierarchische Builds
Makepp verfügt über ein besseres System für die Handhabung von Builds mit mehreren Verzeichnissen und
mehrere Makefiles. Die traditionelle Technik besteht darin, dass make sich selbst aufruft
rekursiv in jedem Verzeichnis. Je nachdem, wie kompliziert die Abhängigkeiten
sind, sind manchmal mehrere rekursive Durchläufe nötig. Das macht die Makefiles sehr
kompliziert, wenn sie einen korrekten Build garantieren. Das eigentliche Problem ist, dass, es sei denn,
Abhängigkeiten trivial sind (z. B. nur eine Bibliotheksdatei), ist es fast unmöglich,
drücken Sie Abhängigkeiten von Zielen in einem Makefile präzise aus, und zwar in Bezug auf Ziele aus
das andere Makefile. Unix make ist nicht intelligent genug, um zu erkennen, dass ein Ziel in einem
Makefile hängt von einer Datei ab, die ein Ziel in einem Makefile auf niedrigerer Ebene ist; es kann nicht
Build-Befehle aus dem Makefile auf niedrigerer Ebene, während versucht wird, das Ziel in
das Makefile der oberen Ebene. Die übliche Lösung besteht also darin, alles zu erstellen, was
mit den Makefiles auf niedrigerer Ebene erstellt, in der Hoffnung, dass das ausreicht, um alles zu erstellen
das wird für das Makefile der oberen Ebene benötigt.
Makepp lädt alle benötigten Makefiles auf einmal, so dass es kein Problem damit hat,
Situationen, in denen eine Datei aus einem Makefile von einer Datei abhängt, die von einem anderen
Makefile. Makepp wechselt automatisch in das Verzeichnis, das das Makefile enthält, bevor
Ausführen eines Befehls aus einem Makefile, sodass jedes Makefile unabhängig geschrieben werden kann
ohne Kenntnis des Build-Verzeichnisses der obersten Ebene. Aber wenn der Zugriff auf das Stammverzeichnis Ihres
Der Build-Baum ist wichtig (z. B. weil sich dort Ihr Include-Verzeichnis befindet),
Sie können das Makefile in diesem Verzeichnis speziell benennen. Dann gibt makepp Ihnen den Pfad
in einer Variablen zu diesem Verzeichnis.
Makepp kann auch herausfinden, wo alle Makefiles für das gesamte Projekt sind, ohne
Wenn sich jedes Makefile im selben Verzeichnis befindet wie die Dateien, die es
erstellen. Dies kann auch Makefiles erheblich vereinfachen.
Weitere Informationen zum Erstellen mit mehreren Verzeichnissen finden Sie unter "Tipps für mehrere
Verzeichnisse" in makepp_cookbook.
Zuverlässige Platzhalter
Makefiles können Platzhalter zuverlässig verwenden, da Platzhalter entweder Dateien entsprechen, die
existieren, or Dateien, die noch nicht existieren, aber makepp weiß, wie man sie erstellt. Also selbst für eine
Programm mit Dutzenden von Modulen, könnte Ihr gesamtes Makefile einfach so aussehen
Dies:
CXX = g++
CXXFLAGS = -g
%.o : %.c
$(CXX) $(CXXFLAGS) -c $(Eingabe) -o $(Ausgabe)
mein_programm: *.o
$(CXX) $(Eingänge) -o $(Ausgabe)
und dies funktioniert auch, wenn noch keine der „.o“-Dateien erstellt wurde.
Zuverlässige Builds: merkt sich den Build-Befehl
Makepp verfolgt die Build-Befehle, so dass Dateien, wenn sich die Kompilierungsoptionen ändern,
werden automatisch neu erstellt. Dies ist wichtig, um korrekte Builds zu gewährleisten. (Diese Idee
wurde von Bob Sidebothems "cons"-Dienstprogramm übernommen, das im Perl
Journal im Jahr 1998 und ist bei CPAN erhältlich.)
Um zu veranschaulichen, warum dies wichtig ist, betrachten Sie die folgende Strukturdefinition:
Klasse ABC {
int x;
#ifndef SPEZIALOPTION
int y;
#endif
int z;
};
Nehmen wir nun an, Sie möchten die Option „SPECIAL_OPTION“ aktivieren, indem Sie
"-DSPECIAL_OPTION" in die Kommandozeile. Eine Neukompilierung von allem ist nötig, aber
Ein traditionelles Unix-Make erkennt dies nicht und kompiliert nur die Quelldateien neu
die sich tatsächlich geändert haben. Infolgedessen werden einige Ihrer Module mit
-DSPECIAL_OPTION, und andere nicht. Nach einer sehr frustrierenden Debugging-Sitzung, Sie
werden Sie feststellen, dass alles, was getan werden muss, darin besteht, alles neu aufzubauen. Dann werden Sie
Curse make und hoffentlich auf eine verbesserte Implementierung wie makepp umsteigen. Bei
Zumindest habe ich das getan.
Nehmen wir als weiteres Beispiel an, Sie arbeiten an einem Projekt, das ziemlich gut
debuggt, daher wird es normalerweise mit "-O2" kompiliert. Jetzt stößt man auf einen Fehler, den man
im Debugger zu betrachten. Code, der mit Optimierung kompiliert wurde, ist schwer zu untersuchen
im Debugger, also möchten Sie Ihren Code neu kompilieren, damit Sie ihn ansehen können. Wenn
Ihr Makefile ist so eingerichtet, dass die Compiler-Optionen in den üblichen Variablen gespeichert werden. Sie können
mach einfach Folgendes:
makepp CFLAGS=-g CXXFLAGS=-g
und makepp wird wissen, dass sich die Kommandozeile für alle Module geändert hat. Dann, wenn
Sie haben Ihren Fehler gefunden, geben Sie einfach ein
machenpp
und es wird mit Optimierung neu kompiliert. Sie müssen nicht "make clean" eingeben, wenn
Sie ändern Build-Optionen.
Einige Makefiles (z. B. die für den Linux-Kernel) gehen bis zum Äußersten, um
Neukompilierung, wenn sich der Kompilierbefehl ändert. Mit makepp wird das erledigt
automatisch – Sie müssen nichts tun.
Zuverlässige Builds: exakte Übereinstimmung der Signatur
Standardmäßig stellt makepp nicht nur sicher, dass alle Ziele neuer sind als alle
Abhängigkeiten; wenn Sie eine Abhängigkeit durch eine ältere Datei ersetzen, weiß makepp, dass es
das Ziel neu zu erstellen, einfach weil sich die Eingabedatei geändert hat. Dies ist ein weiteres
wichtige Funktion zur Gewährleistung korrekter Builds, die aus dem Dienstprogramm „cons“ übernommen wurde.
Intelligente Signaturberechnungen
Einige Änderungen an Quelldateien erfordern keinen Neuaufbau. Wenn zum Beispiel
Sie ändern nur eine Kommentarzeile oder rücken Code neu ein. Es gibt keine besonderen
Grund, eine Kompilierung zu erzwingen. Bei der C/C++-Kompilierung ermittelt makepp, ob ein
Die Datei muss neu kompiliert werden, indem eine kryptografische Prüfsumme des Dateiinhalts berechnet wird.
Kommentare und Leerzeichen werden ignoriert, anstatt die Dateizeit zu betrachten.
Dies ist besonders nützlich, wenn Sie Include-Dateien haben, die von Dateien generiert werden, die
ändern, und doch ändern sich die generierten Include-Dateien selbst selten. Angenommen, Sie
haben Sie eine komplizierte YACC-Grammatik in Ihrem Programm, mit einer Build-Regel wie dieser:
y.tab.c y.tab.h: parser.y
yacc -d parser.y
Normalerweise wird bei jeder noch so kleinen Änderung an "parser.y" jede Datei, die
hängt von „y.tab.h“ ab und muss neu erstellt werden, da sich die Dateizeit von „y.tab.h“ geändert hat.
Die meisten Änderungen an „parser.y“ ändern jedoch nicht den Inhalt von „y.tab.h“.
(außer möglicherweise einem Kommentar), daher ist die gesamte Neukompilierung unnötig.
Aufbewahrungsorte
Makepp kann automatisch Dateien aus einem anderen Verzeichnisbaum (dem
"Repository") in den aktuellen Build-Baum nach Bedarf. (Diese Idee wurde auch übernommen von
das „cons“-Programm.) Dies hat mehrere interessante Verwendungsmöglichkeiten:
Variantenaufbauten
Angenommen, Sie haben Ihr Programm mit aktivierter Optimierung und Debugging kompiliert.
aus. Nun tritt ein Fehler auf und Sie müssen alles mit Debugging neu kompilieren
aktiviert. Sobald Sie den Fehler gefunden haben, schalten Sie das Debugging aus und
Optimierung wieder einschalten, und bei den meisten Make-Programmen müssten Sie alle
die Quellen erneut, auch die, die sich nicht geändert haben. Das Verfahren würde aussehen
so was:
% makepp CFLAGS=-O2 # Alles kompilieren.
# Ups, hier wurde ein Fehler entdeckt
% makepp CFLAGS=-g # Kompiliert alles noch einmal neu.
gdb mein_programm
# ... den Fehler finden
% makepp CFLAGS=-O2 # Kompiliert alles ein drittes Mal neu.
Mit makepp können Sie einfach in ein leeres Verzeichnis wechseln und Ihr ursprüngliches
Verzeichnis als Repository. Dadurch werden neue Objektdateien im leeren
Verzeichnis, während Ihre alten Objektdateien intakt bleiben. Jetzt können Sie den Fehler finden
im Verzeichnis, das mit debug kompiliert wurde, beheben Sie es in Ihren Originalquellen und gehen Sie dann
zurück in Ihr ursprüngliches Verzeichnis. Jetzt nur noch die wenigen Dateien, die Sie tatsächlich geändert haben
müssen neu kompiliert werden.
Das gesamte Verfahren würde folgendermaßen aussehen:
% makepp CFLAGS=-O2 # Alles kompilieren.
# Ups, hier wurde ein Fehler entdeckt
% mkdir-Debugging
% CD-Debugging
% makepp -R .. CFLAGS=-g # Kompilieren Sie mit aktiviertem Debugging, aber
# Objekte in das Debug-Unterverzeichnis einfügen.
% gdb mein_Programm
# ... den Fehler finden
% cd .. # Zurück zum ursprünglichen Verzeichnis.
% makepp CFLAGS=-O2 # Kompiliert nur die Dateien neu
# die Sie geändert haben.
Dies kann bei vielen Modulen eine enorme Zeitersparnis bedeuten.
Entwicklungsteam mit gemeinsamen Quellen
Angenommen, Sie haben ein Team von Entwicklern, die an einem Standardsatz von Quellen arbeiten. Jeder
Entwickler nimmt unabhängige Änderungen vor, benötigt aber keine Kopie der
gesamten Quellbaum. Mit den Repositories von makepp können Sie jedem Entwickler
Kopien nur der Dateien, die er geändert hat. Makepp wird automatisch und
Erstellen Sie vorübergehend symbolische Links für die anderen Dateien, die nicht geändert wurden
zu den entsprechenden Dateien im Repository. Dies kann sogar für Objekt
Dateien, die im Repository vorhanden sind und nicht neu kompiliert werden müssen,
individuelles Verzeichnis des Entwicklers.
Garantieren Sie korrekte Regeln
Wenn Ihre Regeln etwas bewirken, worüber Sie makepp nicht informiert haben,
Mechanismus wird nicht wissen, diese Dinge zu holen. Also etwas, das baut normalerweise
aber ein Fehler aus einem Repository fordert Sie auf, Ihre Regeln zu korrigieren.
Automatische Ableitung der benötigten „.o“-Dateien
Makepp kann oft genau ableiten, welche Objekte tatsächlich notwendig sind, ohne
explizit mitgeteilt. Wenn Sie diese Funktion verwenden, dann, wenn eine Ihrer Quelldateien enthält
"xx.h", und es gibt eine Datei namens "xx.o", die makepp erstellen kann, dann makepp
fügt "xx.o" zur Link-Befehlszeile hinzu. Ich verwende jetzt keine nicht gemeinsam genutzten Bibliotheken in vielen
Orte, an denen ich früher war, weil Makepp automatisch die Module auswählen kann, die ich brauche.
Korrekter Umgang mit Aliasnamen für Verzeichnisse
Makepp wird nicht durch Softlinks zu einem Verzeichnis oder durch verschiedene relative
Dateinamen, die auf dieselbe Datei verweisen. Alle Verzeichnispfade zu einer Datei werden erkannt,
einschließlich foo, ./foo, ../src/foo, /auto_mnt/somedisk/bob/src/foo und
/Benutzer/Bob/src/foo.
Dateinamen mit Sonderzeichen
Makepp unterstützt Dateinamen mit Doppelpunkten, Leerzeichen oder anderen Sonderzeichen, die
Probleme beim traditionellen make verursachen. Setzen Sie den Dateinamen einfach in Anführungszeichen. (Siehe
„Sonderzeichen“ in makepp_rules für Details.)
Erweiterbare Textsubstitutionsfunktionen
Makepp kann beliebige Perl-Unterprogramme zur Textersetzung im Makefile verwenden.
Wenn Sie Perl kennen, sind Sie durch die eingebauten Funktionen von makepp überhaupt nicht eingeschränkt.
Textmanipulationsfunktionen.
Sie können auch einfach Perl-Code in Ihr Makefile schreiben. Sie können Make
Variablen mit der vollen Leistungsfähigkeit der gesamten Perl-Sprache. Siehe makepp_variables für
Details.
Protokollierung von Build-Entscheidungen
Standardmäßig erstellt makepp eine Logdatei, die mit makepplog, mppl angezeigt werden kann und die eine
Beschreibung jeder Datei, die es zu erstellen versuchte, welche Regel zum Erstellen verwendet wurde, was
davon abhing und (falls die Datei neu erstellt wurde) warum. Dies kann äußerst nützlich sein für
Debuggen eines Makefiles - wenn Sie sich fragen, warum Makepp beschlossen hat, eine Datei neu zu erstellen, oder warum
das ist nicht der Fall. Sie können einfach in der Protokolldatei nachsehen, wo die Entscheidungen erläutert werden.
Verbesserte Unterstützung für parallele Builds
Makepp unterstützt parallele Kompilierungen, aber (im Gegensatz zu anderen Make-Implementierungen)
vermischt nicht die Ausgabe von separaten, gleichzeitig laufenden Prozessen.
Synonyme für kryptische Variablen
Makepp unterstützt leichter zu merkende Synonyme für die kryptischen Make-Variablen $@, $^ und
$<. Weitere Informationen finden Sie unter makepp_variables.
Verwenden Sie makepp online mit den Diensten von onworks.net