2013-07-12 65 views
4

構建應用程序後,是否可以告訴Cabal運行一些命令?構建命令(Haskell構建系統)後的Cabal

我想要例如使用腳本生成一些.hs文件,並在構建後將一些其他文件複製到dist/build/app目錄。

+0

這是供最終用戶使用還是僅供您自己使用?它總是可能的(如果hackish)簡單地將'cabal'包裝在一個腳本中並且自己調用cabal。讓它直接傳達給cabal也是相當容易的 – jozefg

+1

我會撒謊,爲最終用戶提供「生產就緒方式」。這樣的腳本對最終用戶也不錯 - 但正如我所看到的(基於@RanjitJhala的答案) - 默認情況下是可能的:) –

回答

3

是的。看看postInst和相關類型/操作。

Distribution.Simple.UserHooks

這裏有一個簡單的例子,你可以hoogle相關操作,以找出更多。 這會執行各種.sh腳本,拷貝文件等。 absoluteInstallDirs告訴你cabal正在放哪些文件,應該是 你需要它。

希望這有助於!

import Distribution.Simple 
import Distribution.Simple.LocalBuildInfo 
import System.Process 
import System.Exit 

main = defaultMainWithHooks fixpointHooks 

fixpointHooks = simpleUserHooks { postInst = buildAndCopyFixpoint } 

buildAndCopyFixpoint _ _ pkg lbi 
    = do putStrLn $ "Post Install: " ++ show binDir -- , libDir) 
     executeShellCommand "./configure" 
     executeShellCommand "./build.sh" 
     executeShellCommand $ "chmod a+x external/fixpoint/fixpoint.native " 
     executeShellCommand $ "cp external/fixpoint/fixpoint.native " ++ binDir 
     executeShellCommand $ "cp external/z3/lib/libz3.* " ++ binDir 
    where 
    allDirs  = absoluteInstallDirs pkg lbi NoCopyDest 
    binDir  = bindir allDirs ++ "/" 

executeShellCommand cmd = putStrLn ("EXEC: " ++ cmd) >> system cmd >>= check 
    where 
    check (ExitSuccess) = return() 
    check (ExitFailure n) = error $ "cmd: " ++ cmd ++ " failure code " ++ show n 
fixpointHooks = simpleUserHooks { postInst = buildAndCopyFixpoint } 
+0

這帶有一個很大的警告,那就是Distribution.Simple.UserHooks可能會更改/中斷某些東西,但它可能是你得到的最好的。 – jozefg

+0

我明白這東西去'Setup.hs'? –

+0

@jozefg我真的很害怕你所說的話:( –