2010-11-19 7 views
3

Ich habe ein Makefile, das Makefiles aus Unterverzeichnissen enthält. Allerdings möchte ich diese "Sub" -Makefiles auf der Basis eines ausgewählten Ziels enthalten.Include-Dateien abhängig von Ziel

Hintergrund ist, dass die Sub-Makefiles verschiedene Objektdateien definieren und abhängig von diesen Objektdateien die Ziel-Executable erstellt werden soll.

Unter makefile1 setzt würde die Variable

 
OBJECTS := foo.o foo1.o 

Unter makefile2 setzt

 
OBJECTS := bar.o bar1.o 

Und die allgemeine Regel sein Angenommen:

 
lib/%.so: $(OBJECTS) 
    link $^ -o [email protected] 

Die Ziele sind (zum Beispiel) :

 
foo: lib/foo.so 
 
bar: lib/bar.so 

während target foo das foo makefile enthalten sollte, targe bar das bar-makefile.

Irgendeine Idee, wie man mit dieser Situation umgeht?

Danke, Christian

Antwort

2

Die spezifische Sache Sie für Fragen - bedingte Aufnahme - ist in Make schwierig. Es kann gemacht werden, aber es ist nicht elegant.

Es gibt mehrere Möglichkeiten, den gewünschten Effekt zu erzielen. Sie könnten eine Bedingung für MAKECMDGOALS verwenden. Sie könnten Ihr Makefile veranlassen, ein zweites Makefile aufzurufen und ihm den Namen des zu verwendenden Unterverzeichnisses zu übergeben. Aber (ohne mehr über die Situation zu wissen) Ich denke, auf diese Weise die sauberste ist:

include sub-makefile1 
FOO_OBJECTS := $(OBJECTS) 

include sub-makefile2 
BAR_OBJECTS := $(OBJECTS) 

lib/%.so: 
    link $^ -o [email protected] 

lib/foo.so: $(FOO_OBJECTS) 

lib/bar.so: $(BAR_OBJECTS) 

foo bar : % : lib/%.so 

(Sie könnten mit Variablennamen wie foo_OBJECTS klug sein, eine Linie zu speichern, oder zwei, aber ich rate dagegen.)

+0

Vielen Dank für Ihre Antwort! Eigentlich war mir nicht bewusst, dass ich die Voraussetzungen für die lib /% .so: -Regel nicht benötige oder dass sie tatsächlich von der lib/foo.so: -Regel weitergeleitet werden. Auch die Sache mit der statischen Musterregel ist neu für mich. Ihr Beispiel ist genau das, wonach ich gesucht habe. –

2

Beta hat die $(MAKECMDGOALS) erwähnt, aber es ist nicht beschrieben:

ifeq ($(MAKECMDGOALS),foo) 
include sub-makefile1 
endif 
ifeq ($(MAKECMDGOALS),bar) 
include sub-makefile2 
endif 

# Rest of Makefile follows... 

das ist nicht so eine gute Idee, da es nur funktioniert, wenn make interaktiv aufgerufen wird. Sie können für foo indem sie Regeln, um dieses hacken und bar die rekursiv make aufrufen:

ifeq ($(MAKECMDGOALS),foo) 
include sub-makefile1 
foo: # ... 
    # Normal commands to build foo 
else 
foo: 
    $(MAKE) $< 
endif 

ifeq ($(MAKECMDGOALS),bar) 
include sub-makefile2 
bar: # ... 
    # Normal commands to build bar 
else 
bar: 
    $(MAKE) $< 
endif 
Verwandte Themen