構建應用程序後,是否可以告訴Cabal運行一些命令?構建命令(Haskell構建系統)後的Cabal
我想要例如使用腳本生成一些.hs
文件,並在構建後將一些其他文件複製到dist/build/app
目錄。
構建應用程序後,是否可以告訴Cabal運行一些命令?構建命令(Haskell構建系統)後的Cabal
我想要例如使用腳本生成一些.hs
文件,並在構建後將一些其他文件複製到dist/build/app
目錄。
是的。看看postInst
和相關類型/操作。
這裏有一個簡單的例子,你可以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 }
這帶有一個很大的警告,那就是Distribution.Simple.UserHooks可能會更改/中斷某些東西,但它可能是你得到的最好的。 – jozefg
我明白這東西去'Setup.hs'? –
@jozefg我真的很害怕你所說的話:( –
這是供最終用戶使用還是僅供您自己使用?它總是可能的(如果hackish)簡單地將'cabal'包裝在一個腳本中並且自己調用cabal。讓它直接傳達給cabal也是相當容易的 – jozefg
我會撒謊,爲最終用戶提供「生產就緒方式」。這樣的腳本對最終用戶也不錯 - 但正如我所看到的(基於@RanjitJhala的答案) - 默認情況下是可能的:) –