2014-05-18 107 views
1

背景寫一個Makefile其他Makefile文件是可包含的

我有一個(大)項目A和(大)項目B,使得A依賴於B.

我想有兩個獨立的makefile - 一個用於項目A,另一個用於項目B - 用於性能和可維護性。

基於commentsan earlier question,我決定完全重寫B的makefile,使A的makefile可以include它。這將避免遞歸make的罪惡:允許並行,不重拍不必要,提高性能等


目前的解決方案

我可以包括在找到當前正在執行的makefile文件的目錄(在任何其他包含之前)。

TOP := $(dir $(lastword $(MAKEFILE_LIST))) 

我寫每個目標作爲

$(TOP)/some-target: $(TOP)/some-src 

和更改任何必要的外殼命令,例如find dirfind $(TOP)/dir

雖然這解決了它有幾個缺點引起的問題:

  1. 目標和規則更長,有點不太可讀。 (這可能是不可避免的,模塊化是有代價的)。

  2. 使用gcc -M來自動生成依賴關係需要後處理以添加$(TOP)無處不在。

這是通常的方式來寫其他人可以include d的makefiles嗎?

+0

使用'-MMD -MP'你根本不需要後處理。我建議你向我們展示你的makefile。 – Chnossos

+0

@Chnossos,你能否詳細說明'-MMD -MP'? –

+0

'-MMD'將爲每個'.o'文件生成'.d'依賴文件,並且包含用戶頭文件的規則。 '-MP'指示CPP爲除主文件以外的每個依賴項添加假目標,以解決錯誤。如果刪除頭文件而不更新Makefile以匹配,則會給出錯誤。 ([__Source__](https://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Preprocessor-Options.html))你所要做的就是編寫你的makefile來處理這兩個選項。 – Chnossos

回答

0

如果按照「平常」的意思,「最常見」,那麼答案是「否」。人們做的最常見的事情就是即興地對包含者進行一些更改,使其名稱不與包含者衝突。

然而,你所做的是「好設計」。

事實上,我將你的設計更進一步。

我計算一堆目錄,如果包含是遞歸的,則需要在解析makefile樹時將當前目錄保留在堆棧上。$D是當前目錄 - 更短的人比$(TOP)/型,

我在includee前面加上一切,與$D/,所以你有變量:

$D/FOOBAR := 

和僞目標:

$D/phony: