2011-12-29 78 views
4

我不知道......Make和增量構建

當您進行更改爲file1.cfile2.cfile1.h,下面的Makefile重新編譯真實必要的東西(這是好的)

# Link to executable 
result: file1.o file2.o 
    gcc file1.o file2.o -o result23 

# Assemble to .o object files 
file1.o: file1.s 
    gcc -c dist/file1.s 

file2.o: file2.s 
    gcc -c dist/file2.s 

# Compile to .s assembly files 
file1.s: file1.c 
    gcc -S file1.c 

file2.s: file2.c 
    gcc -S file2.c 

當我將構建的對象移動到另一個目錄,但是,無論是否僅更改了一個文件的內容,所有內容都會隨時重建。

# Link to executable 
result: file1.o file2.o 
    gcc file1.o file2.o -o result23 

# Assemble to .o object files 
file1.o: file1.s 
    gcc -c dist/file1.s 
    mv file1.o dist 

file2.o: file2.s 
    gcc -c dist/file2.s 
    mv file2.o dist 

# Compile to .s assembly files 
file1.s: file1.c 
    gcc -S file1.c 
    mv file1.s dist 

file2.s: file2.c 
    gcc -S file2.c 
    mv file2.s dist 

看來,這種情況正在發生,因爲make不知道在哪裏.o文件是在它的環境。

有了這個幾個問題:

  • 可以使訪問的環境變量?如果是這樣,你能舉一個例子嗎?
  • 當分發目錄與當前目錄不同時,是否可以使增量構建知道?

回答

5

要解決你的構建就需要做這樣的事情:

# Link to executable 
result: dist/file1.o dist/file2.o 
    gcc dist/file1.o dist/file2.o -o result 

# Assemble to .o object files in main directory 
dist/file1.o: dist/file1.s 
    gcc -c dist/file1.s -o dist/file1.o 

dist/file2.o: dist/file2.s 
    gcc -c dist/file2.s -o dist/file2.o 

# Compile to .s assembly files 
dist/file1.s: file1.c 
    gcc -S file1.c -o dist/file1.s 

dist/file2.s: file2.c 
    gcc -S file2.c -o dist/file2.s 

可以肯定在利用環境變量太..雖然我不知道如何,涉及到的核心您問題:只要使用這樣的事情,設置BUILDDIR和OBJDIR和有這樣的生成文件:

$(BUILDDIR)/foo : $(OBJDIR)/bar.o 
    g++ $(OBJDIR)/bar.o -o $(BUILDDIR)/foo 

雖然可以讓這個(和我的固定的makefile太)使用automatic variables更好:

$(BUILDDIR)/foo : $(OBJDIR)/bar.o 
    g++ $? -o [email protected] 
+0

我認爲你的答案就好。儘管上述makefile的90%是多餘的,並且可以由隱式規則替代。 %.o:%.c gcc $? -o $ @ @ {BUILDIR}/foo:$ {OBJDIR} /bar.o $ {OBJDIR} /bar2.o gcc $^-o $ @ – Alex 2011-12-29 03:32:03

+1

@Alex同意規則可以清理一堆。而對於真正的生產使用依賴應該被使用makedepend或'gcc -MM'等被拉出來,但希望它足以幫助JAM。 – 2011-12-29 03:35:16

+0

我不知道這兩個。 (通常我更喜歡生成的Makefiles又名CMake或Automake) – Alex 2011-12-29 03:38:28

1

1,您可以像訪問其他變量一樣訪問您的環境變量;例如,$(TERM)

2,只是改變你的make目標,包括目標目錄:

dist/file1.o: file1.s 
     gcc -c dist/file1.s -o [email protected] 

哪裏[email protected]是代表目標,dist/file1.o在這個例子中的隱含變量。