这是我的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 foo
从foo.o
开始foo.s
,然后从foo
foo.o
自动生成evaluateJavaScript
?
答案 0 :(得分:1)
答案 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的部分)。