Forum: PC-Programmierung make: Abhängigkeiten unter Windows


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,
ich bin gerade dabei, mich in make einzuarbeiten, um unter Windows 
Projekte mit MinGW64 und ARM-GCC zu bauen. Im GNU Make Manual wird auf 
Seite 41 zur Auflösung der Abhängigkeiten folgendes vorgeschlagen:
1
%.d: %.c
2
    @set -e; rm -f $@; \
3
    $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
4
    sed ’s,\($*\)\.o[ :]*,\1.o $@ : ,g’ < $@.$$$$ > $@; \
5
    rm -f $@.$$$$
erzeugt Dateien, die die Abhängigkeit jeder .c-Datei beschreibt. Das 
kann in meiner Windows-Konsole naturgemäß nicht funktionieren ($$ gibt 
im Windows-CLI keine Prozeß-ID zurück und sed existiert unter Windows 
auch nicht).

Welchen Weg geht man zur Auflösung der Abhängigkeiten unter Windows?

Viele Grüße
W.T.

von P. M. (o-o)


Lesenswert?

GCC und wohl viele andere Compiler kennen noch eine Option namens -mm 
oder -MM, um Header-Abhängigkeiten zu erfassen. Gibt eine simple Datei 
aus für jede Abhängigkeit.

Ich mache das dann etwa so:
1
-include $(OBJS:.o=.cpp.dependency)
2
3
%.o:%.cpp
4
  $(CPP_COMPILER) -c $< $(CPP_FLAGS)
5
  $(CPP_COMPILER) -MM $< $(CPP_FLAGS) > $<.dependency

von Schaulus Tiger (Gast)


Lesenswert?

Walter Tarpan schrieb:

> $$ gibt im Windows-CLI keine Prozeß-ID zurück

braucht man denn unbedingt eine temporäre Datei? Man könnte doch eine 
Pipe zwischen Compiler und sed schrauben, etwa so:
1
%.d: %.c
2
    @set -e; rm -f $@; \
3
    $(CC) -M $(CPPFLAGS) $< | \
4
    sed ’s,\($*\)\.o[ :]*,\1.o $@ : ,g’ > $@

> sed existiert unter Windows auch nicht

unter Windows nicht, aber doch unter MinGW?
http://sourceforge.net/projects/mingw/files/MSYS/Base/sed/

von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,
danke für die Antworten. Ich habe beides mal ausprobiert, und es 
funktioniert beides ähnlich gut:

P. M. schrieb:
> GCC und wohl viele andere Compiler kennen noch eine Option namens -mm
> oder -MM, um Header-Abhängigkeiten zu erfassen.

Die Compiler-Option "-MM" ist insofern angenehm, als daß sie nur 
Abhängigkeiten innerhalb des eigenen Codes/außerhalb der beim Compiler 
mitgelieferten Headerdateien liefert.

Schaulus Tiger schrieb:
> Man könnte doch eine
> Pipe zwischen Compiler und sed schrauben,

Und die Pipe ist natürlich die einfachste Möglichkeit, sed die Daten zu 
schicken. Es wundert mich eigentlich, daß die Buchautoren es nicht so 
gemacht haben.

Schaulus Tiger schrieb:
> unter Windows nicht, aber doch unter MinGW?

Es scheint nicht bei jeder MinGW-Version dabeizuliegen und muß wenn auch 
extra im Paketmanager ausgewählt werden (Teil von MSYS). Danke für den 
Tipp - ich habe mehr nach einem Alternativprogramm für Windows gesucht 
als nach Installationsoptionen von MinGW. Netter Nebeneffekt: Ich habe 
auch wieder grep unter Windows.

Viele Dank und frohes neues Jahr
W.T.

von Sebastian (Gast)


Lesenswert?

gcc hat noch viel mehr Optionen. Guck mal ins Handbuch...

Ich benutze die:
1
-MMD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$@"

und zwar ohne extra Aufruf von gcc, die .d Datei fällt einfach beim 
normalen Compilieren mit ab.

Die Fehlermeldungsunterdrückung beim include kann auch wegfallen, wenn 
man es einfach so macht:
1
include $(wildcard *.d)
Das reicht, weil man .d Dateien, die es noch nicht gibt, auch nicht 
braucht. Da gibt es nämlich auch die dazugehörende .o Datei noch nicht, 
also wird sie eh gebaut.

Das komplizierte Beispiel mit sed, aus dem make Handbuch, braucht man 
nur bei älteren Compiliern, die die komfortableren Optionen noch nicht 
haben.

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.