2013-07-12 2 views
4

응용 프로그램을 빌드 한 후 Cabal에 명령을 실행하도록 알릴 수 있습니까?빌드 명령 후 Cabal (Haskell 빌드 시스템)

예를 들어 스크립트를 사용하여 .hs 파일을 생성하고 다른 파일을 dist/build/app 디렉토리에 복사하려는 경우를 원합니다.

+0

이것은 최종 사용자를위한 것입니까 아니면 혼자의 것입니까? 물건을 만들고 자신의 카발을 불러내는 스크립트에'cabal whatever '을 단순히 감쌀 수 있습니다 (해킹 된 경우). 인수를 곧바로 도체 경로로 전달하는 것이 매우 쉽습니다. – jozefg

+1

최종 사용자는 "생산 준비가 된"방법으로 거짓말을합니다. 이러한 스크립트는 최종 사용자에게도 나쁘지는 않지만 - (@RanjitJhala의 대답을 기반으로 한) 기본적으로 가능합니다 :) –

답변

3

예. postInst 및 관련 유형/작업을 살펴보십시오.

Distribution.Simple.UserHooks

여기에 빠른 예, 당신은 더 많은 것을 알아 내기 위해 관련 작업을 hoogle 수 있습니다. 이것은 다양한 .sh 스크립트를 실행하고 파일을 복사합니다. 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 나는 당신이 말한 것을 정말로 두려워한다. ( –