为了简单起见,我想编写一个包,它需要系统上存在某个(非 Haskell)程序,即 PHCPack。
如果它是一个库,我可以添加一个extra-libraries
字段。我如何依赖特定二进制文件的存在?
目前,如果一个具有正确名称的二进制文件位于PATH
.
好的,这就是我想出的(感谢 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”的二进制文件。