如何使用GNU make的隐式规则从`foo.s`制作`foo`?

时间:2017-07-18 10:17:33

标签: makefile gnu-make

这是我的makefile:

AS=nasm
ASFLAGS=-f elf64

%: %.o
        ${LD} -o $@ $<

假设我有一个源文件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 foo,则会使用cc

$ 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 foofoo.o开始foo.s,然后从foo foo.o自动生成evaluateJavaScript

2 个答案:

答案 0 :(得分:1)

您可以使用以下命令清除默认隐式规则:

%: %.s

请参阅制作手册中的Canceling Implicit Rules

答案 1 :(得分:0)

您可以替换:

%: %.o
    ${LD} -o $@ $<

由:

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

$(ASEXES): %: %.o
    ${LD} -o $@ $<

这是一个Static Pattern Rule。对于$(ASEXES)中的每个单词,它实例化一个显式规则,而不是一个模式规则。因此,它的处理方式与您明确写明的一样:

foo: foo.o
    ${LD} -o $@ $<

表示foo中的每个$(ASEXES),而模式规则如下:

%: %.o
        ${LD} -o $@ $<

的处理方式不同(请参阅GNU制作手册中标题为Static Pattern Rules versus Implicit Rules的部分)。