Makefile Learning 2 – Funktionen

I. Einleitung

        Makefile-Funktionen stellen Methoden zum Bearbeiten von Dateinamen, Variablen, Text und Befehlen bereit. Durch die Verwendung von Funktionen kann das Schreiben von Makefile flexibler gestaltet werden. Der Mechanismus der Funktion ist auch der Ort, an dem die Funktion aufgerufen wird und das Verarbeitungsergebnis der Funktion durch die ursprüngliche Funktion ersetzt wird. Ein einfaches Beispiel lautet wie folgt:

objects = $(patsubst .c,.o,$(wildcard *.c))

        Das Obige ist das Operationsergebnis der Funktion patsubst (ersetzen Sie den Text aller Dateinamen, die „.c“-Dateien im aktuellen Arbeitsverzeichnis enthalten, durch „.o“-Dateinamen) und weisen Sie sie Objekten zu. Die Ausgabe der Funktion ersetzt die patsubst-Funktion.

2. Syntax zum Aufrufen von Funktionen

1. Format:

$(FUNCTION ARGUMENT)
或者
${FUNCTION ARGUMENTS}

2. Beschreibung:

        1. „FUNCTION“ in der Grammatik ist der Name der aufzurufenden Funktion, der der Name der in make eingebetteten Funktion sein sollte. Benutzerdefinierte Funktionsnamen müssen indirekt über die Funktion „call“ von make aufgerufen werden.

        2. „ARGUMENTE“ ist der Parameter der Funktion. Es wird empfohlen, ein Leerzeichen zu verwenden, um den Parameter und die Funktion zu trennen . Wenn mehrere Parameter vorhanden sind, verwenden Sie ein Komma „“, um die Parameter zu trennen.

        3. Beginnen Sie mit „$“ und schließen Sie den Funktionsnamen und die Parameter in gepaarte Klammern oder geschweifte Klammern ein.

        4. Wenn die Funktion Parameter verarbeitet und die Parameter Verweise auf andere Variablen oder Funktionen haben, erweitern Sie zunächst diese Verweise, um den tatsächlichen Inhalt der Parameter zu erhalten, und verarbeiten Sie sie dann. Die Erweiterungsreihenfolge der Funktion erfolgt entsprechend der Reihenfolge der Parameter.

        5. Beim Schreiben dürfen in den Parametern der Funktion keine Kommas "," und Leerzeichen vorkommen. Dies liegt daran, dass Kommas als Trennzeichen für mehrere Argumente verwendet werden und Leerzeichen ignoriert werden. Wenn beim tatsächlichen Schreiben des Makefiles Kommas oder Leerzeichen als Parameter der Funktion vorhanden sind, müssen diese einer Variablen zugewiesen werden, und auf diese Variable wird in den Parametern der Funktion verwiesen. Beispiele sind wie folgt:

[root@localhost makefile]# vim test1.mk
comma:=,
empty:=
space:=$(empty) $(empty)
foo:=a b c
bar:=$(subst $(space),$(comma),$(foo))

$(warning $(bar))

all:
        @echo hello

结果:
[root@localhost makefile]# make -f test1.mk  all
test1.mk:8: a,b,c
hello

3. Textverarbeitungsfunktionen

1. $(subst FROM,TO,TEXT)

        String-Ersetzungsfunktion. Ersetzt die Zeichen „FROM“ in der Zeichenfolge „TEXT“ durch „TO“ und gibt nach der Ersetzung die neue Zeichenfolge zurück. Beispiele sind wie folgt:

target=$(subst ee,EE,feet on the street)

结果:
target=fEEt on the street

2. $(patsubst PATTERN,REPLACEMENT,TEXT)

        Musterersetzungsfunktion. Sucht nach durch Leerzeichen getrennten Zeichenfolgen in „TEXT“ und ersetzt Zeichenfolgen, die dem Muster „PATTERN“ entsprechen, durch Zeichenfolgen mit „REPLACEMENT“. Der Musterplatzhalter „%“ kann im Parameter „PATTERN“ verwendet werden, um mehrere Zeichen einer Zeichenfolge darzustellen. Wenn der Parameter „REPLACEMENT“ auch ein „%“ enthält, dann ist das „%“ in „REPLACEMENT“ die Zeichenfolge, die durch das „%“ in „PATTERN“ dargestellt wird. Beispiele sind wie folgt:

