2016-04-30 10 views
0

ich eine Reihe von Unterverzeichnissen habe, mit Makefiles nach innen, und ich möchte einen „Master“ Makefile, die im Grunde Makefiles in diesen Verzeichnissen rufen:Makefile: Versand dynamisch an anderen Makefiles

Makefile 
foo/Makefile 
bar/Makefile 

Damit make foo in root eingeben Verzeichnis entspricht cd foo && make. Ich kann einfache Makefile schreibe dies acieve:

foo: 
    cd foo && make 

bar: 
    cd bar && make 

Aber ich will nicht diese Unterverzeichnisse auflisten, so kann ich neues Verzeichnis mit Makefile hinzufügen, ohne „Master“ Makefile zu ändern.

Antwort

1

Ich denke, make ist wahrscheinlich nicht das beste Werkzeug für dieses spezielle Problem. Warum nicht ein Shell-Skript?

#!/bin/sh 
cd $1 && make 

Wenn Sie wirklich entschlossen sind, es zu tun mit nur make Sie eine Make-Datei wie diese verwenden:

DIRS=$(patsubst %/,%,$(wildcard */)) 
.PHONY: $(DIRS) 
$(DIRS): 
    @cd [email protected] && $(MAKE) 
+0

In Ihrem zweiten Beispiel benötigen Sie eine 'all: $ (DIRS)' oder ähnliches vor der DIRS-Regel, sonst wird nur die erste erstellt. – MadScientist

+0

@MadScientist die Frage speziell nach einem Weg gefragt, 'make foo' etwas zu tun. Es gab keine Notwendigkeit für ein Standardverhalten von "Build alles, wenn ich nur' make' "eingeben. Wenn überhaupt, könnte es sinnvoller sein, die Liste der verfügbaren Verzeichnisse ohne Angabe von Gründen zu erstellen. –

+0

'make -j16 proj1 proj2' ist Grund genug, Shell-Skripte zu meiden. – bobbogo

0

Ich denke, was Sie wollen so etwas wie dieses:

subdirs := $(shell find * -name Makefile | sed /\/Makefile$//) 

$(subdirs): 
    $(MAKE) -C [email protected] 

Ein paar schnelle Punkte:

  • sollten Sie make nicht direkt aus einem Makefile aufrufen. Verwenden Sie stattdessen $(MAKE).
  • $(MAKE) -C dir macht das Gleiche wie cd dir && make
  • wenn Ihr Makefiles sind garantiert genau eine Ebene sein, nach unten verwenden ls */Makefile statt find * -name Makefile. Die veröffentlichte Lösung findet alle Makefiles in Unterverzeichnissen, die möglicherweise nicht Ihren Vorstellungen entsprechen.
  • Sie sollten darauf achten, dass einer der Unterverzeichnisnamen nicht mit anderen Zielnamen im Hauptmakefile in Konflikt steht. Dazu wäre eine Art Verzeichnisbenennungs-/Zielnamenskonvention erforderlich.
+0

Gleicher Kommentar wie oben, über ein 'all' Ziel. – MadScientist