make如何选择使用哪个规则

时间:2012-05-18 16:28:27

标签: makefile

所以我在这里有一个类似于

的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 $^ $@

我的问题是,第二次安装显然是第一个的超集, 但我想第一个先跑,所以第二个被忽略。 然而,第二个也不是第三个的完整超集吗?

那么如何选择使用哪个规则?它选择最具特色的规则吗?

1 个答案:

答案 0 :(得分: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).