src:=a.c b.c c.c
objects=$(patsubst %.c,%.o,$(src))

结果:
objects=a.o b.o c.o

Die Variablensubstitution bezieht sich auf eine vereinfachte Version der Funktion „patsubst“:

2.1. $(VAR:PATTERN=REPLACEMENT) = $(patsubst PATTERN,REPLACEMENT,$(VAR))

Beispiele sind wie folgt:

objects:=a.o b.o c.o
src:=$(objects:.o=.c)

结果:
src=a.c b.c c.c

2.2. $(VAR:SUFFIX=REPLACEMENT) = $(patsubst %SUFFIX,%REPLACEMENT,$(VAR))

Beispiele sind wie folgt:

objects:=a.o b.o c.o
src:=$(objects:%.o:%.c)

结果:
src=a.c b.c c.c

3. $(strip STRING)

        Funktion zum Entfernen von Leerzeichen. Entfernen Sie das Nullzeichen (Leerzeichen oder Tabulatorzeichen) am Anfang und Ende der Zeichenfolge „STRING“ und kombinieren Sie mehrere Leerzeichen innerhalb der Zeichenfolge „STRING“ zu einem Nullzeichen. Beispiele sind wie folgt:

empty:=
multi_space:=$(empty)   $(empty)
src:=$(multi_space) a.c   b.c c.c
result:=$(strip $(src))

结果:
src=    a.c   b.c c.c
result=a.c b.c c.c

4. $(findstring FIND,IN)

        Finden Sie String-Funktionen. Suchen Sie die Zeichenfolge „FIND“ in der Zeichenfolge „IN“. Wenn die Zeichenfolge „FIND“ in der Zeichenfolge „IN“ vorhanden ist, geben Sie „FIND“ zurück, andernfalls ist sie leer. Beispiele sind wie folgt:

result:=$(findstring a,a b c)

结果:
result=a

5. $(filter MUSTER...,TEXT)

        Filterfunktion. Filtern Sie alle Zeichenfolgen in der Zeichenfolge „TEXT“ heraus, die nicht mit dem Muster „PATTERN“ übereinstimmen, behalten Sie die Zeichenfolgen bei, die mit „PATTERN“ übereinstimmen, und es können mehrere „PATTERN“ vorhanden sein. Die Zeichenfolge „MUSTER“ muss im Allgemeinen das Musterzeichen „%“ enthalten. Wenn mehrere Muster vorhanden sind, verwenden Sie Leerzeichen, um die Musterausdrücke zu trennen . Beispiele sind wie folgt:

src:=a.c b.c c.s d.h
result:=$(filter %.c %.s,$(src))

结果:
result=a.c b.c c.s

6. $(herausfiltern PATTERN...,TEXT)

        Anti-Filter-Funktion. Im Gegensatz zu der durch die Funktion „filter“ implementierten Funktion werden alle Zeichenfolgen herausgefiltert, die mit „PATTERN“ in der Zeichenfolge „TEXT“ übereinstimmen. Alle Zeichenfolgen, die diesem Muster nicht entsprechen, bleiben erhalten. Es können mehrere Muster vorhanden sein. Wenn mehrere Muster vorhanden sind, werden die Musterausdrücke durch Leerzeichen getrennt. Gibt Zeichenfolgen in „TEXT“ zurück, die nicht mit „PATTERN“ übereinstimmen. Beispiele sind wie folgt:

src:=a.c b.c c.s d.h
result:=$(filter-out %.c %.s,$(src))

结果:
result=d.h

7. $(Wort N,TEXT)

        Übernehmen Sie die Wortfunktion. Holen Sie sich das „N“-te Wort in mehreren Zeichenfolgen „TEXT“ ( der Wert von N beginnt bei 1 ). Die Funktion gibt das N-te Wort in „TEXT“ zurück. Beispiele sind wie folgt:

