2015-07-20 4 views
0

Структура каталогов для примера выглядит примерно так.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 

Кроме того, я не уверен ли я делать зависимостей вещи правильно или нет.

+1

У меня была аналогичная проблема, где я перечислил OUT_DIR как зависимость, чтобы обеспечить это было сделано, прежде чем он пытался компиляции исходного в него. К сожалению, каталог меняется каждый раз, когда файл изменяется, что заставило мою сборку перестроить все, что нужно сделать. Я не вижу, что вы указываете OUT_DIR как зависимость от ваших файлов. – mjr

+3

Вы нарушаете правило 2 [Правила Makefile] (http://make.mad-scientist.net/papers/rules-of-makefiles/). Ваши правила генерируют файлы, которые не соответствуют имени цели. Таким образом ** не может ** знать, что ваши цели обновлены, поскольку, насколько возможно, ваши целевые файлы ** не существуют **. –

+0

Вы посмотрели ваши файлы .d? – mjr

ответ

1

Не зная ваши настройки каталога сборки, его жесткое предоставить Вам точное решение, но мои правила сборки выглядеть примерно так:

MAIN_OBS := $(add_prefix $(OUT_DIR), $(patsubst %.c,%.o,$(wildcard *.c))) 

$(OUT_DIR): 
    mkdir -p $(OUT_DIR) 
    mkdir -p $(OUT_SRC) 
    mkdir -p $(OUT_EXE) 

$(OUT_SRC)/%.o: %.c 
    $(CC) -o [email protected] -MD -MP $(CPPFLAGS) $(CFLAGS) -c $< 

Это становится сложнее, если у вас сложная структура каталогов, потому что вам нужно будет создавать больше каталогов или получать представление о переименовании объекта.

+0

К сожалению, я имею в виду Output/source/main.o. Вы можете прочитать более раннюю структуру каталогов для справки. – Aakash

+0

Каково ваше правило для создания исполняемого файла , – Aakash

0

Огромное спасибо mjr и Etan Reisner. Я просто размещаю здесь окончательный Makefile для учебных целей для других людей.

ОБНОВЛЕНО

EXE :=nextgenrsm 
CC := gcc 
CPPFLAGS := -IHal -IInterrupt_Config 
VPATH := Hal:Interrupt_Config 
OUT_DIR := Output/ 
OUT_SRC := Output/source/ 
OUT_EXE := Output/output/$(EXE) 
LIBS = Hal Interrupt_Config 

MAIN_OBS := $(addprefix $(OUT_SRC), $(patsubst %.c,%.o, $(wildcard *.c))) 
INT_OBS := $(addprefix $(OUT_SRC), $(notdir $(patsubst %.c,%.o,$(wildcard Interrupt_Config/*.c)))) 
HAL_OBS := $(addprefix $(OUT_SRC), $(notdir $(patsubst %.c,%.o,$(wildcard Hal/*.c)))) 
ALL_DEPS := $(patsubst %.o,%.d, $(MAIN_OBS) $(HAL_OBS) $(INT_OBS)) 

ALL_OBS = $(notdir $(MAIN_OBS) $(INT_OBS) $(HAL_OBS))) 

all: $(OUT_DIR) $(OUT_EXE) 

$(OUT_DIR): 
     mkdir -p $(OUT_DIR) 
     mkdir -p $(OUT_DIR)source/ 
     mkdir -p $(OUT_DIR)output/ 

$(OUT_EXE): $(MAIN_OBS) $(HAL_OBS) $(INT_OBS) 
     $(CC) -o [email protected] $(LDFLAGS) $(OUT_SRC)*.o $(LDLIBS) 

$(OUT_SRC)%.o: %.c 
     $(CC) -o [email protected] -MD -MP $(CPPFLAGS) $(CFLAGS) -c $< 

-include $(ALL_DEPS) 

clean: 
     rm -rf $(OUT_DIR) 

.PHONY: all clean 
Смежные вопросы