Да. Взгляните на postInst
и связанные с ним типы/операции.
Distribution.Simple.UserHooks
Вот краткий пример, вы можете hoogle соответствующие операции, чтобы выяснить больше. Выполняет различные скрипты .sh, копирует файлы и т. Д. ПОСЛЕ сборки cabal. absoluteInstallDirs
сообщает, где находится каббал, остальные вам нужно.
Надеюсь, это поможет!
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 }
Это для конечных пользователей или просто для вас самих? Всегда возможно (если хакерство) просто обернуть 'cabal what' в скрипте, который делает что-то, и сам заставляет его использовать. Достаточно легко получить аргументы в прямом направлении к кабалу. – jozefg
Я бы солгал, чтобы сделать это «готовым способом производства» для конечных пользователей. Такой скрипт неплох и для конечных пользователей, но, как я вижу (на основе ответа @RanjitJhala), это возможно по умолчанию :) –