2015-04-26 62 views
1

我正在編譯一些項目與依賴關係,所以我不必每次重新編譯,但是當我將-Dsome_flags添加到我的CFLAGS時,它不會重新編譯。如何在更改Makefile標誌時強制重新編譯?

dep: $(CPPS) 
    $(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep 

我加入到我的CFLAS -DDEBUG_FLAG中,它迫使我做出乾淨的,而不是make。

+0

您修改生成文件,它不重新編譯? –

+0

您可能根本不需要依賴關係生成器規則。 http://stackoverflow.com/a/7358961/412080 –

回答

1

最簡單的,在我看來,將做一個make clean,然後make。這當然假設您希望由於編譯器標誌更改而重新編譯所有源文件。但你似乎不喜歡這種方法。

如果你想修改Makefile,您可以在生成文件的名稱添加到每個規則編譯源文件,例如:

somefile.o : somefile.cpp <makefile_name> 
      $(CC) -c $(CFLAGS) somefile.cpp -o somefile.o 

%.o : %.c <makefile_name> 
      $(CC) -c $(CFLAGS) somefile.cpp -o somefile.o 

鑑於大小該項目和涉及的規則數量,做make clean; make可能是最簡單和最快的方法。然而,一如既往,你的里程我變化。

只是我的$ 0.02的價值,希望它有助於 T.

+0

這幾乎是我在實踐中看到的方法。 –

+0

如果標誌因命令行更改而更改,則這不起作用。例如'make CFLAGS = -DDEBUG'不會重新編譯任何東西。 –

+0

@KevinCox是的,你是對的。但請回顧一下如何進行工作,它將每個目標的上次修改時間戳與所有目標相關性的上次修改時間戳進行比較。如果其中一個依賴關係在上次構建目標後進行了修改,則目標將被重建。如果您在命令行上修改了一個標誌(如您所建議的那樣),則文件系統不會發生變化,並且您無法獲得所需的重新編譯。在這種情況下,使用'make clean''使CFLAGS = -DDEBUG'應該可以做到這一點 – thurizas

3

它不會重新編譯,因爲您沒有將makefile本身列爲依賴項。

dep: $(CPPS) Makefile 
    $(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep 

也就是說,如果你在化妝的標誌命令行(例如CFLAGS=-O3 make all)餵養,make無法檢測,你已經改變了這些,迫使一個完整的構建方式。

+0

你有辦法克服命令行問題嗎? – shd

+0

您提到的方法不起作用。 – shd

+0

無法克服命令行問題。 'make'無法記住它上次運行的方式。此外,您必須將'Makefile'更改爲makefile所在的位置。 –

1

Makefile中查找基於它具有數據的變化。您的Makefile狀態下的唯一依賴項定義在$(CPPS)

dep: $(CPPS) 
    $(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep 

因此,make只跟蹤給定列表中的變化,即$(CPPS)。所以分辨率是:

dep: $(CPPS) Makefile 
    $(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep 

有關完整,但不復雜的例子,這是我的Makefile一個HelloWorld程序:

OBJS = helloworld.o 
default: hw 

%.o: %.c Makefile 
    gcc -c $< -o [email protected] 

hw: $(OBJS) 
    gcc $(OBJS) -o [email protected] 

clean: 
    -rm -f $(OBJS) hw 

每次我改變我的makefile它得到重新編譯! :)

相關問題