要分析這樣的問題,你可以使用:
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」)以使其再次具有唯一性。如果在目標上正確設置了SEARCH
或LOCATE
(幾乎所有標準規則都會這樣做),那麼當在動作中使用時,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規則,那麼您也可以在此處移動以上的MakeLocate
和SEARCH
。這裏不是設置TABLEGEN_FLAGS
,而是在TableGen的第三個參數中設置變量,這樣規則變得更加方便。
一些其他的東西我注意到:
- 你的通配符規則過於複雜。第一行後,你可以只是
return $(results:BS) ;
。字符串/路徑操作應用於列表的每個元素,因此不需要手動執行該操作。
- 您的LLVMLinkExecutable和_GetLinkerFlags也相當複雜。如果LLVMLinkExecutable的「libraries」參數始終是構建系統構建的庫的縮寫名稱,則可以使用
LinkLibraries $(1) : lib$(3).a ;
而不是「for」循環。該規則建立了依賴關係並將庫添加到鏈接行(使用它們的路徑而不是「-L ... -l ...」)。
其實,在我看到這個答案之前,我自己解決了這個問題。但是,**謝謝你的所有建議!我從來沒有想過這些我自己!我會很快將它們應用於我的代碼庫。 – wjk