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)=PfadzuMakefile
2
3
all:$(OBJ)$(HEX_OUTPUT)$(MAKEFILE)
Kann mir jemand weiterhelfen??
Wär echt super, danke!!
LG
@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
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 ;-)
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...
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!