2014-05-16 5 views
9

Ich habe ein Setup wie folgt aus:Wie übergebe ich den Zielnamen zur Liste der Sub-Makefiles?

/Makefile 
/foo/Makefile 
/foo/bar/Makefile 
/foo/baz/Makefile 

Die Top-Level Makefile enthält eine Aufgabe, die die /foo/Makefile aufruft. Dieses Makefiles erstellt eine Liste von Makefiles in den Unterverzeichnissen (bar, baz in dem Beispiel). Für jede subdir, ruft es die Makefiles:

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

, die für, sagen wir, die all Aufgabe in Ordnung ist. Aber wenn ich etwas anderes machen will, bleibe ich stecken. Gibt es eine Möglichkeit, das Ziel an die Liste der Sub-Makefiles zu übergeben? Zum Beispiel:

$(SUB_DIRS): 
    $(MAKE) -C [email protected] <task> 

clean: $(SUB_DIRS)-clean # or something? 

Oder ist mein ganzes Konzept falsch?

+0

Ich habe Dinge wie das getan, aber ich bin auch in anderen Lösungen für dieses Problem interessiert – UpAndAdam

+0

Sie hätte "solche Dinge nicht machen können", da es keine Lösung gibt. Mein Beispiel funktioniert überhaupt nicht. – musicmatze

+0

Welche Version von make verwenden Sie, ich mache genau das – UpAndAdam

Antwort

7

Sie einfach könnte die $(MAKECMDGOALS) Variable verwenden.

Make wird die spezielle Variable MAKECMDGOALS auf die Liste der Ziele setzen, die Sie in der Befehlszeile angegeben haben. Wenn in der Befehlszeile keine Ziele angegeben wurden, ist diese Variable leer.

$(SUB_DIRS): 
    $(MAKE) -C [email protected] $(MAKECMDGOALS) 

Sie können auch die $(foreach) Funktion wie folgt verwendet werden:

clean: 
    $(foreach DIR, $(SUB_DIRS), $(MAKE) -C $(DIR) [email protected];) 
+1

Für den Rekord: Dies (die "MAKECMDGOALS" one) ist die sauberste Lösung. Meine Lösung funktioniert auch. Der 'foreach'-Ansatz funktioniert, aber wenn Sie' make -j4' machen wollen (zum Beispiel), wird der 'foreach'-Ansatz nicht skaliert, denke ich. – musicmatze

0

Ja, Sie tun es einfach wie angegeben, kommt der Spaß in der Handhabung auf der nächsten Ebene, wenn Sie sowohl etwas tun möchten und möglicherweise auch wieder rekursiv.

zum Beispiel habe ich eine rekursive Installation wie folgt aus:

$(INSTALL_DIRS): 
    $(MAKE) -C [email protected] install 
+0

Dies löst mein Problem überhaupt nicht. – musicmatze

2

ich es funktioniert endlich. Der Ansatz ist:

SUB_DIRS  = $(wildcard */.) 
SUB_DIRS_ALL = $(SUB_DIRS:%=all-%) 
SUB_DIRS_TEST = $(SUB_DIRS:%=test-%) 
SUB_DIRS_CLEAN = $(SUB_DIRS:%=clean-%) 

# 
# Standard task 
# 
all: $(SUB_DIRS_ALL) 

test_uml: $(SUB_DIRS_TEST) 

clean: $(SUB_DIRS_CLEAN) 

$(SUB_DIRS_ALL): 
     @$(MAKE) $(MAKE_FLAGS) -C $(@:all-%=%) 

$(SUB_DIRS_TEST): 
     @$(MAKE) $(MAKE_FLAGS) -C $(@:test-%=%) test 

$(SUB_DIRS_CLEAN): 
     @$(MAKE) $(MAKE_FLAGS) -C $(@:clean-%=%) clean 

ich diese Lösung hier gefunden: http://lackof.org/taggart/hacking/make-example/

+1

Und das ist im Grunde das gleiche, was ich gepostet habe, nur extrapoliert weiter für, wenn Sie nicht den Verzeichnisnamen selbst verwenden können. (Sie müssen es mit einem Präfix/Suffix versehen und dann das Präfix/Suffix zur Ausführungszeit entfernen). Ich mache oft fast genau so, wie du es beschrieben hast, und wollte es nicht wörtlich schreiben, weil ich gehofft hatte, dass jemand etwas wie MAKECMDGOALS, das ich noch nicht entdeckt hatte, präsentieren würde und ich den Wert nicht persönlich gesehen habe es über das hinaus, was ich bereits beschrieben hatte. – UpAndAdam

Verwandte Themen