如果我对*.o
对象文件有通用的构建规则,但对foo.o
对象文件有更特定的构建规则,那么定义顺序重要吗?
答案 0 :(得分:1)
如%>
运算符的文档中所述:
没有通配符的模式比具有通配符的模式具有更高的优先级,并且系统要求的任何文件都不能由多个具有相同优先级的模式进行匹配(请参见
priority
和alternatives
进行修改行为)。
因此定义顺序无关紧要,但是文件不能以相同的优先级匹配多个规则。
因此,在*.o
和foo.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
将匹配第二个规则,因为它具有更高的优先级。