SCons 和 Make 一样,使用声明性方法来解决构建问题。你不想告诉 SCons 如何完成它的工作。您想记录所有依赖项,然后让 SCons 解决它如何构建所有内容。
如果某事在其他事之前被执行,您需要创建并连接依赖项。
如果要创建 dmy touch 文件,可以创建自定义构建器,例如:
import time
def action(target, source, env):
os.system('echo here I am running other build')
dmy_fh = open('dmy_file','w')
dmy_fh.write( 'Dummy dependency file created at %4d.%02d.%02d %02dh%02dm%02ds\n'%time.localtime()[0:6])
dmy_fh.close()
bldr = Builder(action=action)
env.Append( BUILDERS = {'SubBuild' : bldr } )
env.SubBuild(srcs,tgts)
将时间戳放入虚拟文件非常重要,因为 scons 使用 md5 哈希。如果您有一个空文件,则 md5 将始终相同,并且它可能决定不执行后续构建步骤。如果您需要对基本命令进行不同的调整,可以使用函数工厂来修改模板。例如
def gen_a_echo_cmd_func(echo_str):
def cmd_func(target,source,env):
cmd = 'echo %s'%echo_str
print cmd
os.system(cmd)
return cmd_fun
bldr = Builder(action = gen_a_echo_cmd_func('hi'))
env.Append(BUILDERS = {'Hi': bldr})
env.Hi(srcs,tgts)
bldr = Builder(action = gen_a_echo_cmd_func('bye'))
env.Append(BUILDERS = {'Bye': bldr})
env.Bye(srcs,tgts)
如果您有一些想要自动注入到 scons 构建流程中的内容(例如,在其他所有内容运行后压缩所有构建日志文件的内容),请在此处查看我的问题。