2016-10-07 20 views
0

我有一個makefile與這些規則。Makefile跳過規則即使文件類型存在

all: $(TARGET) 
OBJECTS = file.o 
    %.o: %.c 
    $(COMPILER) -c $(FLAGS) &< -o C_$(basename [email protected]).o 
    %.o: %.s 
    $(COMPILER) -c $(FLAGS) &< -o S_$(basename [email protected]).o 
... The Linker is then called with *.o to link all the object files 

我在src目錄中具有相同的文件名file.c和file.s。但make只運行對象文件的第一條規則。爲什麼只編譯一次?我怎樣才能make編譯file.c和file.s,如果它們存在於我的src文件夾中的話?

我不想爲不同的擴展名創建不同的目標文件名。那會很愚蠢。

有沒有辦法讓我編譯擴展名爲.s和.c的文件名?

我覺得make很容易做到這一點,我錯過了一些東西。

謝謝你的幫助。如果我不清楚,請告訴我,我會嘗試更深入地解釋它。

回答

0

您誤解了Make是如何工作的。

可能有很多方法來構建目標; Make會使用其中一個,而不是全部。無論如何,你的makefile違反Mad Scientist's rules一個,在你的模式規則不建什麼他們要求建立

%.o: %.c 
    $(COMPILER) -c $(FLAGS) &< -o C_$(basename [email protected]).o 
%.o: %.s 
    $(COMPILER) -c $(FLAGS) &< -o S_$(basename [email protected]).o 

先不建foo.o,它建立C_foo.o;第二個不建立foo.o,它建立S_foo.o。我不知道你的鏈接規則是如何工作的,但是如果它取決於foo.o,那你就麻煩了。

試試這個:

C_%.o: %.c 
    $(COMPILER) -c $(FLAGS) &< -o [email protected] 
S_%.o: %.s 
    $(COMPILER) -c $(FLAGS) &< -o [email protected] 

然後給你的鏈接規則的任何先決條件,你認爲它應該有。如果您希望它同時使用C_foo.oS_foo.o(這聽起來不是一個好主意),然後將它們都放入先決條件列表中。

+0

是否規則#4?我想我可以有一個單獨的filename.o爲每個文件。它只是讓我的makefile難以置信地龐大而難以維護。無論如何強制makefile使用所有可用規則構建目標? –

+0

@Bradleybare:我不知道什麼*「每個文件都有一個單獨的filename.o」*表示。你在說什麼目標?你爲什麼要讓Make用一個規則構建'foo.o',然後用另一個規則覆蓋它? – Beta

+0

我不知道。我只有一個名爲DMA2D.c和DMA2D.s的文件,因爲我可以在asm中編寫寄存器規則,但在c中編寫更高級別的東西。我希望能夠將它們都稱爲DMA2D,但具有不同的擴展名。由單獨的filename.o我的意思是DMA2D_S.o和DMA2D_C.o。 –