2012-11-08 5 views
2

간단히하기 위해 시스템에 특정 (비 하스켈) 프로그램 즉 PHCPack이 있어야하는 패키지를 작성하고 싶습니다.Cabal의 바이너리 유무에 따라 달라집니다.

라이브러리 인 경우 extra-libraries 필드를 추가하면됩니다. 특정 바이너리의 존재 여부는 어떻게 결정합니까?

올바른 이름을 가진 바이너리가 PATH에 있으면 잠깐이면 충분합니다.

+0

패키지가 제대로 빌드하려면이 바이너리가 필요합니까? – dave4420

+0

실행 중에 만 필요합니다. – mrueg

+3

빌드를 인위적으로 실패하는 이유는 무엇입니까? 패키지를 어떻게 사용할 지 알 수 없습니다. 어쩌면 그것은 한 컴퓨터에서 만들어지고 다른 컴퓨터에서 사용될 것입니다. 바이너리가 존재하지 않으면 사용자에게 경고하는 것이 적절합니다. 검사는'Setup.hs'에서 할 수 있습니다. –

답변

1

좋아, 내가 생각해 낸 것은 다음과 같다 (제안 사항은 n.m에게 감사한다). 내 (다소 단순한) Setup.hs는 다음과 같습니다.

import Distribution.Simple 

import Distribution.Simple.Utils(warn) 
import Distribution.Verbosity(normal) 
import System.FilePath(getSearchPath,(</>)) 
import System.Directory(doesFileExist,getPermissions,executable) 
import Control.Monad(filterM,unless) 

main = do 
    let hooks = simpleUserHooks { 
     preConf = \args cnfFlags -> do 
      info <- (preConf simpleUserHooks) args cnfFlags 
      checkPHC 
      return info 
     } 
    defaultMainWithHooks hooks 

checkPHC :: IO() 
checkPHC = do 
    locations <- phcLocations 
    (if null locations then 
    warn normal "No PHC binary found in PATH." 
    else do 
    p <- mapM getPermissions locations 
    unless (any executable p) $ warn normal "PHC file found, but not executable.") 

phcLocations :: IO [FilePath] 
phcLocations = do 
    paths <- getSearchPath 
    filterM doesFileExist $ map (</> "phc") paths 

PATH에서 "phc"라는 바이너리를 확인합니다.

관련 문제