Forum: Compiler & IDEs makefile - Abhängigkeiten


von jack (Gast)


Lesenswert?

Hallo,
ich beschäftige mich gerade mit dem Schreiben von Makefiles.
1
...
2
initialisierung von OBJ
3
...
4
prog: $(OBJ) makefile
5
  gcc -o prog $(OBJ) $(patsubst %,-I%,$(EXTRAINCDIRS))
6
7
%o: %.c
8
  gcc -c -g $*.c  $(patsubst %,-I%,$(EXTRAINCDIRS))

Damit sage ich make ja dass mein fertiges Binary von allen 
Objekt-Dateien sowie vom makefile selbst abhängig ist.

Die Objekt-Dateien hängen von ihren .c Dateien ab. Nur leider werden 
dadurch Änderungen in Headerdateien nicht berücksichtigt, soweit 
richtig?

Also lasse ich erstmal für jede Source-Datei ein depency-file anlegen:
1
%.dep: %.c %.h
2
  gcc -MM $*.c $(patsubst %,-I%,$(EXTRAINCDIRS)) > $*.dep

Soweit, so gut. Ich erhalte jetzt mehrere Datein mit diesem oder 
ähnlichem Inhalt:
1
subroutine.o: subroutine.c subroutine/subroutine.h

Und jetzt häng ich grad beim Verständnis.

Diese Dateien werden ja mittels -include eingefügt (zumindest bei GNU 
make).
D.h. für make steht da jetzt ein Target (subroutine.o:) das von 
bestimmten Sourcen und Headern abhängt.

Aber wie gebe ich an, wie dieses Target gebaut werden soll?
Vor allem, ich hab ja mehrere depency-files, die müssen ja alle 
irgendwie includiert werden.

Kann mir da jemand weiterhelfen?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

jack schrieb:

> D.h. für make steht da jetzt ein Target (subroutine.o:) das von
> bestimmten Sourcen und Headern abhängt.
>
> Aber wie gebe ich an, wie dieses Target gebaut werden soll?

Hast du doch schon für alle Dateien %o (soll wohl %.o heißen).
1
%.o: %.c
2
  gcc -c -g $^ $(patsubst %,-I%,$(EXTRAINCDIRS))

von jack (Gast)


Lesenswert?

Ok, da ist in der Tat ein Fehler drin.

Wenn ich aber eine Header oder Source Datei ändere wird nichts neu 
gebaut?

von sebastian (Gast)


Lesenswert?

1
%.dep: %.c %.h
Das %.h ist da glaub nicht nötig, oder?

Hast du das schon gelesen?
http://mad-scientist.net/make/autodep.html

von sebastian (Gast)


Lesenswert?

Ich habs übrigens so gemacht, bis jetzt hat es gut funktioniert:
1
CPPFLAGS =  -I$(TOP)include -I. -MMD -MP
2
3
4
# Automatic dependency generation:
5
# Dependency files (*.d) are built as a side effect of compilation (by -MMD).
6
# If a dependency file for an object isn't up to date (or doesn't exist),
7
# this applies to the object file, too (assuming you don't delete dependency files manually).
8
# So it's not necessary to tell make when to build dependency files (no rules with dependency
9
# files as targets and no include directive for not existing dependency files).
10
#
11
# The idea is partly from http://mad-scientist.net/make/autodep.html,
12
# which also explains the use of -MP, but uses difficult to understand sed commands.
13
# Using sed isn't necessary with a gcc that supports -MMD and -MP.
14
-include $(wildcard *.d)

von sebastian (Gast)


Lesenswert?

jack schrieb:
> Wenn ich aber eine Header oder Source Datei ändere wird nichts neu
> gebaut?
Doch sollte eigentlich schon. Das ist ja der Sinn des ganzen.

von jack (Gast)


Lesenswert?

Hallo,
bin übers WE endlich mal dazu gekommen, am makefile weiterzubasteln und 
den verlinkten Artikel zu lesen.
Interessante Lektüre übrigens.

Was ich noch nicht ganz verstehe ist diese "ingenious" Methode die am 
Schluß vorgestellt wird.
Um make daran zu hindern, sich selbst erneut aufzurufen werden bei jedem 
build die Abhängigkeiten für den nächsten build berechnet. Somit muss 
make die .dep Files beim nächsten build nicht neu einlesen.

Aber bedeutet das nicht, dass meine Abhängigkeiten nicht up-to-date 
sind? Was ist, wenn in einer Source seit dem letzten build ein neues 
include dazugekommen ist oder ein .h sich geändert hat? Wird dies dann 
nicht ignoriert?
Kann mir ja jemand nen Denkanstoß geben?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.