多个目标的 Makefile(目录中的 asm 文件)

Makefile for multiple targets (glob of asm files in directory)

我是新来的。我在目录中有一堆 FOO.32.asm 和 FOO.64.asm 文件。我想要一个 Makefile,它将 assemble 每个 32.o 到 FOO.32.o 或 FOO.64.o ,然后 link 每个到 FOO.32 或 FOO.64可执行文件。

我想也许静态模式是答案的一部分,比如:

%.32.o : %.32.asm
    nasm -f elf -gstabs $<

%.64.o : $.64.asm
    nasm -f elf64 -gstabs $<

但我不确定如何指定“最终”目标——将依赖目标文件的可执行文件。我想表达如下内容:

%.32 : %.32.o
    gcc -m32 -o %.32 %.o

%.64 : %.32.o
    gcc -o %.64 %.o

有什么想法吗?

首先找到所有源文件:

src32 := $(wildcard *.32.asm)
src64 := $(wildcard *.64.asm)

接下来,创建依赖于目标文件的目标,并有一个依赖于两者的初始规则,因此默认构建两者:

all: output.32 output.64

output.32 : $(src32:.asm=.o)
        gcc -m32 -o $@ $^
output.64 : $(src64:.asm=.o)
        gcc -o $@ $^

并在上面添加您的模式规则:

%.32.o : %.32.asm
        nasm -f elf -gstabs $<

%.64.o : %.64.asm
        nasm -f elf64 -gstabs $<

预计到达时间

如果你想为每个目标文件创建一个二进制文件,这也很简单:

src32 := $(wildcard *.32.asm)
src64 := $(wildcard *.64.asm)

all: $(src32:.asm=) $(src64:.asm=) $(src32:.asm=.o) $(src64:.asm=.o)

%.32 : %.32.o
        gcc -m32 -o $@ $^

%.64 : %.64.o
        gcc -o $@ $^

%.32.o : %.32.asm
        nasm -f elf -gstabs $<

%.64.o : %.64.asm
        nasm -f elf64 -gstabs $<

就是这样!有更奇特的方法可以让您仅使用一种模式规则来构建对象和一种模式规则来构建所有可执行文件,但上面的方法简单易懂。

如果你想保留目标文件来调查它们,你需要将目标文件添加到 all 目标(或者,一些目标:它不一定是 all ), 否则 make 会将它们视为中间文件并自动删除它们。通过将目标文件列为明确的先决条件,make 知道您想保留它们。