修改Stage1引导程序源码后Makefile不自动重新编译问题
问题:修改Stage1引导程序后Makefile未重新编译
我正在开发一款小型操作系统,但修改Stage1引导程序的源码文件后,Makefile并未对其进行重新编译。运行Makefile时的输出显示,Make甚至未执行Stage1的构建流程。
相关文件内容
主Makefile
# Tools ASM = nasm # Directories SRC_DIR = src TARGET_DIR = build TARGET = $(TARGET_DIR)/OS.img OBJ_DIR = $(TARGET_DIR)/obj .PHONY: all image bootloader run clean all: image image: $(TARGET) $(TARGET): $(TARGET_DIR) bootloader bootloader: stage1 stage2 stage1: $(TARGET_DIR)/bl_stage1.bin $(TARGET_DIR)/bl_stage1.bin: @echo "Building bl_stage1.bin" $(MAKE) -C $(SRC_DIR)/bootloader/stage1 TARGET_DIR=$(abspath $(TARGET_DIR)) stage2: $(TARGET_DIR)/bl_stage2.bin $(TARGET_DIR)/bl_stage2.bin: @echo "Building bl_stage2.bin" $(MAKE) -C $(SRC_DIR)/bootloader/stage2 TARGET_DIR=$(abspath $(TARGET_DIR)) $(TARGET_DIR): mkdir -p $(TARGET_DIR) $(OBJ_DIR): mkdir -p $(OBJ_DIR) run: $(TARGET) qemu-system-i386 -fda $(TARGET) clean: $(TARGET_DIR) rm -rf $(TARGET_DIR)
Stage1的Makefile
TARGET_DIR?=build/ ASM?=nasm .PHONY: all all: stage1 stage1: $(TARGET_DIR)/bl_stage1.bin $(TARGET_DIR)/bl_stage1.bin: ./bootloader.asm $(ASM) ./bootloader.asm -f bin -o $(TARGET_DIR)/bl_stage1.bin
运行Makefile的输出
Building bl_stage2.bin make -C src/bootloader/stage2 TARGET_DIR=/home/setorano/dev/CentralOS/build make[1]: Entering directory '/home/setorano/dev/CentralOS/src/bootloader/stage2' make[1]: Nothing to be done for 'all'. make[1]: Leaving directory '/home/setorano/dev/CentralOS/src/bootloader/stage2'
问题原因
主Makefile中,$(TARGET_DIR)/bl_stage1.bin目标没有声明依赖的源文件$(SRC_DIR)/bootloader/stage1/bootloader.asm。Make的核心逻辑是:若目标文件已存在,且没有比它更新的依赖文件,就会跳过该目标的构建流程。因此即便修改了Stage1的源码,主Makefile无法感知到变化,自然不会触发子Makefile的执行。
修复方案
修改主Makefile,给$(TARGET_DIR)/bl_stage1.bin目标添加对应的源文件依赖,让Make能检测到源码变化并触发重新编译:
# 替换原有的$(TARGET_DIR)/bl_stage1.bin目标定义 $(TARGET_DIR)/bl_stage1.bin: $(SRC_DIR)/bootloader/stage1/bootloader.asm @echo "Building bl_stage1.bin" $(MAKE) -C $(SRC_DIR)/bootloader/stage1 TARGET_DIR=$(abspath $(TARGET_DIR))
修改后,当bootloader.asm文件被修改时,主Makefile会检测到该文件比bl_stage1.bin更新,从而执行该目标的命令,调用Stage1的子Makefile重新编译生成新的bl_stage1.bin。
内容的提问来源于stack exchange,提问作者setorano
相关产品推荐
相关产品推荐

