Рассмотрим следующий make-файл:
.SUFFIXES:
SRC:=../Src
OBJ:=../Obj
# Sources
SOURCES := $(SRC)/App/a.c $(SRC)/App/b.c $(SRC)/App/c.c
HEADERS := $(wildcard $(SRC)/App/*.h)
# Directories
INC_DIRS := $(SRC)/App
OBJ_INC_DIRS := $(INC_DIRS:$(SRC)/%=$(OBJ)/%)
# Objects
OBJECTS := $(SOURCES:$(SRC)%=$(OBJ)%.obj)
# Dependencies
DEPS := $(SOURCES:$(SRC)%.c=$(OBJ)%.d)
-include $(DEPS)
GCC_INCLUDES := $(foreach directory, $(INC_DIRS), -I$(directory))
all: target
target: $(OBJECTS)
touch target
#Objects
$(OBJ)%.c.obj: $(SRC)%.c
@echo Compiling $@
@touch $@
# Dependencies
$(OBJ)%.d: $(SRC)%.c
@echo Checking dependencies for $<
@gcc -MM $< $(GCC_INCLUDES) -MT '$(patsubst %.d,%.c.obj,$@)' -MT '$@' -MF '$@'
@[ ! -s $@ ] && rm -f $@
# Creating directory tree before checking dependencies
$(DEPS):|$(OBJ_INC_DIRS)
$(OBJ_INC_DIRS):
@mkdir $@
clean:
echo clean
@rm $(OBJ_INC_DIRS)
При запуске в первый раз, я получаю:
Checking dependencies for ../Src/App/a.c
Checking dependencies for ../Src/App/b.c
Checking dependencies for ../Src/App/c.c
clean
Compiling ../Obj/App/a.c.obj
Compiling ../Obj/App/b.c.obj
Compiling ../Obj/App/c.c.obj
touch target
Все нормально, но теперь, сделайте снова (без изменения какого-либо файла):
make: `../Obj/App/a.c.obj' is up to date.
Теперь, если я изменю файл ac
Checking dependencies for ../Src/App/a.c
Compiling ../Obj/App/a.c.obj
target
не переделан!
Как будто мой файл ac является целью, но это не так.t ... Может кто-нибудь объяснить мне, что здесь не так?
Если я уберу включение из DEPS, я наблюдаю ожидаемое поведение ...
Спасибо
РЕДАКТИРОВАТЬ
Поместив include в конце, как упомянуто @Beta works, но теперь я добавил чистую цель и покажу результат ...