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

ここでの私の質問は、2番目のインストールには明らかに最初のインストールのスーパーセットがありますが、最初のインストールが最初に実行されるため、2番目のインストールは無視されます。しかし、2番目のものも3番目のものの完全なスーパーセットではないでしょうか?

では、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 $*)."

出力をgmake3.81およびgmake3.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 に答える