2013-08-26 64 views
0

我想用Haiku Jam構建一個項目。 (該項目的代碼可在線獲得,網址爲https://github.com/Andromeda-OS/LLVM。我推薦至少查看該項目中的目錄名稱,以便知道下面指的是什麼組件。)依賴打破構建

我試圖(重新)構建llvm-tblgen實用程序。 llvm-tblgenlibLLVMSupportlibLLVMTableGen有鏈接時間依賴性。如果我添加Jam DEPENDS聲明以便llvm-tblgen要求首先構建libLLVMSupport,Jam根本不會構建llvm-tblgen。果醬輸出don't know how to make ./bin/llvm-tblgen/llvm-tblgen,並且給我沒有其他有用的診斷,即使在高冗長級別運行。

如果我從llvm-tblgen中刪除了每個依賴項命令,那麼只有在Jam編譯該文件的時候。但是,如果libLLVMSupport.a不存在,則會導致鏈接器錯誤,因爲不會先通知Jam先編譯libLLVMSupport。但是,如果我先告訴Jam先製作libLLVMSupport,那麼llvm-tblgen根本不會被製作!任何指針?

回答

2

要分析這樣的問題,你可以使用:

jam -n -dm 

這將打印廠名樹。錯誤是在處理make樹時打印的,因此您可以在Jam遇到它的地方看到它,並且可以輕鬆追蹤導致它的依賴關係。在這種情況下,「Intrinsics.gen」已經不存在依賴關係和grep揭示以下行「包括/ LLVM/Jamfile中」:

DEPENDS $(Intrinsics.gen) : $(Intrinsics.gen:D) $(TOP)/bin/llvm-tblgen/llvm-tblgen ; 

所以,如果你在頂級目錄的干擾,後者依賴關係擴展爲「./bin/llvm-tblgen/llvm-tblgen」。由於Jam中的目標名稱只是文字字符串,因此不會匹配可能的路徑happing - 這與您在「bin/llvm-tblgen/Jamfile」中定義的目標「llvm-tblgen」不匹配。

解決方法是:切勿使用具有路徑組件的目標名稱,只使用文件名。如果兩個不同的目標具有文件名,則將其添加到其中的一個或兩個(例如「foo」和「foo」)以使其再次具有唯一性。如果在目標上正確設置了SEARCHLOCATE(幾乎所有標準規則都會這樣做),那麼當在動作中使用時,Jam會自動將目標名稱解析爲匹配路徑(即綁定目標)。比如你TableGen規則而應是這樣的:

rule TableGen 
{ 
    DEPENDS $(<) : llvm-tblgen $(>) ; 
    TableGen1 $(<) : llvm-tblgen $(>) ; 
} 

actions TableGen1 
{ 
    $(2[1]) $(TABLEGEN_FLAGS) -I $(TOP)/generated-include -I $(TOP)/lib/Target -I $(TOP)/include -o $(1) $(2[2-]) 
} 

「LLVM-tblgen」現在作爲目標的行動傳遞,從而自動綁定到正確的路徑。

可以簡化「包括/ LLVM/Jamfile中」:

SubDir TOP include llvm ; 

MakeLocate Intrinsics.gen : $(TOP)/generated-include/llvm ; 
SEARCH on Intrinsics.td = $(SUBDIR) ; 
TableGen Intrinsics.gen : Intrinsics.td ; 
TABLEGEN_FLAGS on Intrinsics.gen = -gen-intrinsic ; 

通常一個增加的子目錄穀物源文件(在這種情況下使用[ FGristFiles Intrinsics.td ]),所以用同樣命名的源文件的衝突在其他目錄是避免搶先。如果您在其他地方也使用TableGen規則,那麼您也可以在此處移動以上的MakeLocateSEARCH。這裏不是設置TABLEGEN_FLAGS,而是在TableGen的第三個參數中設置變量,這樣規則變得更加方便。

一些其他的東西我注意到:

  • 你的通配符規則過於複雜。第一行後,你可以只是return $(results:BS) ;。字符串/路徑操作應用於列表的每個元素,因此不需要手動執行該操作。
  • 您的LLVMLinkExecutable和_GetLinkerFlags也相當複雜。如果LLVMLinkExecutable的「libraries」參數始終是構建系統構建的庫的縮寫名稱,則可以使用LinkLibraries $(1) : lib$(3).a ;而不是「for」循環。該規則建立了依賴關係並將庫添加到鏈接行(使用它們的路徑而不是「-L ... -l ...」)。
+0

其實,在我看到這個答案之前,我自己解決了這個問題。但是,**謝謝你的所有建議!我從來沒有想過這些我自己!我會很快將它們應用於我的代碼庫。 – wjk