Мы можем добавить это или-или поведение в список вещей, которые Make должен делать легко, но это не так. Вот способ сделать это, используя «eval» для создания отдельного правила для каждого объекта.
define RULE_template
$(1): $(wildcard $(basename $(1)).[cm])
endef
OBJECTS = foo.o bar.o baz.o
$(foreach obj,$(OBJECTS),$(eval $(call RULE_template,$(obj))))
$(OBJECTS):
$(CC) $< $(C_OPTIONS) -c -o $@
Обратите внимание, что это зависит от исходных файлов, которые уже существовали до запуска Make (foo.c или foo.m, но не оба). Если вы генерируете эти источники на одном шаге, это не сработает.
Вот менее умный, более надежный метод .
CPP_OBJECTS = foo.o bar.o
OBJECTIVE_OBJECTS = baz.o
OBJECTS = $(CPP_OBJECTS) $(OBJECTIVE_OBJECTS)
$(CPP_OBJECTS): %.o: %.c
$(OBJECTIVE_OBJECTS): %.o: %.m
$(OBJECTS):
$(CC) $< $(C_OPTIONS) -c -o $@
РЕДАКТИРОВАТЬ: исправлено назначение объектов, благодаря Джонатан Леффлер.