如何通过摇动将PHONY目标声明为默认操作?

时间:2013-03-16 14:55:10

标签: haskell shake-build-system

我正在将Makefile转换为Shakefile,我不知道如何处理PHONY制作目标(cleaninstall等)。我试过像:

main = shake shakeOptions $ do
  want ["install"]
  "install" *> \_ -> do
    need ["mytarget"]
    system' "ln" ["-s", "mytarget", "linkname"]

成功创建符号链接,但报告错误“错误,规则”安装“无法构建文件:安装”。

因此,如果没有“想要”动作,我如何声明我想要运行的默认目标是虚假目标?

2 个答案:

答案 0 :(得分:5)

在shake-0.10.1及更高版本中,您可以使用phony函数来编写:

main = shake shakeOptions $ do
  want ["install"]
  phony "install" $ do
    need ["mytarget"]
    system' "ln" ["-s", "mytarget", "linkname"]

这应该完全符合您的要求,并且不需要生成假文件。此外,您可能希望使用shakeArgs而不是shake,以便用户可以从命令行中选择install,或者选择其他目标,例如清除。

答案 1 :(得分:1)

在震动-0.9及以下假动作目标在震动中是一个弱点 - 你可以做到,但它们比它们应该更加冗长和手动。以下是一些选项:

让安装规则生成文件

作为一个非常简单的解决方案,只需在writeFile' "install" ""规则的底部添加install即可。这会生成一个虚拟文件,但每次mytarget更改时它都会重新运行。如果您希望每次请求install时都运行它(就像制作中的虚假),只需添加alwaysRerun即可。如果您可以忽略冗余文件,这是最简单的解决方案,直到有一流的虚假支持。

使用action

你可以写:

main = shake shakeOptions $ do
  action $ do
    need ["mytarget"]
    system' "ln" ["-s", "mytarget", "linkname"]

这声明了在每个构建上运行的操作。实际上,如果install在命令行中,您可能只希望运行它,因此您可以这样做:

main = do
  args <- getArgs
  shake shakeOptions $ do
    when ("install" `elem` args) $ action $ do
      ... install code ...

使用shakeArguments

later versions of shake中,您可以使用shakeArgsWith函数编写:

main = shakeArgsWith shakeOptions [] $ \_ targets ->
  if "clean" `elem` targets then do
    removeFiles "_make" "//*"
    return Nothing
  else return $ Just $ do
    when ("install" `elem` targets) $ do
       ... install code ...
    ... other rules ...
    want $ delete "install" targets

这使您可以完全控制目标的处理方式,因此您可以做一些比虚假目标更强大的功能,但它的工作量更大。