2011-04-06 35 views
0

我試着寫這種形式的make規則:在切換到目錄之前,在目錄中尋找依賴關係?

lib%.so: computations/%.h 
     make -C computations/ -f makefile $< 

輸出:

make -C computations/ -f makefile computations/test.h 
make[1]: Entering directory `/home/shai/csm/csm2/src/computations' 
make[1]: *** No rule to make target `computations/test.h'. Stop. 
make[1]: Leaving directory `/home/shai/csm/csm2/src/computations' 
make: *** [libtest.so] Error 2 

好,似乎它看起來%.h切換後庫。沒有biggie,我只是嘗試刪除

lib%.so: %.h 
     make -C computations/ -f makefile $< 

但現在它根本不承認規則!

輸出:

[email protected]:~/csm/csm2/src$ make libtest.so 
`make: *** No rule to make target `libtest.so'. Stop. 

make用腦子玩?如何改變依賴關係使其停止識別目標

+1

順便說一下,我只是注意到這是一個奇怪的規則。它更新依賴項,而不是目標。這不是「make」應該如何使用的。 – eriktous 2011-04-06 14:19:38

回答

0

它可能就是您複製/粘貼它的方式,但是您在第二種形式中缺少選項卡。

+0

是的,這是一個粘貼問題 – 2011-04-06 13:14:34

+0

然後,我不知道。我和你一樣困惑。 – 2011-04-06 13:21:32

2

如何改變依賴性使其停止識別目標?

很可能是因爲它無法找到適合該依賴關係模式的文件,因爲test.h位於另一個目錄中。您可以使用VPATH讓它搜索其他目錄中的文件。

編輯:但這仍無法完全解決您的問題,因爲$<computations/test.h取代,這將不會在目錄computations中找到(如在你得到的第一個錯誤)。你可以嘗試$(notdir $<),但我認爲這是一個醜陋的黑客(如果它的工作,我沒有嘗試過)。這是你的makefile和項目結構設計的結果。

2

您正在使用造成錯誤。

製作的設計其實是相當簡單的心臟:你告訴它

  1. 如何創建目標(該規則的機構)。
  2. 它需要創建第一個(依賴列表)。

然後製作topological sorts依賴性信息,以便它以正確的順序執行主體。

您的規則使用$<(將其展開爲依賴關係列表)表示您正在告訴調用的創建依賴關係%.h而不是目標lib%.so。 該規則必須創建目標。如果需要創建依賴關係,則需要通過另一個單獨的規則告知如何執行此操作,而不是嘗試確保它在此規則中處於最新狀態。

正如你試圖協調各個目錄,我會推薦紙Recursive make considered harmful,這通常是一個很好的方式來組織事情,但不是唯一可能的方式來做事情。

相關問題