2017-09-21 148 views
0

與OCaml的船舶好像UnixBigarray某些模塊在ocamlopt -where自己.cmx.cmxa文件(這是~/.opam/4.03.0/lib/ocaml我的系統上我目前OPAM開關)。OCaml的靜態檢測非pervasives庫相關的標準分配

有沒有一種方法可以確定沒有編譯哪個源文件依賴於標準分佈中的哪些「特殊」庫?我打算稍後在Makefile中使用此輸出。

下面的程序example.ml

open Unix;; 

Unix.system "echo hi";; 

可以用ocamlfind ocamlopt -package unix -linkpkg example.ml進行編譯。我不確定如何編譯它,而不通過ocamlfind包裝。

我想知道是否有一種方法可以靜態檢測到此文件中的未綁定模塊Unix對應於標準分發中的「某些內容」,並將unix.cmxa報告爲依賴項。 ocamldep默認情況下似乎不會將其報告爲依賴項。

ocamldep -all example.ml只是報告可以使用example.ml生成的各種對象和接口文件取決於example.ml。我希望得到一個錯誤消息,抱怨ocamldep不理解Unix模塊或者某些跡象表明它需要構建對象。

$ ocamldep -all example.ml 
example.cmo example.cmi : example.ml 
example.cmx example.o example.cmi : example.ml 
+2

'ocamlfind ocamlopt -verbose -package unix -linkpkg example.ml'顯示爲編譯'example.ml'而執行的實際命令。 – camlspotter

回答

1

我明白你的問題是:

對於給定的模塊名稱,說Unix,我們怎樣才能找到它提供了它的圖書館嗎?

不幸的是,目前還沒有這樣的工具。

如果我們限制搜索空間的庫來與OCaml的編譯器本身,我會做:

$ ocamlobjinfo $HOME/.opam/4.03.0/lib/ocaml/*.cma | grep '^\(File\|Unit name\)' 

這將列出每個存檔中定義的所有模塊。您可能會也可能不會在結果中找到模塊名稱。

這是不可能的,因爲你所尋找的圖書館可能不是標準的,或者可能沒有在本地安裝。您可以使用像ocamloscope這樣的API搜索引擎,但它們從不涵蓋當然所有的OCaml庫。

1

儘管模塊可能打包到具有任意名稱的庫中,但模塊接口仍然保留頂層模塊名稱和編譯模塊接口文件名之間的一對一映射。所以,如果你有一個錯誤「未綁定模塊Xxx`中,你可以做

find ~/.opam -iname Xxx.cmi 

如果你沒有發現任何,那麼就意味着,這樣的庫沒有安裝。目前,還沒有確定的方法來找出哪個軟件包提供了這個模塊,您可以使用Google,在郵件列表或討論論壇上詢問人們,或嘗試使用apt-file,希望圖書館採用標準分發。

如果搜索只返回一個文件夾,那麼你很幸運,你有包。該軟件包可能包含不同屬的目標文件(.cmx - 對於本機代碼,.cmo - 對於字節碼)以及庫(.cma - 是.cmo,.cmxa的集合 - 是.cmx的集合, .cmxs是.cmxs的動態版本)。 OCaml的靈活性,既是一個好處也是一個禍根,它允許丟失這些文件中的任何一個。精心策劃的圖書館通常提供所有這些文件,並且有一個命名約定,即包名與庫名相匹配。但是,如果您使用的是ocamlfind並且該文件夾包含META文件,那麼文件夾的名稱就是您需要傳遞到ocamlfind以便鏈接此包中的庫的包的名稱。

如果您有多個結果,那麼您需要使用常識來確定需要使用哪個庫。或者,您可以嘗試使用另一個,並查看哪一個編譯。

+0

對不起,我不認爲我解釋得很好。我想要做的第一件事是:1)檢測源文件是否依賴於名爲'Unix'的模塊,2)檢測到'Unix'由標準分發中的東西提供並且獲取'cm *'文件的名稱提供它。我還沒有試圖處理第三方模塊。 –

相關問題