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