2

所以我在这里有一个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 如何选择使用哪个规则呢?它会选择最具体的规则吗?

4

1 回答 1

2

取决于make的版本。例如,在 3.82 之前的 GNU make 中,它会按照声明的顺序搜索模式,并简单地使用第一个匹配的模式,而不管具体性如何。在 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).
于 2012-05-18T16:36:59.300 回答