EnglischFranzösischSpanisch

Ad


OnWorks-Favicon

makepp_extending – Online in der Cloud

Führen Sie makepp_extending im kostenlosen Hosting-Anbieter OnWorks über Ubuntu Online, Fedora Online, den Windows-Online-Emulator oder den MAC OS-Online-Emulator aus

Dies ist der Befehl makepp_extending, der beim kostenlosen Hosting-Anbieter OnWorks mit einer unserer zahlreichen kostenlosen Online-Workstations wie Ubuntu Online, Fedora Online, dem Windows-Online-Emulator oder dem MAC OS-Online-Emulator ausgeführt werden kann

PROGRAMM:

NAME/FUNKTION


makepp_extending – So erweitern Sie makepp mit Perl

BESCHREIBUNG


Makepp ist intern so flexibel, dass Sie dies tun können, indem Sie ein wenig Perl-Code schreiben
Funktionen hinzufügen oder eine Reihe anderer Operationen ausführen.

Allgemeines merkt an on Schreiben Perl Code zu Arbeit mit machenpp
Jedes Makefile befindet sich in einem eigenen Paket. Daher haben Definitionen in einem Makefile keinen Einfluss
Definitionen in einem anderen Makefile. Ein gemeinsamer Satz von Funktionen, einschließlich aller Standardfunktionen
Textmanipulationsfunktionen werden bei der Erstellung in das Paket importiert.

