2011-08-22 74 views
5

我一直在編寫一個執行一些依賴關係生成的Makefile,並且我發現自己不得不重複規則,因爲(遺留)代碼庫包含.cpp.cc文件的混合。這看起來有點不雅觀。無論如何要指定目標的先決條件可以是.cpp.cc文件?避免重複GNU制定規則

因此而不是:

%.d : %.cpp 
    $(CPP) -MM $(CPPFLAGS) $< 

%.d : %.cc 
    $(CPP) -MM $(CPPFLAGS) $< 

不喜歡重複創造的東西:

%.d : %.(cpp | cc) 
    $(CPP) -MM $(CPPFLAGS) $< 

或者是這個執行冗餘GNU的只是一個不幸的元素製作的設計?

+0

如果使用GNU autotools你可以使用m4宏 – Kevin

回答

3

第一個選項,使用一個變量一次定義規則主體,並重新使用它需要:

DEPGEN=$(CPP) -MM $(CPPFLAGS) $< 
%.d: %.cpp ; $(DEPGEN) 
%.d: %.cc ; $(DEPGEN) 

第二個選項,使用$(eval)動態生成的規則:

$(foreach src,cpp cc,$(eval %.d: %.$(src) ; $$(CPP) -MM $$(CPPFLAGS) $$<)) 
+0

選項一正是我所期待的。 – Alastair

1

這應該工作:

%.d :: %.cpp 
    $(CPP) -MM $(CPPFLAGS) $< 

%.d :: %.cc 
    $(CPP) -MM $(CPPFLAGS) $< 

另一個想法:

%.d : %.c 
    $(CPP) -MM $(CPPFLAGS) $< 

%.c : %.cpp 
    ln $< [email protected] # or cp -p 

另一個想法是讓GNU使產生兩個模式規則。 有essentally這樣做的方法有兩種:

  • 他們寫信給您包括您與GNU make的include聲明實際的Makefile中
  • 產生,並與GNU make的$(eval)和在線評估它們的makefile(%-cc.mk或類似) $(call)功能

最喜歡在C/Unix的開發工具鏈其他的一切,這些技術基本上是預處理的一種形式,使得它們很容易在被真的很難價格瞭解使用(大量的雙重或三重轉義,很難跟蹤什麼時候擴展;調試可能是一個皇家的痛苦,至少在我的經驗)。

因此爲更復雜的用例(其中堆棧溢出列出幾個)保留它們。

+0

這些選項似乎都不會導致更簡潔的makefile。我可能會堅持原來的形式。感謝您的建議,但。 – Alastair