Я хочу записать (gmake) make-файл для компилятора, который - в отличие от gcc - помещает все выходные файлы в определенный каталог. К сожалению, это поведение не может быть изменено.
Мои источники находятся в нескольких каталогах. Как я пишу правило шаблона, которое позволяет мне скомпилировать источники.
Хорошо, это немного неясно. Вот пример. Моему исходному взгляду может понравиться это:
./folder1/foo.c
./folder2/bar.c
и выходные файлы закончатся как это:
./obj/foo.obj
./obj/bar.obj
Как должен, мое правило скомпилировать мои источники похоже?
%.obj : %.c
$(COMPILER) -c $<
не будет работать.
Какие-либо идеи? Я хотел бы избежать неявного правила для каждого исходного файла...
Извлечено из моего файла Makefile:
OBJS: = $ (sort $ (patsubst% .cpp, $ (OBJECT_DIRECTORY) /%. O, $ (patsubst% .c, $) (OBJECT_DIRECTORY) /%. O, $ (notdir $ (SRCS)))))
Где OBJECT_DIRECTORY
указывает на каталог объекта, а SRCS
- это список исходных файлов ( который вы даже можете заполнить, используя $ (подстановочный знак)
).
Затем в Makefile у меня есть:
define define_compile_rules
$(OBJECT_DIRECTORY)/%.o: $(1)%.c
@echo " + Compiling '$$<'"
@mkdir -p $$(@D)
$(CC) $$(CFLAGS) -o $$@ -c $$<
endef
$(foreach directory,$(sort $(dir $(SRCS))),$(eval $(call define_compile_rules,$(directory))))
См. функцию $ (eval)
.