使用 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
目标,它 运行 本身就是编译命令。
今天才开始学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
目标,它 运行 本身就是编译命令。