所以我这里有一个makefile,看起来像这样
ALL_FILES=$(shell find . -name '*')
install : $(ALL_FILES)
$(INSTALL_LOCATION)/%.sh : %.sh ; /bin/usr/install -D $^ $@
$(INSTALL_LCOATION)/% : % ; /usr/bin/install -D $^ $@
$(INSTALL_LOCATION)/dir1/% : dir1/% ; /usr/bin/install -D $^ $@我的问题是,第二次安装显然是第一次的超集,但我猜第一次是先运行的,所以第二次被忽略了。然而,第二个不是也是第三个的完全超集吗?
那么make如何选择要使用的规则呢?它会选择最具体的规则吗?
发布于 2012-05-19 00:36:59
取决于make的版本。例如,在GNU make 3.82之前的版本中,它将按照模式被声明的顺序搜索模式,并简单地使用第一个匹配的模式,而不考虑特异性。在3.82及更高版本中,GNU make使用最具体的规则,而不考虑声明顺序。下面是一个简单的例子:
all: sub/foo.x
%.x:
@echo "Prefer first match (stem is $*)."
sub/%.x:
@echo "Prefer most specific match (stem is $*)."将输出与gmake 3.81和gmake 3.82进行比较:
$ gmake-3.81
Prefer first match (stem is sub/foo).
$ gmake-3.82
Prefer most specific match (stem is foo).https://stackoverflow.com/questions/10656363
复制相似问题