Forum: Compiler & IDEs Makefile: Build aktualisieren, wenn sich das Makefile selbst oder eine Include Datei ändert


von Ex_RundS (Gast)


Lesenswert?

Hallo,

ich kenne mich mit Makefiles noch nicht so gut aus.
Aber meine Frage ist trotzdem ernst gemeint.

Ist es moeglich, dass ich den Build Prozess neu anstossen kann, wenn 
sich NUR das Makefile geaendert hat?

Falls sich das Makefile geaendert hat wuerde ich gerne alle Object Files 
loeschen (also das was clean macht) und alles neu erzeugen.

Im Makefile selbst inkludiere ich eine Config Datei mit
- include config.inc

wenn sich nun config.inc ändert, soll das gleich geschehen, also alle 
Object File weg putzen und alles neu bauen.

Habe schon sowas hier probiert
1
$(MAKEFILE) = Pfad zu Makefile
2
3
all: $(OBJ) $(HEX_OUTPUT) $(MAKEFILE)
Kann mir jemand weiterhelfen??

Wär echt super, danke!!

LG

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du müsstest das Makefile zu jedem relevanten Target als Abhängigkeit
eintragen:
1
all: foo
2
3
CFLAGS += -DFOO='"There"'
4
5
foo: foo.o Makefile
6
        $(CC) $(CFLAGS) -o foo foo.o
7
8
foo.o: foo.c Makefile
9
        $(CC) $(CFLAGS) -c foo.c
10
11
clean:
12
        rm -f foo foo.o

Ist ziemlicher Aufwand.  Gemessen daran, wie selten sich das Makefile
ändert, werden die meisten Leute wohl ein manuelles `make clean'
bevorzugen.

von Ex_RundS (Gast)


Lesenswert?

@Joerg

Danke für deinen Beitrag!!

Aber "alles" neu zu erzeugen, wenn sich das Makefile ändert war sowieso 
keine richtige Anforderung von mir...

Wenn ich irgendwas am Makefile ändere, wird diese Änderung durch den 
Aufruf..

make Makefile, ja sowieso direkt umgesetzt.

Entscheidender ist die Konfigurationsdatei, welche ich im Makefile 
inkludiere... denn hier werden Compilerschalter gesetzt, welche 
grundlegend das zu erzeugende Binary beeinflussen.. z.B. Datenbreit, 
Konstantendefinitionen..

es MUSS also alles neu gebaut werden, wenn etwas an der Include Datei 
geändert wird... aber wie mache ich das am besten?
1
-include config.inc
2
3
CONFIG_FILE = $(BUILD_DIR)\config.inc
4
5
all: $(OBJ) $(CONFIG_FILE)

Die Vorraussetzung OBJ sollte klar sein: Hier werden die object files 
neu erzeugt, falls eines nicht existiert, oder bei einem der Zeitstempel 
älter ist als beim aktuellen..

Bei CONFIG_FILE, soll das so ähnlich sein, bis auf die Tatsache, dass 
das File nicht neu erzeugt werden soll...

Wie mache ich sowas?

geht sowas in der Art wie
1
$(CONFIG_FILE): clean

???

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nein, du musst die Abhängigkeit von der Konfigurationsdatei für
jede Objektdatei, die davon beeinflusst wird, explizit aufführen.

von Ex_RundS (Gast)


Lesenswert?

Hallo Joerg,

also ich muss die Abhaenigkeit des CONFIG Files zu jeder Object Datei 
hinzufuegen?

Ich baue die Object Files aber aus Musterregeln:
1
$(OBJ): %.o: %.c
2
  @$(CC) $(CC_OPTS) $(subst /,\,$<)

Die Musterregel besagt, dass fuer jedes *.o File aus OBJ ein 
gleichnamiges *.c File existiert und dass dies die Vorraussetzung für 
das *.o File ist.

Daraufhin wird der CC (C Compiler) angeworfen und das *.o aus *.c neu 
erzeugt.

Ich muesste das ganze dann so aendern?

(Dein Beispiel)
1
foo: foo.o Makefile
2
        $(CC) $(CFLAGS) -o foo foo.o
3
4
foo.o: foo.c Makefile
5
        $(CC) $(CFLAGS) -c foo.c

foo ist jetzt ein Pseudo Ziel?
Welches als Vorraussetzungen foo.o und Makefile hat... aber ich sehe an 
dieser Regel noch nicht warum foo.o neu erzeugt werden sollte, wenn nur 
Makefile nicht mehr aktuell ist?

Ah, ok.. warte jetzt seh ichs. foo.o selbst ist ja von Makefile abhängig 
und damit ja nicht mehr aktuell und muss neu erzeugt werden.. Ok, jetzt 
sehe ich die Umständlichkeit, die meine Anforderung mit sich bringt..

Aber ginge nicht auch sowas wie:
1
$(OBJ): %.o: %.c $(CONFIG_FILE)
2
  @$(CC) $(CC_OPTS) $(subst /,\,$<)

Also jedes meiner Objectfiles abhaengig vom Config file zu machen?

Danke!!!
Du hast mir schon sehr geholfen.. ich denke ich bin auf der richtigen 
Spur ;-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ex_RundS schrieb:

> also ich muss die Abhaenigkeit des CONFIG Files zu jeder Object Datei
> hinzufuegen?

Ja.  Woher soll make sonst wissen, dass die Objektdateien vom
Makefile (bzw. dessen include) abhängen.

> Ich baue die Object Files aber aus Musterregeln:

Ob man bei GNU make's Musterregeln so eine Abhängigkeit unterbringen
kann, weiß ich nicht so recht.  Bei Standard "inference rules", wie
sie jedes make versteht:
1
.c.o:
2
    $(CC) $(CFLAGS) $<

dürfte es nicht funktionieren.

Allerdings kannst du Abhängigkeitszeilen haben, so viele du willst,
nur die Kommandos für ein Target dürfen jeweils nur einmal
existieren.  Es hindert dich also niemand, irgendwo obige inference
rule stehen zu haben (die sollte in dieser Form ohnehin der Standard
eines jeden make sein, auch wenn man sie nicht hinschreibt) und dann
aber explizite Abhängigkeiten:

foo.o: foo.c config.inc
bar.o: bar.c config.inc
mumble.o: mumble.c config.inc

Ich würde übrigens in Makefiles nie Backslashes schreiben, sondern
immer Vorwärts-Schrägstriche.  Die Win32-Syscalls vertragen diese
ohnehin als Pfadnamentrenner, und dein Makefile ist damit ein wenig
portabler zu einer Unix-Umgebung.  Außerdem kann man bei Unix-
Programmen (wie make nun einmal ist) nie so ganz sicher sein, an
welchen Stellen sie den Backslash vielleicht als Escape benutzen,
sodass "\neuername.c" dann wie "<LF>euername.c" interpretiert wird...

von Ex_RundS (Gast)


Lesenswert?

Danke, das hats gebracht!
Und war gar nicht aufwändig :-)

Man muss nur in die Make Variable VPATH den Pfad zum Makefile eintragen.

Und dann bei der Musterregel $(MAKEFILE), dort wo das Makefile liegt 
ergänzen! That's it :)

Sobald ich nun irgendwas am Makefile ändere, werden alle Objectfiles neu 
gebaut!
1
$(OBJ): %.o: %.c $(MAKEFILE)
2
  @$(CC) $(CC_OPTS) $(subst /,\,$<)

Danke, nochmal Joerg!

Ciao

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.