我正在将Makefile转换为Shakefile,我不知道如何处理PHONY制作目标(clean
,install
等)。我试过像:
main = shake shakeOptions $ do
want ["install"]
"install" *> \_ -> do
need ["mytarget"]
system' "ln" ["-s", "mytarget", "linkname"]
成功创建符号链接,但报告错误“错误,规则”安装“无法构建文件:安装”。
因此,如果没有“想要”动作,我如何声明我想要运行的默认目标是虚假目标?
答案 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
这使您可以完全控制目标的处理方式,因此您可以做一些比虚假目标更强大的功能,但它的工作量更大。