3

我正在将 Makefile 转换为 Shakefile,但我不确定如何处理 PHONY make 目标(clean、、install等)。我试过类似的东西:

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

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

那么,如果不是使用“想要”操作,我如何声明我要运行的默认目标是假目标?

4

2 回答 2

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从命令行中进行选择,或者选择另一个目标,例如 clean。

于 2013-03-18T08:53:23.407 回答
1

在shake-0.9 和更低版本中,假目标是Shake 的一个弱点——你可以做到,但它们比应有的更加冗长和手动。这里有几个选项:

让安装规则生成一个文件

作为一个非常简单的解决方案,只需在规则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

之后的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

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

于 2013-03-16T19:03:34.830 回答