Forum: PC Hard- und Software Makefile mit Rekursion


von Tobias P. (hubertus)


Lesenswert?

Hallo allerseits
ich möchte ein Makefile schreiben, welches sowohl unter Linux als auch 
unter Windows gleich funktionert. Bisher habe ich für mein Problem nur 
eine zufriedenstellende Linux-Lösung.

Und zwar liegen in mehreren Unterordnern kleinere Teilprojekte, welche 
auch ihrerseits wieder ein Makefile besitzen. Das "Haupt"-Makefile, 
welches ich nun schreiben möchte, soll alle Unterordner traversieren und 
dort das jeweilige Makefile aufrufen. Sodass ich nur an einer Stelle ein 
make aufrufen muss.

Unter Linux funktioniert folgendes:
1
DIRECTORY = $(shell find ./* -maxdepth 1 -type d)
2
3
all:
4
  @for dir in $(DIRECTORY); do $(MAKE) -C $$dir; done
unter Windows natürlich wieder mal nicht, weil find dort anders ist. 
Selbst mit GnuWin32 oder den UnxUtils, welche find nachbilden, geht es 
nicht, da die Befehlssyntax einfach anders ist als unter Linux.

Wie macht man mit make eine portable Rekursion?

von Daniel A. (daniel-a)


Lesenswert?

Das find erscheint mir hier sowiso nicht besonders sinnvoll. Keine 
ahnung, ob Windows damit klarkommt:
1
DIRECTORY=./*/*/
2
3
all:
4
  for dir in $(DIRECTORY); \
5
    do $(MAKE) -C "$$dir"; \
6
  done

PS: Von welchem make reden wir hier eigentlich MinGW, Cygwin, Visual 
Studio, sonstwas?

von Tobias P. (hubertus)


Lesenswert?

Hallo,

es geht um GNU make. Danke erstmal für deinen Ansatz, ich werd das 
nachher mal so probieren.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Tobias P. schrieb:
> es geht um GNU make.

Dann kannst du's ja mit was in gmake eingebautem statt dem Aufruf von 
find probieren. Vielleicht sowas:
1
SUBDIRS := $(sort $(dir $(wildcard */*)))

von Tobias P. (hubertus)


Lesenswert?

Hallo Rolf,

danke. Die Liste funktioniert und kommt schon mal richtig raus. Aber ein 
foreach-Loop klappt damit dann nicht. Was ich machen möchte:
ich will ein
1
cd
 in jeden Unterordner und dann dort make aufrufen. Also eigentlich:

foreach <unterordner>
$(MAKE) -C <unterordner>

von Daniel A. (daniel-a)


Lesenswert?

Gibt es denn eine Fehlermeldung oder wie äussert sich dieses 
nicht-funktionieren?

von Rolf M. (rmagnus)


Lesenswert?

Versuch's mal damit:
1
SUBDIRS := $(sort $(dir $(wildcard */*)))
2
3
.PHONY: all $(SUBDIRS)
4
5
all: $(SUBDIRS)
6
7
$(SUBDIRS): ; $(MAKE) -C $@

: Bearbeitet durch User
von Tobias P. (hubertus)


Lesenswert?

Hallo Rolf

DANKE! So funktioniert es wunderbar :-)))) bin noch am Überlegen, wie es 
mit dem make clean klappen könnte.

Danke!

von Tobias P. (hubertus)


Lesenswert?

Nachtrag:

ich habe es herausgefunden wie es geht!
1
SUBDIRS := $(sort $(dir $(wildcard */*)))
2
3
.PHONY: all $(SUBDIRS) clean
4
5
all: $(SUBDIRS)
6
  pdflatex --interaction=nonstopmode --synctex=-1 --shell-escape test.tex
7
8
$(SUBDIRS):  ; $(MAKE) -C $@ $(MAKECMDGOALS)
9
10
clean: $(SUBDIRS)
11
  -@rm -rf *-gnuplottex-fig*.*
12
  -@rm -rf *.aux *.log *.lof *.bak *.loa *.log *.lot *.bbl *.blg *.dvi *.out *.brf
13
  -@rm -rf *.thm *.toc *.idx *.ilg *.ind *eps-converted-to.pdf *.gnuplot *.tps
14
  -@rm -rf *-gnuplottex-fig*.* *temp*.dat *.nav *.snm *.vrb *.lol *.tmp
15
  -@rm -rf gnuplottex *.synctex *.synctex.gz *.xwm

Ein Makefile mit dieser Syntax führt auch ein rekursives clean durch. 
Top, Danke an Rolf Magnus! :-)

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.