2017-07-18 74 views
0

這裏是我的makefile:如何使用GNU make的隱式規則從`foo.s`創建`foo`?

AS=nasm 
ASFLAGS=-f elf64 

%: %.o 
     ${LD} -o [email protected] $< 

假設我有一個源文件foo.s,我可以運行make foo.o然後make foo使可執行foo

$ make foo.o 
nasm -f elf64 -o foo.o foo.s 
$ make foo 
ld -o foo foo.o 

但是,如果我直接運行make foocc來代替。

$ rm foo foo.o 
$ make foo 
cc -f elf64 foo.s -o foo 
cc: error: elf64: No such file or directory 
cc: error: unrecognized command line option ‘-f’ 
make: *** [<builtin>: foo] Error 1 

這在the documentation說明的,在「鏈接的單個對象文件」的部分的端部。

我應該如何寫我的makefile文件,這樣我可以運行make foo使從foo.sfoo.o然後從foo.o自動foo

回答

1

您可以清除默認隱含規則。

0

您可以取代:

%: %.o 
    ${LD} -o [email protected] $< 

由:

ASEXES := $(patsubst %.s,%,$(wildcard *.s)) 

$(ASEXES): %: %.o 
    ${LD} -o [email protected] $< 

這是一個Static Pattern Rule。對於$(ASEXES)中的每個單詞,它會實例化一個顯式規則,而不是模式規則。因此,它是精確治療,如果你曾明確寫道:

foo: foo.o 
    ${LD} -o [email protected] $< 

$(ASEXES)每個foo,而像模式規則:

%: %.o 
     ${LD} -o [email protected] $< 

區別對待(見題爲GNU的Static Pattern Rules versus Implicit Rules節使手動)。

%: %.s 

看到化妝手冊Canceling Implicit Rules

+0

它確實有效。你願意解釋爲什麼嗎? – TheoYou

+0

我添加了GNU make手冊的鏈接 –

相關問題