Makefile-Variablen werden in diesem Paket als Perl-Skalare gespeichert. (Es gibt Ausnahmen von
Dies: Automatische Variablen und der Standardwert von Variablen wie CC sind tatsächlich
als Funktionen ohne Argumente implementiert. Zielspezifische Variablen, Befehlszeilenvariablen und
(Umgebungsvariablen werden auf diese Weise nicht angezeigt.) Daher hat jeder Perl-Code, den Sie schreiben, Zugriff auf alle
Makefile-Variablen. Globale Variablen werden im Paket „Mpp::global“ gespeichert. Sehen
Makefile-Variablen für die Details.

Jede der Anweisungen (ifperl / ifmakeperl, perl / makeperl, sub / makesub), die
Funktionen (Perl/Makeperl, Map/Makemap) und die Regelaktion (Perl/Makeperl) für
Es gibt zwei Varianten, Perl-Code direkt in das Makefile zu schreiben. Das erste ist absolut
normales Perl, was bedeutet, dass Sie das Präfix „f_“ verwenden müssen, wie im nächsten Abschnitt erläutert, wenn
Sie möchten makepp-Funktionen aufrufen. Die zweite Variante leitet die Anweisung zunächst weiter
Variablenerweiterung im Make-Stil, was bedeutet, dass Sie die „$“-Werte verdoppeln müssen, die Perl sehen soll.

Das End-Handling ist etwas Besonderes, da makepp (abhängig von Ihrem Build-System) riesige Datenmengen hat
Bei einem normalen Ausgang würde die Müllsammlung von Strukturen mehrere Sekunden dauern. Also machen wir ein
Brute-Force-Exit. Im Hauptprozess können Sie immer noch „END“-Blöcke haben, aber wenn Sie welche haben
Globale Dateihandles werden möglicherweise nicht geleert. Sie sollten jedoch das moderne Lexikon verwenden
Dateihandles, die ordnungsgemäß geschlossen werden, wenn sie den Gültigkeitsbereich verlassen.

In Perl-Code direkt als Regelaktion oder über einen von Ihnen definierten Befehl ausführen, ist dies der Fall
Gegenteil. „END“-Blöcke werden nicht ausgeführt, aber globale Dateihandles werden für Sie geleert. Der
„DESTROY“ globaler Objekte wird niemals ausgeführt.

Hinzufügen neu textuell Funktionen
Sie können dem Repertoire von makepp eine neue Funktion hinzufügen, indem Sie einfach eine Perl-Subroutine von definieren
den gleichen Namen, aber mit dem Präfix „f_“. Zum Beispiel:

sub f_myfunc {
mein $argument = &arg; # Benennen Sie das Argument.
my( undef, $mkfile, $mkfile_line ) = @_; # Benennen Sie die Argumente.

... hier etwas unternehmen

return $return_value;
}

XYZ := $(myfunc meine func-Argumente)

Wenn Ihre Funktion keine Argumente akzeptiert, gibt es nichts zu tun. Wenn Ihre Funktion eine benötigt
Argument, wie im Beispiel oben, verwenden Sie den einfachen Accessor &arg, um es zu erhalten. Wenn du
Wenn Sie mehr Argumente erwarten, benötigen Sie den unten beschriebenen komplexeren Accessor „args“.

Diese Accessoren verarbeiten dieselben drei Parameter, die an jedes „f_“ übergeben werden sollten.
Funktion, nämlich die Funktionsargumente, das Makefile-Objekt und einen Zeilendeskriptor für
Mitteilungen. Daher können Sie im ersten Fall die effiziente &arg-Form verwenden.

Der &arg-Accessor erledigt Folgendes für Sie: Wenn die Argumente bereits vorhanden waren
erweitert (z. B. um den Namen der Funktion in „$(my$(function) arg)“ zu finden, ist das Argument
als String übergeben und gerade zurückgegeben. Wenn das Argument noch erweitert werden muss, ist dies der Fall
Im Normalfall handelt es sich stattdessen um einen Verweis auf eine Zeichenfolge. Der &arg-Accessor erweitert es für Sie,
Dafür benötigt es das Makefile-Objekt als 2. Parameter.

Wenn Sie weitere Argumente erwarten, möglicherweise in variabler Anzahl, wird die Aufgabe von „args“ ausgeführt.
Dieser Accessor akzeptiert die gleichen drei Parameter wie arg sowie zusätzliche Parameter:

max: Anzahl der Argumente (Standard 2): Geben Sie ~0 (maxint) für endlos an
min: Anzahl der Argumente (Standard 0, wenn max ~0 ist, sonst dasselbe wie max)
only_comma: Verschwendet keinen Platz um Kommas, wie es bei Nicht-Dateinamen üblich ist

Höchstens maximale, aber mindestens minimale Kommas vor der Erweiterung werden zum Teilen verwendet
Argumente. Einige Beispiele aus den integrierten Funktionen von makepp:

my( $prefix, $text ) = args $_[0], $_[1], $_[2], 2, 2, 1; # Präfix hinzufügen
für mein $cond ( args $_[0], undef, $_[2], ~0 ) ... # und, oder
my @args= args $_[0], $_[1], $_[2], ~0, 1, 1; # Anruf
my( $filters, $words ) = args $_[0], $_[1], $_[2]; # Filter

Die Funktion sollte eine Skalarzeichenfolge (kein Array) zurückgeben, die dann in die eingefügt wird
Text an dieser Stelle.

Wenn Ihre Funktion auf einen Fehler stößt, sollte sie mit der üblichen Perl-Anweisung „die“ abstürzen.
Dies wird von makepp abgefangen und eine Fehlermeldung mit dem Dateinamen und der Zeile angezeigt
Die Nummer des Ausdrucks, der den Fehler verursacht, wird ausgedruckt.

Es gibt im Grunde keine Grenzen hinsichtlich der Möglichkeiten der Funktion; Sie können auf die Datei zugreifen und sie ausführen
Shell-Befehle usw.

Derzeit werden Ausdrücke, die in Abhängigkeiten und in den Regelaktionen vorkommen, erweitert
einmal, während Ausdrücke, die in Zielen erscheinen, zweimal erweitert werden. Seien Sie also vorsichtig, wenn Sie
Die Funktion hat Nebenwirkungen und ist in einem Ausdruck für ein Ziel vorhanden.

Beachten Sie, dass die Umgebung (insbesondere das cwd), in der die Funktion ausgewertet wird, dies tun wird
nicht unbedingt mit der Umgebung übereinstimmen, in der die Regeln aus dem Makefile gelten, in dem die
Die ausgewertete Funktion wird ausgeführt. Wenn dies ein Problem für Sie ist, dann Ihre Funktion
dürfte wohl etwa so aussehen:

sub f_foo {
...
chdir $makefile->{CWD};

... Etc.
}

Putting Funktionen in a Perl Modulen
Wenn Sie Funktionen in eine Include-Datei einfügen, erhalten Sie eine Kopie pro Makepp-Datei
nutzt es. Um dies zu vermeiden, können Sie sie als normale Perl-Module mit einem „Exporter“ schreiben.
Schnittstelle und verwenden Sie diese. Das lädt schneller und spart Speicher:

perl { mymodule verwenden }
perl {
benutze my::module; # setze : in eine neue Zeile, damit dies in der Regel nicht geparst wird
}

Wenn Sie eine der normalerweise in einem Makefile verfügbaren Funktionen benötigen (z. B. „f_“)
Funktionen, „arg“ oder „args“), müssen Sie diese Zeile in Ihr Modul einfügen:

benutze Mpp::Subs;

Der Nachteil besteht darin, dass sich das Modul in einem anderen Paket befinden würde als eine Funktion direkt
erscheint in einem Makefile. Sie müssen also alles als Parameter oder Konstrukt übergeben
Namen mit Perls „caller“-Funktion.

maximal einfach anrufen extern Perl Skripte
Wenn Sie ein externes Perl-Skript über „system“ oder als Regelaktion aufrufen, forkt makepp a
Erstellen Sie einen neuen Prozess (es sei denn, es handelt sich um die letzte Regelaktion) und starten Sie einen brandneuen Perl-Interpreter.
Daran ist nichts auszusetzen, außer dass es einen effizienteren Weg gibt:

&Befehl Argumente ...
Dies kann eine Regelaktion sein. Es wird eine Funktion aufgerufen Befehl mit einem „c_“-Präfix und
Übergeben Sie den Rest (optional in Anführungszeichen gesetzter Makepp-Stil – nicht genau derselbe wie
Shell)-Argumente. Wenn eine solche Funktion nicht gefunden werden kann, werden alle Zeichenfolgen an übergeben
"Lauf".

sub c_mycmd { my @args = @_; ... }

$(falscher Anrufbefehl):
&mycmd 'arg with space' arg2 "arg3" # ruft c_mycmd auf

%.out: %.in
&myscript -o $(output) $(input) # ruft externes myscript auf

Sie können Ihre Befehle im Rahmen der integrierten Funktionen schreiben und so verwenden
die gleichen Standardoptionen wie sie haben und die I/O-Verarbeitung, die sie bieten.

Auf den Blockoperator „Mpp::Cmds::frame“ folgt eine aus einem Buchstaben bestehende Optionsliste
die Builtins (maximal „qw(fi I ​​o O rs)“). Auch wenn Sie Ihre eigene Option angeben
Wenn Sie eine davon überschreiben, geben Sie immer noch den einzelnen Buchstaben der Standardoption an.

Jede eigene Option wird als „[qw(n Name), \$ref, arg, sub]". Die ersten beiden
Elemente sind Kurz- und Langnamen, gefolgt von der Variablenreferenz und optional von
ein boolescher Wert, der angibt, ob ein Argument angenommen werden soll. Ohne ein Argument ist die Variable
wird jedes Mal erhöht, wenn die Option angegeben wird, andernfalls wird der Optionswert darin gespeichert.

sub c_my_ocmd { # Typischer Ausgabefall
lokal @ARGV = @_;
Mpp::Cmds::frame {

... hier etwas mit @ARGV drucken, wobei die Optionen bereits automatisch entfernt wurden

} 'f', qw(o O);
}

sub c_my_icmd { # Typischer Eingabefall mit 2 Optionen
lokal @ARGV = @_;
my( $short, $long );
Mpp::Cmds::frame {

... hier etwas mit <> machen

} qw(i I rs), # s gibt nur --separator an, nicht -s
[qw(s short), \$short], # Keine Option arg -> $short == 1
[qw(l long), \$long, 1, sub { warn "got arg $long"}];
}

Hier kommt ein einfacher Befehl, der nur das erste Zeichen jeder Eingabe in Großbuchstaben umwandelt
Datensatz (entspricht "&sed '$$_ = "\u\L$$_"'"):

sub c_uc {
lokal @ARGV = @_;
Mpp::Cmds::frame {
print "\u\L$_" while <>;
} 'f', qw(i I o O rs);
}

Innerhalb des vom Frame behandelten Blocks können Sie verschachtelte Blöcke für die Ausführung kritischer Aufgaben haben
Vorgänge wie das Öffnen anderer Dateien.

Mpp::Cmds::perform { ... } 'message';

Dadurch wird eine Nachricht mit „--verbose“ ausgegeben (was jeder Befehl akzeptiert), wenn der
Der Befehl wurde erfolgreich ausgeführt. Aber wenn der Block als falsch ausgewertet wird, stirbt er mit
negierte Nachricht.

Lauf Skript Argumente ...
Dies ist eine normale Perl-Funktion, die Sie in jedem Perl-Kontext innerhalb Ihres Makefiles verwenden können.
Es ähnelt der Multi-Argument-Form des Systems, führt jedoch das darin enthaltene Perl-Skript aus
den aktuellen Prozess. Für makepp-Anweisungen die Perl-Funktion oder Ihre eigenen Funktionen
Das ist der Prozess, der makepp ausführt. Aber für eine Regel ist das der Unterprozess, der ausgeführt wird
Es. Das Skript wird so oft geparst, wie es aufgerufen wird, aber Sie können das Echte angeben
in eine Bibliothek einarbeiten, wie es pod2html tut. Diese Bibliothek kann dann auf der obersten Ebene verwendet werden
dass es bereits vorhanden ist:

perl { use mylib } # wird auf alle Regeln verzweigt, die es nicht erneut analysieren müssen

%.out: %.in
makeperl { run qw'myscript -o $(output) $(input)' }

Wenn das Skript „exit“ aufruft, schließt es Standarddateideskriptoren oder verlässt sich auf das System
um danach aufzuräumen (geöffnete Dateien, Speicher...), kann dies bei „Ausführen“ ein Problem sein. Wenn
Wenn Sie „run“ innerhalb von Anweisungen oder der Perl-Funktion aufrufen, kann Makepp gestört werden oder das
Die Bereinigung erfolgt erst am Ende von makepp.

Wenn Sie eines der oben genannten Probleme haben, führen Sie das Skript extern aus, also ab
stattdessen die Befehlszeile. Innerhalb einer Regel ist die Bereinigung weniger problematisch, insbesondere nicht
als letzte Aktion einer Regel, da der Regelunterprozess danach sowieso beendet wird,
außer unter Windows.

Schreiben Ihre besitzen Stempel, Unterschrift Methoden
Manchmal möchten Sie, dass makepp eine Signaturmethode mit einer anderen Technik berechnet. Für
Angenommen, Sie haben eine Binärdatei, die von einer gemeinsam genutzten Bibliothek abhängt. Normalerweise, wenn Sie
Wenn Sie die gemeinsam genutzte Bibliothek ändern, müssen Sie ausführbare Dateien, die davon abhängen, nicht erneut verknüpfen, weil
Die Verknüpfung erfolgt zur Laufzeit. (Es ist jedoch möglich, dass das erneute Verknüpfen der ausführbaren Datei
könnte notwendig sein, weshalb ich dies nicht zur Standardeinstellung gemacht habe.) Was Sie wollen makepp
Das Ziel besteht darin, die gleiche Signatur für die gemeinsam genutzte Bibliothek zu haben, auch wenn sie sich ändert.

Dies kann auf verschiedene Arten erreicht werden. Der einfachste Weg ist, Ihr eigenes neues zu erstellen
Signaturmethode (nennen wir sie „shared_object“). Sie würden diese Signaturmethode verwenden
nur für Regeln, die Binärdateien verknüpfen, wie folgt:

meinProgramm: *.o lib1/lib1.so lib2/lib2.so
: Signatur Shared_Object
$(CC) $(Eingänge) -o $(Ausgabe)

Jetzt müssen wir die Signaturmethode erstellen.

Alle Signaturmethoden müssen eine eigene Klasse sein und die Klasse muss einige Besonderheiten enthalten
Elemente (siehe Mpp/Signature.pm in der Distribution für Details). Der Name der Klasse muss sein
mit dem Präfix „Mpp::Signature::“, daher sollte in diesem Fall unsere Klasse aufgerufen werden
„Mpp::Signature::shared_object“. Wir müssen eine Datei namens erstellen shared_object.pm und legen
es in eine Mpp::Signatur Verzeichnis irgendwo im Perl-Include-Pfad; der einfachste Ort
könnte in der sein Mpp/Signatur Verzeichnis in der makepp-Installation (z. B.
/usr/local/share/makepp/Mpp/Signature oder wo auch immer Sie es installiert haben).

Für genaue Details darüber, was in diesem Kurs alles passieren muss, sollte man sich genau umschauen
die Datei Mpp/Signature.pm und wahrscheinlich auch Mpp/Signature/exact_match.pm im makepp
Verteilung. Aber in unserem Fall wollen wir nur eine sehr kleine Änderung an einem vornehmen
vorhandener Signaturmechanismus; Wenn es sich bei der Datei um eine gemeinsam genutzte Bibliothek handelt, möchten wir eine Konstante haben
Wenn es sich bei der Datei um etwas anderes handelt, möchten wir uns auf die normale Signatur von makepp verlassen
Signaturmechanismus. Der beste Weg, dies zu tun, besteht darin, von zu erben
„Mpp::Signature::c_compilation_md5“, die normalerweise gewählte Signaturmethode
wenn makepp einen Link-Befehl erkennt.

Also die Datei Mpp/Signature/shared_object.pm könnte Folgendes enthalten:

Verwenden Sie strenge;
Paket Mpp::Signature::shared_object;
use Mpp::Signature::c_compilation_md5;
our @ISA = qw(Mpp::Signature::c_compilation_md5); # Vererbung angeben.
unser $shared_object = bless \@ISA; # Ein Stück Magie, das Makepp beim Finden hilft
# die Unterroutinen für diese Methode. Alle
# Signaturmethoden müssen eine davon haben.
# Der Wert wird nicht verwendet, sondern nur ein beliebiges Objekt.
# Hier ist nun die Methode, die aufgerufen wird, wenn wir die Signatur von benötigen
# jedes Ziel oder jede Abhängigkeit, für die diese Signaturmethode aktiv ist:
Untersignatur {
my ($self, # Dies wird dasselbe sein wie $shared_object.
$finfo) = @_; # Eine spezielle Struktur, die alles enthält
# makepp kennt diese Datei. Sehen
# Mpp/File.pm für Details.

if ($finfo->{NAME} =~ /\.s[oa]$/) { # Endet der Dateiname auf .so oder .sa?
$finfo->file_exists zurückgeben? 'existiert': '';
# Immer die gleiche Signatur zurückgeben, wenn die Datei
# existiert. In diesem Fall ist die Signatur die
# Zeichenfolge „existiert“.
}

Mpp::Signature::c_compilation_md5::signature;
# Wenn die Datei nicht auf .so oder .sa endet,
# an die übliche Signaturmethode von makepp delegieren.
}

Diese Datei wird als Beispiel in der makepp-Distribution bereitgestellt, mit einigen zusätzlichen
Kommentare.

Übrigens, warum machen wir das nicht zur Standardeinstellung? Nun, es gibt Zeiten, in denen man a
Eine gemeinsam genutzte Bibliothek erfordert eine erneute Verknüpfung Ihres Programms. Wenn Sie jemals eines der beiden ändern
Symbole, die eine gemeinsam genutzte Bibliothek definiert, oder die Symbole, die sie von anderen Bibliotheken abhängig macht
denn manchmal kann eine Neuverknüpfung notwendig sein.

Nehmen wir beispielsweise an, dass die gemeinsam genutzte Bibliothek einige Unterroutinen Ihres Programms aufruft
bietet. Angenommen, Sie ändern die gemeinsam genutzte Bibliothek so, dass sie jetzt eine externe Bibliothek aufruft
Unterprogramm „xyz()“. Es sei denn, Sie verwenden die Option „-E“ oder „--export-dynamic“ für den Linker
(für GNU-Binutils; andere Linker haben andere Optionsnamen), das Symbol „xyz()“ möglicherweise nicht
für den Laufzeitlinker zugänglich sein, auch wenn er in Ihrem Programm vorhanden ist.

Noch schlimmer: Angenommen, Sie haben „xyz()“ in einer anderen Bibliothek definiert (nennen Sie es libxyz), so was:

mein_programm: main.o lib1/lib1.so xyz/libxyz.a

Da „libxyz“ ein ist .a Datei und nicht eine .so Datei, dann wird „xyz()“ möglicherweise nicht eingezogen
richtig ab libxyz.a es sei denn, Sie verknüpfen Ihre Binärdatei erneut.

Mpp::Signature-Methoden steuern auch nicht nur die Zeichenfolge, die verwendet wird, um zu bestimmen, ob a
Die Datei hat sich geändert, aber der Algorithmus, der zum Vergleichen der Zeichenfolgen verwendet wird. Zum Beispiel die
Die Signaturmethode „target_newer“ in der makepp-Distribution erfordert lediglich, dass die
Ziele müssen neuer sein als die Abhängigkeiten, während die Signaturmethode „exact_match“ (und
alles, was davon abhängt, wie „md5“ und „c_compilation_md5“) erfordert, dass die
Die Datei hat dieselbe Signatur wie beim letzten Build.

Hier sind einige andere Arten von Signaturmethoden, die nützlich sein könnten, um Ihnen bei der Verwirklichung zu helfen
die Möglichkeiten. Wenn der allgemeine Zweck ausreichend ist, können einige davon irgendwann einmal verwendet werden
in makepp eingearbeitet:

· Eine Signaturmethode für gemeinsam genutzte Bibliotheken, die eine Prüfsumme aller exportierten Dateien zurückgibt
Symbole sowie alle benötigten Symbole aus anderen Bibliotheken. Dies löst das
Problem mit dem obigen Beispiel und garantiert unter allen Umständen einen korrekten Link.
Ein experimenteller Versuch, dies zu tun, wurde in der makepp-Distribution unternommen (siehe
Mpp/Signature/shared_object.pm), aber es funktioniert nur mit GNU-Binutils und ELF
Bibliotheken im Moment.

· Eine Signaturmethode, die einen in eine Datei geschriebenen Datumsstempel ignoriert. ZB, wenn Sie
generieren a .c Datei automatisch mithilfe eines Programms, das darauf besteht, eine Zeichenfolge einzufügen
in etwa so:

static char * date_stamp = „Automatisch generiert am 01. April 2004 von niemandem“;

Sie könnten eine Signaturmethode schreiben, die Änderungen an Datumsstempeln ausdrücklich ignoriert.
Wenn sich also nur der Datumsstempel geändert hat, wird makepp nicht neu erstellt.

· Eine Signaturmethode, die die Signaturen auf normale Weise berechnet, diese jedoch ignoriert
Architekturabhängigkeit bei der Entscheidung, ob ein Umbau durchgeführt werden soll. Dies könnte nützlich sein für
wirklich architekturunabhängige Dateien; Wenn Sie derzeit auf einer Architektur aufbauen,
makepp wird beim Wechsel darauf bestehen, auch architekturunabhängige Dateien neu zu erstellen
zu einer anderen Architektur.

· Eine Signaturmethode, die Kommentare in Latexdateien ignorieren kann, z
Die Methode „c_compilation_md5“ weiß, wie Kommentare in C-Dateien ignoriert werden.

· Eine Signaturmethode zur automatischen Dokumentationsextraktion, die nur die Prüfsummen berechnet
Kommentare, die ein Dokumentationsextraktor benötigt, und ignoriert andere Änderungen an der Quelle
Datei.

Unvollendet
Dieses Dokument ist noch nicht fertig. Es sollte behandeln, wie Sie Ihre eigenen Scanner schreiben
Dateien und ähnliches einschließen.

Verwenden Sie makepp_extending online über die Dienste von onworks.net


Kostenlose Server & Workstations

Laden Sie Windows- und Linux-Apps herunter

Linux-Befehle

Ad