www.mikrocontroller.net

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


Autor: Ex_RundS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
$(MAKEFILE) = Pfad zu Makefile

all: $(OBJ) $(HEX_OUTPUT) $(MAKEFILE)
Kann mir jemand weiterhelfen??

Wär echt super, danke!!

LG

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du müsstest das Makefile zu jedem relevanten Target als Abhängigkeit
eintragen:
all: foo

CFLAGS += -DFOO='"There"'

foo: foo.o Makefile
        $(CC) $(CFLAGS) -o foo foo.o

foo.o: foo.c Makefile
        $(CC) $(CFLAGS) -c foo.c

clean:
        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.

Autor: Ex_RundS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

-include config.inc

CONFIG_FILE = $(BUILD_DIR)\config.inc

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
$(CONFIG_FILE): clean

???

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Ex_RundS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Joerg,

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

Ich baue die Object Files aber aus Musterregeln:
$(OBJ): %.o: %.c
  @$(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)
foo: foo.o Makefile
        $(CC) $(CFLAGS) -o foo foo.o

foo.o: foo.c Makefile
        $(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:
$(OBJ): %.o: %.c $(CONFIG_FILE)
  @$(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 ;-)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
.c.o:
    $(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...

Autor: Ex_RundS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!
$(OBJ): %.o: %.c $(MAKEFILE)
  @$(CC) $(CC_OPTS) $(subst /,\,$<)

Danke, nochmal Joerg!

Ciao

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.