Forum: Mikrocontroller und Digitale Elektronik make zweimal compilieren


von Hans (Gast)


Lesenswert?

Hallo Forum,

ich nutze den GNU make und gcc, aktuell compiliere ich einmal alles 
durch und linke dann. Das funktioniert auch soweit ohne Probleme. Nun 
muss ich um ein nach dem Linken erzeugtes Headerfile mit in das Target 
zu bekommen zwei c-files nochmals compilieren und erneut linken.

Leider geht das irgendwie nicht, ich vermute dass make erkennt dass es 
die zwei files eben erst compiliert hat und die object files noch 
brandaktuell sind, und deshalb dies nicht ausführt. Ich habe auch schon 
versucht automatisiert die object Files zu löschen, leider hat das am 
Ergebnis nichts geändert.

Hat jemand eine Idee wie ich das hinbekommen könnte?

ausschnitt aus meinem makefile:

all : $(TARGET) $(CRCTARGET)

$(TARGET) : $(OBJS)

  $(LINKER) $(LFLAGS) -o $(OBJS_DIR)$(TARGET)
  $(CRC) $(CRCFLAGS) $(OBJS_DIR)$(TARGET).hex
         $(shell calculate.exe)
  $(RM) $(OBJS_DIR_WIN)\htb*.o

$(CRCTARGET) : $(SNDOBJS)
  @echo '!!! CALL LINKER $(OBJS)'
  $(LINKER) $(LFLAGS) -o $(OBJS_DIR)$(SNDTARGET)
  @echo '!!! SUCCESSFULLY BUILDED target: $@'


Wie gesagt, die c-files die hinter $(OBJS) stehen werden compiliert, und 
gelinkt. Danach mache ich meine Berechnugnen und lösche die Objectfiles. 
Jetzt würde ich erwarten dass er die c-files hinter $(SNDOBJS) 
compiliert und dann alles nochmals linkt. Macht er aber nicht, er 
versucht nur direkt zu linken, was natürlich schief geht, da ich die 
object files gelöscht habe.

Gruß

Hans

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Hans schrieb:
> Nun
> muss ich um ein nach dem Linken erzeugtes Headerfile mit in das Target
> zu bekommen zwei c-files nochmals compilieren und erneut linken.

Dazu sollte es doch genügen, das Headerfile in die Abhängigkeitsliste 
der betreffenden C-Sourcefiles einzutragen.

von Karl H. (kbuchegg)


Lesenswert?

Kommt aufs make drauf an.

Ich hab das schon lange nicht mehr gemacht, aber zumindest früher 
arbeitete make so, dass es einmalig den Abhängigkeitsbaum am Anfang 
ausgewertet, überprüft, und sich die Kommandoliste zusammengestellt hat. 
Da war es dann immer schwierig, solche Dinge reinzubekommen.

Aber der grundsätzliche Weg lief meistens so, dass man ein oder mehrere 
'Hilfsziele' für make benutzte.

etwa so
1
zwischen.exe:   $(OBJS)
2
      linker-Kommando
3
      Aufruf des zusätzlichen Tools, welches einen Header generiert
4
5
dummy.c:  original.c  zusätzliches_header_file
6
      Compiler_aufruf
7
8
target.exe:   dummy.o
9
      linker-Kommando

man benutz also ein paar Hilfsfiles um für den make wieder eine linieare 
Sequenz zu erhalten.
Das dummy.c macht dann nichts anderes, als das original.c zu 
inkludieren.
Sein einziger Zweck ist es, ein C-File zu haben, welches vom erzeugten 
Header abhängig ist und erst compiliert werden kann, nachdem das erste 
mal gelinkt wurde. Und erst wenn dieses C-File compiliert wurde, wird 
das endgültige EXE gelinkt.

von Reinhard Kern (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Ich hab das schon lange nicht mehr gemacht, aber zumindest früher
> arbeitete make so, dass es einmalig den Abhängigkeitsbaum am Anfang
> ausgewertet, überprüft, und sich die Kommandoliste zusammengestellt hat.

Hallo,

wäre es da nicht am einfachsten, 2 make files nacheinander aufzurufen? 
Habs auch schon lang nicht mehr gemacht, IDE sei dank.

Gruss Reinhard

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.