在Shake中,规则的定义顺序重要吗?

时间:2019-08-09 10:01:56

标签: shake-build-system

如果我对*.o对象文件有通用的构建规则,但对foo.o对象文件有更特定的构建规则,那么定义顺序重要吗?

1 个答案:

答案 0 :(得分:1)

%>运算符的文档中所述:

  

没有通配符的模式比具有通配符的模式具有更高的优先级,并且系统要求的任何文件都不能由多个具有相同优先级的模式进行匹配(请参见priorityalternatives进行修改行为)。

因此定义顺序无关紧要,但是文件不能以相同的优先级匹配多个规则。

因此,在*.ofoo.o的情况下就可以了。这是一个示例(使用foo.txt*.txt):

import Development.Shake

main = shakeArgs shakeOptions $ do
    want ["foo.txt", "bar.txt"]
    "foo.txt" %> \out -> writeFile' out "foo"
    "*.txt"   %> \out -> writeFile' out "anything"

vs

import Development.Shake

main = shakeArgs shakeOptions $ do
    want ["foo.txt", "bar.txt"]
    "*.txt"   %> \out -> writeFile' out "anything"
    "foo.txt" %> \out -> writeFile' out "foo"

在两种情况下,foo.txt将包含“ foo”,而bar.txt将包含“ anything”,因为“ foo.txt”的定义不包含任何通配符。


或者,如果您想要使用定义顺序,则可以使用alternatives函数,该函数使用“ first-wins”匹配语义:

alternatives $ do
    "hello.*" %> \out -> writeFile' out "hello.*"
    "*.txt" %> \out -> writeFile' out "*.txt"

hello.txt将匹配第一个规则,因为它是先前定义的。

最后,您可以使用priority函数直接分配规则的优先级:

priority 4 $ "hello.*" %> \out -> writeFile' out "hello.*"
priority 8 $ "*.txt" %> \out -> writeFile' out "*.txt"

hello.txt将匹配第二个规则,因为它具有更高的优先级。