Makefile mit Rekursion

OP #4540884
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?
#4540911
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?
OP #4541260
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>
OP #4542147
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! :-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.