GNU make中生成文件被删除时如何触发哨兵目标重建
解决方案
方案1:兼容所有版本GNU make的哨兵改进写法
你只需要在原有规则基础上增加一行空规则声明所有输出文件即可,修改后的完整规则如下:
GEN_READY : $(gen_input_files) gen.exe $(gen_input_files) touch GEN_READY $(gen_output_files): GEN_READY # 新增下面这行,给所有输出文件声明空规则,告诉make如果输出文件不存在就需要重建 $(gen_output_files): ;
原理是:如果一个目标只有依赖没有命令,或是空规则,make发现目标文件不存在时,就会触发它的依赖的重建逻辑,也就是重新执行GEN_READY对应的生成命令,运行生成器重新生成所有输出,再更新哨兵文件。同时这个写法不会破坏你原有生成器仅修改内容变更文件的特性,不会导致多余的后续编译动作。
方案2:GNU make 4.3及以上版本的分组目标写法
如果你的构建环境可以保证GNU make版本不低于4.3,可以不用哨兵文件,直接用GNU make新增的&:分组目标语法,专门用来处理单次命令生成多个输出文件的场景,写法更简洁:
# &: 表示后面所有文件都是这一条命令生成的输出 $(gen_output_files) &: $(gen_input_files) gen.exe $(gen_input_files)
这种写法原生支持输出文件缺失检测,只要任意一个输出文件不存在,或者输出文件的时间戳早于输入文件,make就会自动执行生成器命令重新生成所有输出。
内容的提问来源于stack exchange,提问作者vjalle
相关产品推荐
相关产品推荐

