2015-07-20 63 views
0

Example的目錄結構就像這樣。Makefile總是重新編譯一些章節

實施例 - 包含生成文件,main.c中,xyz.c,xyz.h和子目錄Hal和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 

每當我做,它成功地創建了一個稱爲輸出與子目錄包含所有目標文件和輸出含有名爲一個可執行源目錄。第一次,如果我使用它成功地創造一切條件,但如果我這樣做使再次,我希望它應該給化妝 - 無關但它建立的一切除了$(OUT_DIR)規則。我無法弄清楚有什麼問題。

反覆化妝 - 預計 - 沒有

實際 -

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

您違反了[Makefiles規則]的規則2(http://make.mad-scientist.net/papers/rules-of-makefiles/)。您的規則會生成與目標名稱不匹配的文件。因爲這樣做**不能**知道你的目標是最新的,因爲它可以告訴你的目標文件**不存在**。 –

+0

你看過你的.d文件嗎? – mjr

回答

1

不知道你的build目錄設置,它很難給你一個確切的解決方案,但我的生成規則是這個樣子:

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

對不起,我的意思是輸出/源/ 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