У меня есть набор файлов .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? Если да, то как?
Благодарим за помощь!
Не будет Gcc жаловаться, если это пытаясь создать '$ (BUILD)/dir1/dir2/file.o' для' dir1/dir2/file.c', поскольку структура каталогов '$ (BUILD)/dir1/dir2' не существует? – Tuxdude
Спасибо, спасибо! (http://www.gnu.org/software/make/manual/make.html#Eval-Function). Я прочитаю об этом больше и посмотрю, смогу ли я это использовать. Я думаю, что это то, что я искал ... способ абстрактного синтаксиса make-файла. Кстати, даже если я не буду пытаться делать то, что я пытался сделать в своей ситуации, я был уверен, что то, что я пытаюсь сделать, было бы, по крайней мере, законным в других ситуациях. Я также начал заглядывать в джема, но мне не нравится тот факт, что никто больше его не поддерживает. – user2125275
Это сработало, кстати. Еще раз спасибо! Мой make-файл кажется довольно загадочным, но, по крайней мере, он служит примером того, что можно сделать в make. – user2125275