Linux下Makefile变更无法触发.sw_ver.txt自动重建问题求助
解决方案
核心问题根因
- 你没有显式定义
MAKEFILE变量:make本身不会自动生成该变量指向当前Makefile,导致.sw_ver.txt的依赖项为空,自然无法检测到Makefile的变更 - 变量引用语法错误:make中取变量值需要使用
$(变量名)格式,你写的$APPVER会被解析为取变量A的值后拼接PPVER字符串,根本拿不到正确的版本参数
基础修正实现
APPVER=5.01 REL=B # 显式指定当前Makefile为依赖文件 MAKEFILE := Makefile $(APP): $(OBJS) $(MAKEFILE) .sw_ver.txt $(LD) $(OBJS) $(LDFLAGS) -o $@ .sw_ver.txt: $(MAKEFILE) echo $(APPVER) > $@ echo " " >> $@ echo $(REL) >> $@
修正后只要Makefile发生变更,就会触发.sw_ver.txt的重建,符合你的需求。
进阶优化(可选)
上面的实现只要Makefile变更就会重写.sw_ver.txt,哪怕你改的内容和版本参数无关,也会触发后续APP的重链接。可以加一层内容比对逻辑,只有版本参数真的变化时才更新文件:
.sw_ver.txt: $(MAKEFILE) @echo $(APPVER) > $@.tmp @echo " " >> $@.tmp @echo $(REL) >> $@.tmp @cmp -s $@ $@.tmp && rm -f $@.tmp || mv -f $@.tmp $@
该逻辑会先生成临时文件,和已有文件比对内容完全一致就丢弃临时文件,只有内容变化才替换,进一步减少不必要的构建步骤。
多配置文件场景适配
如果你的版本参数存放在单独的mk配置文件(通过include引入到主Makefile),只需要把所有可能修改版本参数的文件都加到依赖里即可:
# 所有涉及版本配置的Make类文件 SW_VER_DEPS := Makefile config/version.mk config/build.mk .sw_ver.txt: $(SW_VER_DEPS) # 同上的生成逻辑
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

