KINGx - Das inoffizielle PlayStation Forum & News Portal
[TUT] C/C++,make und depfiles nutzen (auch unter Windows) - Druckversion

+- KINGx - Das inoffizielle PlayStation Forum & News Portal (http://www.kingx.de/forum)
+-- Forum:    PS Vita / PSP (/forumdisplay.php?fid=1)
+--- Forum: Homebrew (/forumdisplay.php?fid=8)
+---- Forum: Development (/forumdisplay.php?fid=34)
+----- Forum: Dev-Tutorials (/forumdisplay.php?fid=59)
+----- Thema: [TUT] C/C++,make und depfiles nutzen (auch unter Windows) (/showthread.php?tid=46559)


[TUT] C/C++,make und depfiles nutzen (auch unter Windows) - ardi - 06.07.2011 23:43

Hallo,

hier geht's nicht um LUA Big Grin sondern um C, C++, make und Makefiles
(wer weiß, was depfiles sind, was sich machen usw. aber wissen will, wie er sie auch unter Windows nutzen kann, kann zum Abschnitt "Der Trick" runterscrollen.

zuerst einmal das Problem:

Nehmen wir an, wir haben eine main.c und eine extra.c und beide includieren (main.h mit #include "main.h").

Jetzt compilieren wir unser Programm. Und alles ist gut.

Jetzt kommen wir auf die Idee, und ändern main.c und main.h.
Jetzt compilieren wir unser Programm. Und nichts ist gut. Die in make und im Makefile eingebauten Regeln (Rules) erkennen, das die main.o älter als die main.c ist und compiliert die main.c erneut.
Aber was ist mit extras.c ??? Die enthält ja immer noch die veraltete main.h.

Die Lösung:

Es müssen also Extra-Rules her, die die Abhängigkeiten definieren. Das würde dann im Makefile so aussehen:

Code:
main.o : main.c main.h
extra.o : extra.c main.h


Jetzt weiß make, dass main.o (links vom Doppelpunkt) von main.c und main.h (rechts vom Doppelpunkt) und extra.o von extra.c und main.h abhängig ist.

Wird nun die main.h geändert, werden beim compilieren jetzt sowohl die mein.c als auch die extra.c neu compiliert.

Aber was ist, wenn main.h selbst eine Datei includiert z.B. test.h?

Auch diese Dateien können den Rules einfach hinzugefügt werden.

Code:
main.o : main.c main.h test.h
extra.o : extra.c main.h test.h


Warum kompliziert wenn es auch einfacher geht?

Je größer das Programm wird und je mehr C-Files und H-Files hinzukommen verliert man schnell den Überblick, welche Dateien von welchen abhängig sind. Zum Glück haben das auch die GCC Entwickler erkannt und haben die Möglichkeit geschaffen, dies Abhängigkeiten automatisch zu erkennen und in entsprechende Dateien (depfiles) zu exportieren.
Diese depfiles sind so aufgebaut, dass sie direkt vom Makefile includiert werden können. Ist das nicht fein?

Das böse Windows/DOS

Windows/DOS user haben aber ein Problem. Die Abhängigkeiten werden in den depfiles häufig mit vollem Pfad geschrieben. In Windows/DOS sieht das dann so aus:

Code:
main.o: main.c c:\pspsdk\psp\sdk\include\pspkernel.h ...

Das Problem hier ist das "c:\...". Da Rules die Zieldatei und die davon Abhängen Dateien mit einem Doppelpunkt verbindet, stört der Doppelpunkt, zwischen Laufwerk und Pfad.
Fazit: Windows user müssen auf depfiles verzichten. Bisher ...!

Der Trick

Mit einem Trick hab ich es nun geschafft auch unter Windows depfiles zu nutzen. Unten findet ihr einen Downloadlink. Darin sind zwei Dateien. Diese kopiert ihr nach [pspsdk]\psp\sdk\lib (dort sollten sich auch die Dateien build.mak und build_prx.mak befinden.

Öffnet dann euer Makefile. Dort findet ihr dies:

Code:
include $(PSPSDK)/lib/build.mak
oder
include $(PSPSDK)/lib/build_prx.mak

und ändert das in:

Code:
include $(PSPSDK)/lib/build_with_deps.mak
oder
include $(PSPSDK)/lib/build_prx_with_deps.mak

... Fertig

Achtung: Die depfiles werden erst erzeugt, wenn die c-files compiliert werden. Also macht erst einmal ein make clean und dann ein make. Erst dann sind die depfiles aktiv.

Download Download

ardi


RE: [TUT] C/C++,make und depfiles nutzen (auch unter Windows) - 3m!n - 21.07.2011 15:39

Hallo,

Super Tutorial !
Bin beeindruckt Big Grin

~Em!nk123