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



我今天刚开始学习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

当我向shell键入make时,输出如下

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 $@

但是,在你走上vpath之路之前,请阅读makefiles的第三条规则。。。

另一件你应该注意的事情——对于

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

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

最新更新