如何在SCons中表示对可选文件的依赖?
为SCons添加可选文件的依赖方案
要让SCons追踪可能存在/不存在的可选文件(比如.processorrc),确保该文件创建、修改、删除时都能触发目标重建,可采用以下两种方法:
方法一:标记文件追踪全状态(推荐)
这种方案能覆盖文件的所有状态变化(创建、修改、删除),核心是通过一个标记文件记录可选配置文件的状态,让目标依赖这个标记文件。
实现代码
import os from SCons.Script import Environment def update_rc_timestamp(env, target, source): rc_file = ".processorrc" stamp_file = str(target[0]) # 获取当前配置文件的状态:存在性+修改时间 current_exists = os.path.exists(rc_file) current_mtime = os.path.getmtime(rc_file) if current_exists else 0 # 读取标记文件中记录的上一次状态 prev_exists = False prev_mtime = 0 if os.path.exists(stamp_file): with open(stamp_file, 'r') as f: data = f.read().strip().split(',') if len(data) == 2: prev_exists = data[0] == 'True' prev_mtime = float(data[1]) # 状态变化则更新标记文件 if current_exists != prev_exists or current_mtime != prev_mtime: with open(stamp_file, 'w') as f: f.write(f"{current_exists},{current_mtime}") return 0 env = Environment() # 创建标记文件的构建规则,每次构建都检查配置文件状态 rc_stamp = env.Command(".processorrc.stamp", [], update_rc_timestamp) env.AlwaysBuild(rc_stamp) # 定义你的自定义构建器 my_builder = env.Builder(action="processor < $SOURCE > $TARGET") env.Append(BUILDERS={'MyBuilder': my_builder}) # 绑定目标与标记文件的依赖关系 output = env.MyBuilder("output.txt", "input.txt") env.Depends(output, rc_stamp)
原理说明
- 标记文件
.processorrc.stamp会记录.processorrc的存在状态和修改时间 AlwaysBuild确保每次构建都执行状态检查,捕捉文件删除的情况- 只要
.processorrc的状态发生变化,标记文件就会更新,进而触发目标重建
方法二:直接依赖可选文件(仅覆盖创建/修改)
如果不需要处理文件删除的场景,仅需追踪文件的创建和修改,可直接将可选文件作为依赖:
实现代码
from SCons.Script import Environment env = Environment() # 定义自定义构建器 my_builder = env.Builder(action="processor < $SOURCE > $TARGET") env.Append(BUILDERS={'MyBuilder': my_builder}) # 获取可选配置文件节点 processorrc = env.File(".processorrc") # 构建目标并绑定依赖 output = env.MyBuilder("output.txt", "input.txt") env.Depends(output, processorrc)
局限
这种方式下,当.processorrc被创建或修改时会触发重建,但文件被删除时,SCons无法自动感知并触发重建(因为它仅追踪已存在的文件)。
内容的提问来源于stack exchange,提问作者zapta
相关产品推荐
相关产品推荐

