2

为了简单起见,我想编写一个包,它需要系统上存在某个(非 Haskell)程序,即 PHCPack。

如果它是一个库,我可以添加一个extra-libraries字段。我如何依赖特定二进制文件的存在?

目前,如果一个具有正确名称的二进制文件位于PATH.

4

1 回答 1

1

好的,这就是我想出的(感谢 nm 的建议)。我的(有点简单的)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”的二进制文件。

于 2013-01-20T10:23:03.103 回答