簡體   English   中英

當沒有任何改變時,如何阻止 GHC 重新編譯模塊?

[英]How do I stop GHC from recompiling modules when nothing has changed?

我有以下目錄結構:

  • libgs - 基本的全局腳本抽象機和標准庫
  • gsi - 全局腳本解釋器
  • gs2hs - Haskell 編譯器的全局腳本

大多數(但當然不是全部)代碼是用全局腳本編寫的,並由 Haskell 程序 hsgs2hs 轉換為 Haskell。

因此,gsi 和 gs2hs 中的代碼都依賴於 libgs 中的模塊。

由於我的代碼組織有些草率,gs2hs 中的編譯器還依賴於 gsi 目錄中的前端模塊(解析器、類型檢查器等)。

拋開法律不談:如果重要的話:我的代碼可以在線免費獲得,但不是開源的,並且其許可證不允許通過 Hackage 重新分發。 結束合法。

我可以通過運行使這個目錄結構工作

ghc --make -i../libgs gsi.hs -o gsi

在 gsi 目錄中,和

ghc --make -i../libgs -i ../gsi gs2hs.hs -o gs2hs

在 gs2hs 目錄中。

問題是,每次我按順序進行兩次構建時,GHC 都會重新編譯 libgs 目錄中的每個模塊和 gsi 目錄中的每個共享模塊,告訴我“標志已更改”。

我想,好吧,我可能應該在 Haskell 中使用包來重用代碼,對吧? 所以我將 libgs 轉換為 package:

  • 將 libgs.cabal 文件添加到該目錄,將所有模塊列為公開模塊。
  • 添加一個運行cabal install --lib --package-env $REPO_ROOT/package.env. 並在構建 gsi 和 gs2hs 之前調用它
  • -package-env $REPO_ROOT/package.env添加到 gsi 和 gs2hs 目錄中的 GHC 標志。

沒有歡樂!

現在,對 libgs 的任何更改——即使只是添加一個新模塊——都會導致 GHC 重新編譯 gsi 目錄中的每個模塊,告訴我基本模塊 GSI.Value 已更改。 即使它實際上沒有; 該模塊的源代碼以及它所依賴的所有內容(不多)都沒有改變。 只是它來自的 package 的 hash 發生了變化。

我如何阻止 GHC 不斷地重新編譯世界,並讓它只在結果可能不同時才重新編譯?

libgs.cabal文件添加到該目錄,將所有模塊列為公開模塊。

好的,很好。

添加運行cabal install --lib --package-env $REPO_ROOT/package.envlibgs/install-all腳本

不要那樣做。 作為一般規則,永遠不要使用install --lib 通常最好讓 Cabal 弄清楚何時安裝庫。 最簡單的方法是將可執行文件放入 package 本身。 您可以在.cabal文件中同時擁有library:部分以及任意多個executable: gsiexecutable: gs2hs

或者,您可以將libgs保留為不關心可執行文件的 package,但將它們放在各自的 package 中。 然后你不要在 package 目錄本身中進行任何構建,而是在你的主src目錄中放置一個cabal.project文件,說

packages: ./libgs ./gsi ./gs2hs

然后在該目錄中運行cabal new-build 它會將所需的 object 文件共同存儲在其.dist-newstyle目錄中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM