GNU make 3.81下,头文件变更时如何触发脚本自动执行?
解决Makefile自动触发脚本的问题
核心问题分析
你当前的Makefile存在依赖关系完全搞反的问题:你需要从partition_map.h生成flash_map.ld,但原规则却把partition_map.h作为生成目标,导致每次make都会执行脚本(因为这个规则没有依赖,make会默认尝试更新它)。同时,链接脚本flash_map.ld没有和partition_map.h建立依赖,所以无法触发增量更新。
修正后的Makefile实现
假设你的$(LD_FILE)就是flash_map.ld,$(MAP_FILE)对应partition_map.h,$(LINKER_INC_FILE)对应生成的链接脚本,修正后的代码如下:
all: $(LD_FILE) $(BIN) show.options # 关键规则:链接脚本依赖头文件,头文件变更时自动重新生成脚本 $(LD_FILE): partition_map.h @echo "++++ 从partition_map.h生成flash_map.ld ++++" @$(PYTHON) $(PY_BUILD_LINKER) $(MAP_FILE) $(LINKER_INC_FILE) # 链接目标依赖生成的链接脚本,确保脚本更新后重新链接 $(BIN): $(LIBS) $(OBJ_FILES) $(LD_FILE) @echo "+++ Linking: $@" # 这里保留你的链接命令... # 如果partition_map.h是手动维护的,直接删除下面这个错误规则 # partition_map.h: # @echo "++++ Building flash_map.h ++++" # @$(PYTHON) $(PY_BUILD_LINKER) $(MAP_FILE) $(LINKER_INC_FILE)
关键修正点
- 修正依赖方向:让生成的链接脚本
$(LD_FILE)作为目标,依赖源文件partition_map.h。GNU make会自动对比两者的时间戳,只有当头文件更新时才会执行脚本。 - 移除错误规则:如果
partition_map.h是你手动编写的头文件,务必删除原Makefile中partition_map.h:的生成规则,否则make会持续尝试用脚本覆盖它。 - 确保链接阶段依赖脚本:
$(BIN)已经依赖$(LD_FILE),所以链接阶段会在脚本更新后自动触发,符合你的需求。
验证方式
修改partition_map.h后执行make,会看到脚本被触发;直接执行make(头文件无变更),脚本不会运行,直接进入链接或跳过链接(如果二进制文件也无更新)。
内容的提问来源于stack exchange,提问作者Andrew Coad
相关产品推荐
相关产品推荐

