PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rekursives Makefile - hilfe!?



bL1nK
12.01.2007, 19:00
hi ich hoffe von euch kann mir jemand helfen

hab folgendes anliegen, ich will in einem (master- oder top-level-)makefile mehrere andere makefiles in subdirs zusammenfassen bzw. einmal das master-makefile starten dann händelt der alle in den subdirs ab und zwar die befehle make-all und make-clean.

so sieht etwa die struktur aus:
http://mitglied.lycos.de/l33ch0rn//dir.jpg

die makefiles in den subdirs sind ganz normale files wie sie mfile generiert.

die master-makefile hab ich selbst geschrieben...

MODULES = module1 module2
all:
for dir in $(MODULES); do \
(cd $$dir && ${MAKE} all); \
done
clean:
for dir in $(MODULES); do \
(cd $$dir && ${MAKE} clean); \
done

was ich jetzt schon herausgefunden hab, er übernimmt den parameter 'all' bzw 'clean' nicht . es wir immer der erste befehl in der makefile ausgeführt sprich das all.
d.h. es hat den selben effekt wenn ich folgendes schreiben würde:


for dir in $(MODULES); do \
(cd $$dir && ${MAKE}); \
done

also wieder zur hauptfrage, wie übergebe ich dem makefile das ich im subdir aufrufe das ich zb make clean haben will?

thx ;)

ps: im code müsst ihr euch den TAB immer dazu denken :P

SprinterSB
12.01.2007, 21:05
make target -C dir

http://www.gnu.org/software/make/manual/make.html#Recursion

bL1nK
12.01.2007, 21:15
for dir in $(MODULES); do \
(make clean -C $$dir); \
done

du meinst dann so?[/code]

SprinterSB
12.01.2007, 21:30
Jupp.

Bzw. ${MAKE}. Die () brauchst du jetzt nicht mehr. Ich vermute mal das Problem kommt daher, daß du unter Windows bist? Die andere Variante sollte auch gehen.

bL1nK
12.01.2007, 21:48
boah ne das geht ja gar nicht

clean:
for dir in $(MODULES); do \
make clean -C $$dir; \
done

der hat jetzt meinen rechner zugespämmt also der hängt sich da auf...

ja ich bin unter windows drin.

edit:
kann das sein das es ein problem macht wenn ich das mit winAVR mache

sprich ich mach da mach da immer tools>>make all

SprinterSB
12.01.2007, 22:36
:oops: Die klammern braucht man wohl doch? Was da genau abgeht zwischen sh, mingw, windows, cmd, etc weiß der Teufel... Mit den () geht's auch nicht?

Möglicherweise ist das Problem, da das das ganze in einer shell laufen sollte. Geht denn, wenn du die ganze for-Schleife innerhalb von sh -c 'befehle' oder sh -c "befehle" ausführst?

bL1nK
16.01.2007, 23:46
mh nö nix funktioniert, hab probleme mit der "for X in LIST; do.." irgendwie für er den LOOP-Befehl nicht richtig aus sprich er macht bloss das make aber sonst nix er nimmt derm parameter clean nicht mit

SprinterSB
18.01.2007, 22:29
Bei mit geht's auch nicht. Ich hab mal nen bug report losgeschickt, vielleicht tut sich ja was...

bL1nK
18.01.2007, 22:56
bin ma gespannt ob da was geht, hab schon überall gesucht ob ich vielleicht nen shell fehler in meinem skript hab, aber hab keinen gefunden.

ogni42
19.01.2007, 08:02
Ich hab' gerade nix passendes zur Hand, aber schaut doch mal in die Linux Kernel Sourcen. Die werden mit rekursiven makefiles gebaut.

Wenn ich mich recht entsinne sind die aber so aufgebaut wie im ersten Post (also Liste der subdires nehmen, einzeln in die verzeichnisse wechseln, make aufrufen)

SprinterSB
19.01.2007, 09:25
Das ist nicht das Problem. Unter Linux geht es ja, das Problem ist unter mingw.

bL1nK
19.01.2007, 13:00
das problem ist die parameterübergabe.

sprich er macht nur das MAKE er nimmt keinen paramter mit wie MAKE CLEAN. er ruft sozusagen nur die makefile auf und führt den ersten befehl aus der dem MAKE ALL entspricht. kopiert man in der makefile im unterverzeichnis einen anderen befehl an erste stelle wird dieser ausgeführt.