2013-03-01 2 views
4

У меня есть набор файлов .cpp, которые я хочу скомпилировать. Эти .cpp-файлы находятся в иерархической структуре каталогов. Я хочу, чтобы соответствующие файлы .o все попадали в одну папку сборки.Makefile Динамические правила w/No GNU-make Шаблон

Вот как я получаю GNU сделать, чтобы перечислить файлы ...

SRCS = \ 
    $(wildcard $(CODE)/**/*.cpp) \ 
    $(wildcard $(CODE)/AlgebraLibraries/**/*.cpp) \ 
    $(wildcard $(CODE)/Calculator/Environments/**/*.cpp) 

BARE_SRCS = $(notdir $(SRCS)) 
BARE_OBJS = $(BARE_SRCS:.cpp=.o) 
OBJS = $(addprefix $(BUILD)/, $(BARE_OBJS)) 

Сделав это, я понятия не имею, как создать правила, которые будут создавать .o файлы из файлов .cpp. Интуитивно, что я хочу сделать, это следующий psuedo-код.

for i=0, N do # <-- a for-loop! 
    $(OBJS)[i]: $(SRCS)[i] # <-- the rule! 
    $(CPP) -c $(SRCS)[i] -o $(OBJS)[i] # <-- the recipe 
end 

Конечно, это не действует GNU сделать код, но я надеюсь, вы понимаете, что именно здесь, что я пытаюсь сделать. Следующие не будут работать.

%.o: %.cpp 
    $(CPP) -c $< -o [email protected] 

Это не работает, потому что GNU сделать сопрягает вверх знаки%, предполагая, что .o файлы живут вместе бок в .cpp файлы.

Альтернатива всем этим, о которой я знаю, будет работать, но будет крайне утомительной, заключается в том, чтобы перечислять все правила вручную как явные правила. Это отстало! Там должен быть лучший путь.

Я изучаю способность GNU make генерировать правила, но, похоже, нет возможности сделать это без встроенной логики. Было бы очень приятно, если бы я мог использовать некоторые операторы управления потоком, чтобы генерировать правила, которые я хочу сделать. Это слишком многого требует GNU-make?

В любом случае, есть ли способ сделать то, что я пытаюсь сделать с GNU make? Если да, то как?

Благодарим за помощь!

ответ

11

Это выглядит как работа для ... нескольких продвинутых трюков Марки:

all: $(OBJS) 

define ruletemp 
$(patsubst %.cpp, $(BUILD)/%.o, $(notdir $(1))): $(1) 
    $$(CPP) -c $$< -o [email protected] 
endef 

$(foreach src,$(SRCS),$(eval $(call ruletemp, $(src)))) 
+0

Не будет Gcc жаловаться, если это пытаясь создать '$ (BUILD)/dir1/dir2/file.o' для' dir1/dir2/file.c', поскольку структура каталогов '$ (BUILD)/dir1/dir2' не существует? – Tuxdude

+1

Спасибо, спасибо! (http://www.gnu.org/software/make/manual/make.html#Eval-Function). Я прочитаю об этом больше и посмотрю, смогу ли я это использовать. Я думаю, что это то, что я искал ... способ абстрактного синтаксиса make-файла. Кстати, даже если я не буду пытаться делать то, что я пытался сделать в своей ситуации, я был уверен, что то, что я пытаюсь сделать, было бы, по крайней мере, законным в других ситуациях. Я также начал заглядывать в джема, но мне не нравится тот факт, что никто больше его не поддерживает. – user2125275

+0

Это сработало, кстати. Еще раз спасибо! Мой make-файл кажется довольно загадочным, но, по крайней мере, он служит примером того, что можно сделать в make. – user2125275

Смежные вопросы