result:=$(word 2,aaa bbb ccc ddd)

结果:
result=bbb

8. $(wordlist S,E,TEXT)

        Nehmen Sie eine String-Funktion. Extrahieren Sie die Zeichenfolgen von „S“ bis „E“ aus mehreren Zeichenfolgen „TEXT“. Die Funktion gibt die Wortfolgen von „S“ bis „E“ in der Mehrfachzeichenfolge „TEXT“ zurück. Beispiele sind wie folgt:

result=$(wordlist 2,3,aaa bbb ccc ddd eee)

结果:
result=bbb ccc

9. $(Wörter TEXT)

        Funktion zum Zählen der Anzahl von Strings. Die Funktion gibt die Anzahl der Strings in „TEXT“ zurück. Beispiele sind wie folgt:

result=$(words aaa bbb ccc ddd eee)

结果:
result=5

10. $(firstword NAMES...)

        Nehmen Sie die erste String-Funktion. Die Funktion gibt die erste Zeichenfolge von „NAMES“ zurück. Die Funktion „firstword“ entspricht $(word 1,NAMES...). Beispiele sind wie folgt:

result=$(firstword aaa bbb ccc ddd)

结果:
result=aaa

4. Funktion zur Verarbeitung von Dateinamen

1. $(dir NAMES...)

        Funktion „Verzeichnis abrufen“. Extrahieren Sie den Verzeichnisteil jedes Dateinamens aus der Dateinamensequenz „NAMES…“. Der Verzeichnisteil eines Dateinamens ist das, was im Dateinamen vor dem letzten Schrägstrich („/“) enthalten ist. Die Funktion gibt den Verzeichnisteil jeder Datei in der Dateisequenz „NAMES…“ zurück. Wenn der Dateiname keinen Schrägstrich enthält, wird die Datei als Datei im aktuellen Verzeichnis („./“) betrachtet . Beispiele sind wie folgt:

result=$(dir src/foo.c a/b/x.c aaa bbb)

结果:
result=src/ a/b/ ./ ./

2. $(notdir NAMES...)

        Rufen Sie die Dateinamenfunktion ab. Extrahieren Sie Nichtverzeichnisteile aus der Dateinamensequenz „NAMES“. Der Verzeichnisteil ist der Teil vor dem letzten Schrägstrich („/“). Entfernen Sie Verzeichnisteile aus allen Dateinamen und lassen Sie nur Nicht-Verzeichnisteile übrig. Die Funktion gibt den Nichtverzeichnisteil jeder Datei in der Dateinamensequenz „NAMES“ zurück. Ein Fehler der Funktion besteht darin, dass der Dateiname keine Leerzeichen enthalten darf, da es sonst zu Problemen kommt. Beispiele sind wie folgt:

result:=$(notdir src/a.c include/a.h aaa bbb ccc)

结果:
result=a.c a.h aaa bbb ccc

3. $(Suffix NMAES...)

        Nehmen Sie die Suffixfunktion. Nehmen Sie das Suffix jedes Dateinamens aus der Dateinamenfolge „NAMES“ (der letzte Teil des Dateinamens beginnt mit einem Punkt „.“). Wenn der Dateiname keinen Punkt enthält, ist er leer. Die Funktion gibt eine durch Leerzeichen getrennte Folge von Suffixen für jede Datei in „NAMES…“ zurück. Wenn es sich bei „NAMES...“ um mehrere Dateinamen handelt, ist der Rückgabewert eine Folge mehrerer durch Leerzeichen getrennter Zeichenfolgen oder leer, wenn der Dateiname kein Suffix hat. Beispiele sind wie folgt:

result=$(suffix src/a.c include/a.h b.c d)

结果:
result=.c .h .c

