Haskell 如何使用shake将虚假目标声明为默认操作?
我正在将Makefile转换为Shakefile,我不知道如何处理虚假的make目标(Haskell 如何使用shake将虚假目标声明为默认操作?,haskell,shake-build-system,Haskell,Shake Build System,我正在将Makefile转换为Shakefile,我不知道如何处理虚假的make目标(clean,install,等等)。我试过这样的方法: main = shake shakeOptions $ do want ["install"] "install" *> \_ -> do need ["mytarget"] system' "ln" ["-s", "mytarget", "linkname"] 它在创建符号链接时成功,但报告错误“error,rule
clean
,install
,等等)。我试过这样的方法:
main = shake shakeOptions $ do
want ["install"]
"install" *> \_ -> do
need ["mytarget"]
system' "ln" ["-s", "mytarget", "linkname"]
它在创建符号链接时成功,但报告错误“error,rule”install“未能生成文件:install”
因此,如果不使用“想要”操作,我如何声明我要运行的默认目标是虚假目标?在shake-0.9和以下版本中,虚假目标是shake中的一个薄弱点-您可以执行这些操作,但它们比应该的更为详细和手动。以下是一些选项: 让安装规则生成一个文件 作为一个非常简单的解决方案,只需在
install
规则的底部添加writeFile'install”“
。这将生成一个虚拟文件,但每次mytarget
更改时,它都将重新运行。如果您想让它在每次请求安装时运行(就像一个冒牌货一样),只需添加AlwaysRun
。如果可以忽略冗余文件,这是最简单的解决方案,直到有一流的虚假支持
使用操作
你可以写:
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 ...
这使您能够完全控制目标的处理方式,因此您可以执行比虚假目标更强大的操作,但需要更多的工作。在shake-0.10.1及更高版本中,您可以使用
虚假
函数编写:
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
main = shake shakeOptions $ do
want ["install"]
phony "install" $ do
need ["mytarget"]
system' "ln" ["-s", "mytarget", "linkname"]
这应该完全满足您的需要,并且不需要生成假文件。此外,您可能希望使用
shakeArgs
而不是shake
,以便用户可以从命令行选择install
,或者选择另一个目标,例如clean。谢谢,我将遵循第一个解决方案。我现在添加了phony x f=x*>\o->(AlwaysRun>>writeFile'x”“>>f o)
,这样我就可以“安装”'phony'\\\u->do…
@Hudon,在shake-0.10中,你可以做得更好-查看我的其他答案(尽管这个答案仍然很有用,因为变通方法可能对其他事情有用)。将接受的答案改为这个,因为这正是我真正想要的。谢谢你的更新。