[英]How do I stop GHC from recompiling modules when nothing has changed?
我有以下目錄結構:
大多數(但當然不是全部)代碼是用全局腳本編寫的,並由 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:
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.env
的libgs/install-all
腳本
不要那樣做。 作為一般規則,永遠不要使用install --lib
。 通常最好讓 Cabal 弄清楚何時安裝庫。 最簡單的方法是將可執行文件放入 package 本身。 您可以在.cabal
文件中同時擁有library:
部分以及任意多個executable: gsi
和executable: 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.