4. $(Basisname NAMEN...)

        Nehmen Sie die Präfixfunktion. Extrahieren Sie den Präfixteil (den Teil vor dem Punkt) jedes Dateinamens aus der Dateinamensequenz „NAMES…“. Die Funktion gibt die Präfixsequenz jeder Datei in der durch Leerzeichen getrennten Dateinamensequenz „NAMES…“ zurück oder ist leer, wenn der Dateiname kein Präfix hat. Wenn „NAMES…“ einen Dateinamen ohne Suffix enthält, wird der Dateiname nicht geändert. Wenn ein Dateiname mehrere Punkte enthält, wird der Teil des Dateinamens vor dem letzten Punkt im Dateinamen zurückgegeben. Beispiele sind wie folgt:

result=$(basename src/a.c include/b.h /home/god/x.a.c jacks)

结果:
result=src/a include/b /home/god/x.a jacks

5. $(addsuffix SUFFIX,NAMES...)

        Suffixfunktion hinzufügen. Fügen Sie jedem Dateinamen in „NAMES…“ das Suffix „SUFFIX“ hinzu. Der Parameter „NAME...“ ist eine durch Leerzeichen getrennte Folge von Dateinamen, wobei „SUFFIX“ an das Ende jedes Dateinamens in der Folge angehängt wird. Die Funktion gibt eine Folge von Dateinamen mit dem Suffix „SUFFIX“ zurück. Beispiele sind wie folgt:

result:=$(addsuffix .c,aaa bbb ccc)

结果:
result=aaa.c bbb.c ccc.c

6. $(addprefix PREFIX,NAMES...)

        Präfixfunktionen. Stellen Sie jedem Dateinamen in „NAMES“ das Präfix „PREFIX“ voran. Der Parameter „NAMES…“ ist eine durch Leerzeichen getrennte Folge von Dateinamen, und „PREFIX“ wird vor jedem Dateinamen in der Folge eingefügt. Die Funktion gibt eine durch ein Leerzeichen getrennte Folge von Dateinamen mit dem Präfix „PREFIX“ zurück. Beispiele sind wie folgt:

result=$(addprefix src/,a.c b.c c.c d.c)

结果:
result=src/a.c src/b.c src/c.c src/d.c

7. $(LISTE1,LISTE2 beitreten)

        Wortverkettungsfunktion. Verketten Sie die Zeichenfolgen der Zeichenfolgenfolge „LISTE1“ und der Zeichenfolge „LISTE2“, hängen Sie die erste Zeichenfolge in „LISTE2“ an die erste Zeichenfolge von „LISTE1“ an, kombinieren Sie sie zu einem Wort und kombinieren Sie „ Die zweite Zeichenfolge in „LIST2“ wird an die zweite Zeichenfolge in „LIST1“ angehängt, um ein einzelnes Wort zu bilden, und so weiter. Die Funktion gibt eine Folge zusammengeführter Zeichenfolgen zurück, die durch einzelne Leerzeichen getrennt sind. Beispiele sind wie folgt:

result=$(join a b c,.c .h)

结果:
result=a.c b.h c

8. $(Platzhaltermuster)

        Rufen Sie die Funktion für den Dateinamen des passenden Musters ab. Die Funktion der Funktion besteht darin, alle Dateinamen im aktuellen Verzeichnis aufzulisten, die dem Musterformat „PATTERN“ entsprechen. Die Funktion gibt durch Leerzeichen getrennte Namen aller im aktuellen Verzeichnis vorhandenen Dateien zurück, die dem Muster „PATTERN“ entsprechen. „PATTERN“ verwendet Platzhalter, die die Shell erkennen kann, einschließlich „?“, „*“ usw.

V. Zusammenfassung

        In diesem Artikel wird hauptsächlich die Verwendung von Make-Funktionen vorgestellt, einschließlich Textverarbeitungsfunktionen und Dateinamenverarbeitungsfunktionen. Zu den Textverarbeitungsfunktionen gehören „subst“, „patsubst“, „strip“, „findstring“, „filter“, „filter-out“, „sort“, „word“, „wordlist“, „words“ und „firstword“. Die Dateinamenverarbeitungsfunktionen sind dir, notdir, suffix, basename, addsuffix, addprefix, join und wildcard.

おすすめ

転載: blog.csdn.net/to_be_better_wen/article/details/130024342