使用 make 编译不同子目录下的多个相同类型的文件?

Using make to compile several files of the same type which are under different subdirectories?

今天才开始学make。我有几个要编译的程序集文件,然后将它们合并成一个文件。现在我的树中有两个文件,但 makefile 代码应该能够处理更多文件。所以这是文件的样子。

Src/Boot/MBR.asm

Src/Boot/SecondStage/Bootloader.asm

我想将这些文件中的每一个都编译到 makefile 所在的 Bin/ 目录中,文件的结尾应该是这样的

Bin/MBR.bin

Bin/Bootloader.bin

那我就把这两个文件合并成一个文件os-image.img

到目前为止我想出了以下内容

AS := nasm
ASFLAGS_BIN := -fbin

SRCDIR := Src
BINDIR := Bin

BOOTASM = $(shell find $(SRCDIR) -name '*.asm')
BOOTBIN = $(addprefix $(BINDIR)/, $(addsuffix .bin, $(basename $(notdir $(BOOTASM)))))


build: clean compile 
    cat $(BOOTBIN) > Bin/os-image.img

compile: $(BOOTBIN)

$(BOOTBIN) : $(BOOTASM)
    $(AS) $(ASFLAGS_BIN) $< -o $@

clean:
    rm -rf $(BINDIR)/%.bin

当我输入 make 到 shell 时的输出如下

rm -rf Bin/%.bin
nasm -fbin Src/Boot/second/Bootloader.asm -o Bin/Bootloader.bin
nasm -fbin Src/Boot/second/Bootloader.asm -o Bin/MBR.bin
cat Bin/Bootloader.bin Bin/MBR.bin > Bin/os-image.img

预期输出为:

rm -rf Bin/%.bin
nasm -fbin Src/Boot/second/Bootloader.asm -o Bin/Bootloader.bin
nasm -fbin Src/Boot/second/MBR.asm -o Bin/MBR.bin
cat Bin/Bootloader.bin Bin/MBR.bin > Bin/os-image.img

很明显问题出在这里

$(BOOTBIN) : $(BOOTASM)
    $(AS) $(ASFLAGS_BIN) $< -o $@

但是我不明白我应该如何实现我想要的,因为我对此非常缺乏经验。

所以问题是:

我应该如何获得与相关目标相对应的每个先决条件?或类似的东西。

提前致谢。

您可以使用 VPATH --

BOOTASM = $(shell find $(SRCDIR) -name '*.asm')
BOOTBIN = $(addprefix $(BINDIR)/, $(addsuffix .bin, $(basename $(notdir $(BOOTASM)))))
VPATH=$(sort $(dir $(BOOTASM))

$(BOOTBIN) : %.bin : %.asm
    $(AS) $(ASFLAGS_BIN) $< -o $@

但是,请阅读 third rule of makefiles,然后再深入 vpath 道路...

你应该注意的另一件事 --

build: clean compile 
    cat $(BOOTBIN) > Bin/os-image.img

那么 clean 不能保证在 compile 之前 运行(事实上,在并行系统上,它们可能同时尝试 运行。 ..).显然这不是你想要的。要么使编译依赖于清理(但每次你尝试编译时它都会清理),要么创建一个单独的 clean_then_compile : clean 目标,它 运行 本身就是编译命令。