You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:32:23