Aufgabe 4 SP2

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Aufgabe 4 SP2
Muss es im Makefile
LDFLAGS := -fPIC
oder
LDFLAGS = -fPIC
heißen?

Hab noch nie verstanden für was der Doppelpunkt steht^^


[m]info make | less -p ‘Variable Assignment’[/m]

Eigentlich solltest du [m]LDFLAGS := -fPIC $(LDFLAGS)[/m] verwenden, damit der Nutzer das Flag überschreiben kann.


Variablen, die mit [m]=[/m] deklariert werden, werden möglichst spät expandiert (erst bei der Verwendung der Variable)

Diese Variablen können z.B. [m]$@[/m] im Ersetzungstext enthalten.

Variablen mit [m]:=[/m] werden so früh wie möglich expandiert, also schon bei der Deklaration.

Das ist z.B. hilfreich, wenn man Quelldateien per [m]find[/m] sucht, da dann das Dateisystem nur einmal durchsucht wird:

SOURCE := $(shell find . -name "*.c")

Im Fall von [m]-fPIC[/m] ist das egal.

Siehe auch: Flavors (GNU make)

EDIT:

Dafür bietet sich die Zuweisung mit [m]+=[/m] an, denn das [m]:=[/m] kann unter Umständen kaputt gehen. Also so:

LDFLAGS += -fPIC

[m]+=[/m] erlaubt aber nicht, Flags der Anwendung zu überschreiben, was manchmal ganz praktisch ist.

Wann würde [m]:=[/m] kaputt gehen?


Immer dann, wenn der Ersetzungstext einer Variable Target-abhängige Variablen enthalten, z.B. [m]@[/m], [m][1], [m]$<[/m] etc. Wenn man z.B. ein eigenes Linker-skript pro Binary benötigt (zugegebenermaßen ein konstruiertes Beispiel), kann man das wie folgt lösen:

LDFLAGS = -T $(@:%=%.ld)

In der Realität verwendet man Target-abhängige Variablen z.B. beim generieren von Abhängigkeiten:

DEPGEN =  -MM >$@ -MT "$@ $(@:%.d=%.o)" -MG -MP

Dann darf die Variable [m]DEPGEN[/m] auf keinen Fall mit [m]:=[/m] verwendet werden.


  1. /m ↩︎