2010-11-19 3 views
3

У меня есть Makefile, который включает make-файлы из подкаталогов. Однако я хочу включить эти «суб» -мак-файлы на основе выбранной цели.включить файлы, зависящие от цели

Предполагается, что субфайлы определяют разные объектные файлы и в зависимости от этих объектных файлов должен быть создан целевой исполняемый файл.

Предполагая суб-makefile1 устанавливает переменную

 
OBJECTS := foo.o foo1.o 

суб-makefile2 наборы

 
OBJECTS := bar.o bar1.o 

и общие правила будет:

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

Цели являются (например) :

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

В то время как целевой foo должен включать foo makefile, target bar bar-makefile.

Любая идея, как справиться с этой ситуацией?

Спасибо, Christian

ответ

2

Конкретная вещь вы просите - условное включение - трудно в Make. Это можно сделать, но это не изящно.

Существует несколько способов получить эффект, который вы хотите. Вы можете использовать условие для MAKECMDGOALS. Вы могли бы заставить ваш makefile вызывать второй make-файл и передать ему имя используемого подкаталога. Но (не зная больше о ситуации), я думаю, что этот путь является tidiest:

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 

(Вы можете быть умным с именами переменных, как foo_OBJECTS, чтобы сохранить линию или два, но я советую против этого.)

+0

Спасибо за ваш ответ! На самом деле, я не знал, что мне не нужны предпосылки для lib /%. So: rule или на самом деле они пересылаются из правила lib/foo.so :. Также вещь со статическим шаблоном правильна для меня нова. Вы, например, именно то, что я искал. –

2

Beta упомянул $(MAKECMDGOALS), но не описал его:

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

# Rest of Makefile follows... 

Это не такая большая идея, так как это будет работать только тогда, когда make вызывается в интерактивном режиме. Вы можете взломать вокруг этого, делая правила для foo и bar рекурсивно вызывать make:

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 
Смежные вопросы