2016-02-01 64 views
1

我有這個測試的Makefile運行正常。它產生三個符號鏈接,並且只是回顯鏈接名稱(這只是象徵編譯過程)。爲什麼這個規則在這個Makefile中與位置有關?真奇怪

ARCH = o-optimize 
PGM = $(ARCH)/sieve.exe 

all: ${ARCH} $(PGM) 

$(ARCH): 
    test -d ${ARCH} || mkdir $(ARCH) 

$(PGM): $(XXX) 
    echo gathering $(XXX) 

clean: 
    rm -fr $(ARCH) 
    rm -f $(XXX) 

XXX = init.c system.h config.h 

$(XXX) : 
    ln -s ../src/[email protected] [email protected] 

下面是結果。

[email protected]:~/test] make clean 
rm -fr o-optimize 
rm -f init.c system.h config.h 
[email protected]:~/test] make 
test -d o-optimize || mkdir o-optimize 
echo gathering init.c system.h config.h 
gathering init.c system.h config.h 

但是,如果我將XXX定義和符號鏈接生成規則移到頂部,則不起作用。更改的Makefile:

XXX = init.c system.h config.h 

$(XXX) : 
    ln -s ../src/[email protected] [email protected] 

ARCH = o-optimize 
PGM = $(ARCH)/sieve.exe 

all: ${ARCH} $(PGM) 

$(ARCH): 
    test -d ${ARCH} || mkdir $(ARCH) 

$(PGM): $(XXX) 
    echo gathering $(XXX) 

clean: 
    rm -fr $(ARCH) 
    rm -f $(XXX) 

而結果:

[email protected]:~/test] make clean 
rm -fr o-optimize 
rm -f init.c system.h config.h 
[email protected]:~/test] make 
ln -s ../src/init.c init.c 

爲什麼在XXX的定義和規則的位置關係嗎? XXX代表三個文件名,但只有第一個文件的符號鏈接正在製作。

回答

1

manual解釋:

規則的順序並不顯著,除了確定 默認目標:爲make目標來考慮,如果不另行指定一個。默認目標是第一個makefile中第一個 規則的目標。

換句話說,$(XXX)正被視爲默認目標,而不是all。你的makefile的其餘部分甚至沒有運行。

有兩種方法解決此問題:

  1. 明確指定目標:make all

  2. 使用.DEFAULT_GOAL

    .DEFAULT_GOAL:=所有

+0

好吧,這是正確的。 (其實我知道這個規則,但錯過了這一點)。但在我的情況下更大的問題是爲什麼符號鏈接生成配方製作第一個符號鏈接而不是全部三個鏈接? –