2013-07-12 2 views
4

Можно ли сказать, что Cabal запускает некоторую команду после создания приложения?Каббал после команды сборки (система сборки Haskell)

Я хочу, например, генерировать с помощью скрипта некоторые файлы .hs и после создания для копирования некоторых других файлов в каталог dist/build/app.

+0

Это для конечных пользователей или просто для вас самих? Всегда возможно (если хакерство) просто обернуть 'cabal what' в скрипте, который делает что-то, и сам заставляет его использовать. Достаточно легко получить аргументы в прямом направлении к кабалу. – jozefg

+1

Я бы солгал, чтобы сделать это «готовым способом производства» для конечных пользователей. Такой скрипт неплох и для конечных пользователей, но, как я вижу (на основе ответа @RanjitJhala), это возможно по умолчанию :) –

ответ

3

Да. Взгляните на 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 } 
+0

Это связано с большим предупреждением о том, что Distribution.Simple.UserHooks может изменить/однако это, вероятно, лучшее, что вы получили. – jozefg

+0

Я понимаю, что этот материал подходит к 'Setup.hs'? –

+0

@jozefg Я действительно боюсь того, что вы сказали :( –