Это не тривиально, потому что ваши источники находятся в разных каталогах, и простые правила создания шаблонов не могут легко справиться с этим.Но используя немного более продвинутые функции make, может сделать это:
SRC := $(shell find . -type f -name "*.c")
OBJ := $(patsubst %.c,%.o,$(notdir $(SRC)))
.PHONY: all
all: $(OBJ)
define COMPILE_rule
$$(patsubst %.c,%.o,$$(notdir $(1))): $(1)
kos-cc $$(KOS_CFLAGS) -c -o $$@ $$<
endef
$(foreach s,$(SRC),$(eval $(call COMPILE_rule,$(s))))
.PHONY: clean
clean:
rm -f $(OBJ)
Осторожно: у вас может быть несколько исходных файлов с одинаковым базовым именем в разных каталогах.И если это произойдет, вы получите фатальный конфликт имен объектных файлов ...
РЕДАКТИРОВАТЬ (добавить обнаружение конфликтов):
Следующее обнаруживает конфликтные ситуациии выдает ошибку (замените error
на warning
или info
в зависимости от уровня серьезности, который вы назначаете этим конфликтам):
SRC := $(shell find . -type f -name "*.c")
OBJ := $(patsubst %.c,%.o,$(notdir $(SRC)))
ifneq ($(words $(OBJ)),$(words $(sort $(OBJ))))
$(error object file name conflicts detected)
endif
(sort
сортирует, а также удаляет дубликаты и words
возвращает количество разделенных пробелом слов в строковом параметре).