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).