Структура каталогов для примера выглядит примерно так.Makefile всегда перекомпилирует некоторые разделы
Пример - Содержит Makefile, main.c, xyz.c, xyz.h и подкаталоги Хал и Interrupt_Config Хал - Содержит test2.c и test2.h Interrupt_Config - Содержит try.h
EXE := Micro
CC := gcc
CPPFLAGS := -IHal -IInterruptConfig
VPATH := Hal:InterruptConfig
OUT_DIR := Output/
OUT_SRC := Output/source/
OUT_EXE := Output/output
LIBS = Hal InterruptConfig
MAIN_OBS := $(patsubst %.c,%.o,$(wildcard *.c))
INT_OBS := $(patsubst %.c,%.o,$(wildcard InterruptConfig/*.c))
HAL_OBS := $(patsubst %.c,%.o,$(wildcard Hal/*.c))
ALL_DEPS := $(patsubst %.o,%.d,$(MAIN_OBS) $(HAL_OBS) $(INT_OBS))
ALL_OBS := $(MAIN_OBS) $(INT_OBS) $(HAL_OBS)
all: $(OUT_DIR) $(EXE)
$(OUT_DIR):
mkdir -p $(OUT_DIR)
mkdir -p $(OUT_SRC)
mkdir -p $(OUT_EXE)
%.o: %.c
$(CC) -o $(OUT_SRC)[email protected] -MD -MP $(CPPFLAGS) $(CFLAGS) -c $<
$(EXE): $(MAIN_OBS) $(HAL_OBS) $(INT_OBS)
$(CC) -o $(OUT_EXE)[email protected] $(LDFLAGS) $(OUT_SRC)*.o $(LDLIBS)
$(HAL_OBS): %.o: %.c
$(CC) -o $(OUT_SRC)$(notdir [email protected]) -MD -MP $(CPPFLAGS) $(CFLAGS) -c $<
$(INT_OBS): %.o: %.c
$(CC) -o $(OUT_SRC)$(notdir [email protected]) -MD -MP $(CPPFLAGS) $(CFLAGS) -c $<
-include $(ALL_DEPS)
clean:
rm -rf $(OUT_DIR) $(ALL_DEPS)
.PHONY: all clean
Всякий раз, когда я сделать, он успешно создает каталог с именем, как Output с подкаталогами источник, содержащий все объектные файлы и вывода, содержащие исполняемый файл с названием Micro. Первый раз, если я сделать это все построить успешно, но если я сделать снова, я ожидал, что он должен дать макияж - не имеет ничего общего но он строит все кроме$ (OUT_DIR) правила. Я не могу понять, в чем проблема.
повторенная делают - Ожидаемое - ничего
Actual -
gcc -o Output/source/main.o -MD -MP -IHal -IInterrupt_Config -c main.c
gcc -o Output/source/xyz.o -MD -MP -IHal -IInterrupt_Config -c xyz.c
gcc -o Output/source/test2.o -MD -MP -IHal -IInterrupt_Config -c Hal/test2.c
gcc -o Output/output/nextgenrsm Output/source/*.o
Кроме того, я не уверен ли я делать зависимостей вещи правильно или нет.
У меня была аналогичная проблема, где я перечислил OUT_DIR как зависимость, чтобы обеспечить это было сделано, прежде чем он пытался компиляции исходного в него. К сожалению, каталог меняется каждый раз, когда файл изменяется, что заставило мою сборку перестроить все, что нужно сделать. Я не вижу, что вы указываете OUT_DIR как зависимость от ваших файлов. – mjr
Вы нарушаете правило 2 [Правила Makefile] (http://make.mad-scientist.net/papers/rules-of-makefiles/). Ваши правила генерируют файлы, которые не соответствуют имени цели. Таким образом ** не может ** знать, что ваши цели обновлены, поскольку, насколько возможно, ваши целевые файлы ** не существуют **. –
Вы посмотрели ваши файлы .d? – mjr