存储规则

时间:2015-05-05 22:11:01

标签: haskell shake-build-system

我有一个函数可以在关联命令发生变化时重建目标:

target :: FilePath -> [FilePath] -> String -> Rules ()
target dst deps cline = do
  let dcmd = dst <.> "x"
  dcmd %> \out -> do
    alwaysRerun
    writeFileChanged out cline
    return ()
  dst %> \out -> do
    c <- readFile' dcmd
    need deps
    () <- cmd $ "../dumpdeps/dumpdeps " ++ out ++ " " ++ c
    needMakefileDependencies $ out <.> "d"
    return ()

我不想触摸此任务的文件系统,有没有办法存储相关的命令行并在该命令发生变化时触发最终规则?

1 个答案:

答案 0 :(得分:1)

我个人使用文件系统来做这件事。文件系统具有出色的调试器(lscat)以及大量操作工具(echormtouch)。它们对于小文件来说也非常快,主要生活在缓存中。如果你避开这些文件,你往往对发生的事情的了解程度较低。

也就是说,避免文件可能有很好的理由。 Shake对你的模式最接近的是使用Oracle。请注意,它与您正在执行的模式完全匹配,因为它假定cline可以从dst计算,这可能在您的情况下可能或可能不会。

如果Oracle不适合您,您可以定义自己的Rule instance,它可以像文件一样操作,但是将值存储在Shake数据库中。

(如果其中任何一个造成任何困难,请告诉我哪个与您的问题相关,并且我会扩展正确的问题。)