2014-01-09 94 views
3

我有一個Makefile系統動態生成的規則建立的文件列出了不同的平臺。由於各種原因,不能使用隱式規則,因爲沒有適用的通用模式,而是通過文件列表輸出各種功能。重寫明確的規則Makefile中

現在我想的方式,它只是引發了那些需要被構建的目標添加自動依存產生。執行此操作的正常方法是定義生成依賴項的隱式規則,然後包含或定義顯式規則,這些規則需要這些依賴項作爲同一目標的先決條件(有關示例,請參閱http://mad-scientist.net/make/autodep.html)。這是有效的,因爲使用相同規則的顯式版本自動覆蓋隱式規則而不抱怨。

然而,因爲我別無選擇,使用隱含規則我試圖想出一個辦法做到這一點。我看到只有兩種方法:

  1. 動態地重寫顯式規則並獲得「警告:覆蓋目標的命令」爲每個。
  2. 找到一個方法告訴讓一個現有的規則定義,所以我可以提供一個新的。

由於AFAIK沒有辦法做第二個選擇,有沒有人知道我可以如何抑制「覆蓋目標的命令」警告?任何其他建議用於覆蓋顯式規則並使用新的先決條件再次對它們進行評估?

+1

一個makefile可以按照預期工作,只有顯式規則和沒有隱式規則。你能提供一個你想要做的事情的簡單例子嗎? – Ned

+0

例如,這但沒有模式規則:http://mad-scientist.net/make/autodep.html#norule不一定使用makedepend,但是可以使用任何方式爲相同目標生成具有正確依賴關係的新規則。在這個例子中,這是通過下面的include完成的。 – user3176103

+0

儘管你的構建系統可能非常需要像通過你提供的鏈接描述的那樣的自動依賴機制的複雜性,但你可能不會 - 我個人已經看到了許多非常糟糕的解決方案,以解決'make'的缺陷和跨平臺的問題 - 即「便攜」 - 建立在過去35年左右(Imake,任何人?)。你能否提供一個示例顯式的目標依賴規則片段來演示你需要做什麼?此外,所有版本都是在Unix/Linux/Mac OS X上執行的,還是有其他使用'make'構建的平臺,但沒有完整的Unix工具集? – Ned

回答

3

簡短的回答是否定的,就沒有辦法更換明確的規則沒有得到該消息(嗯,當然,因爲GNU提出的是開源的,你可以修改代碼,並建立自己的版本)。

較長的答案是,我認爲您最初的假設是不正確。我不明白你的意思是這是可行的,因爲使用相同規則的顯式版本自動覆蓋隱式規則而不會抱怨

你似乎是在想什麼是前提聲明沒有食譜,如:

%.o : %.c 
     $(CC) ... 

foo.o: foo.c foo.h bar.h 
foo.o: biz.h baz.h 

等在GNU規則提出的是,只能有一個規則定義配方爲任何給定的目標(反正是單個目標)。只要定義了先決條件關係,就可以制定儘可能多的規則,而無需定義食譜。當看到這些先決條件規則時,只需附加到當前先決條件列表的其他先決條件。

而且,這裏存在隱性或顯性的規則之間沒有什麼區別;例如上面的例子可以寫成:

foo.o : foo.c 
     $(CC) ... 

foo.o: foo.c foo.h bar.h 
foo.o: biz.h baz.h 

,這就是完全合法的,不會給你任何警告。

看起來你的makefile中存在一個問題,並且你已經做了一些關於問題的結論,然後而不是描述問題本身,而是問如何解決結論。如果您備份並向我們展示生成警告的makefile示例(並顯示您如何調用make並越過所獲得的警告),那麼我們可能會更好地爲您提供幫助。