SCons 如何检测 SConstruct 脚本中的变化?
How can SCons detect changes in SConstruct script?
我想要基于 SConstruct 文件中分配的变量构建文件。如本例所示:
import os
env = Environment(ENV = os.environ)
def text_file_maker(target, source, env):
with open(str(target[0]), "w") as text_file:
text_file.write(env['my_text'])
return 0
env.Append( BUILDERS = {'Make_text' : Builder(action = text_file_maker)})
env.Make_text(target = 'sour.txt',
source = None,
my_text = 'lemon')
env.Make_text(target = 'sweet.txt',
source = None,
my_text = 'apple')
运行 该脚本生成两个文本文件,内容为 'lemon' 和 'apple'。如果我再次 运行 运行脚本,SCons 会正确检测到目标存在:
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
scons: done building targets.
现在,如果我要更改一个目标,例如:
env.Make_text(target = 'sweet.txt',
source = None,
my_text = 'orange')
和运行脚本,我会得到scons: '.' is up to date.
,内容'orange'没有写入sweet.txt。
我可以指定一个依赖项:
Depends(['sweet.txt', 'sour.txt'], 'SConstruct')
但这会强制重建我的 SConstruct 脚本中的任何更改。
如何让 SCons 识别 SConstruct 脚本中影响目标的更改?
这可能是一个非常简单的问题,如果我遗漏了一些明显的问题,请原谅。
您的示例与联机帮助页中的答案非常相似(搜索 "Action Objects"):
https://scons.org/doc/production/HTML/scons-man.html
第三个和后续参数(如果存在)可以是构造变量或构造变量列表,在决定是否应因操作更改而重建目标时,其值将包含在操作的签名中。 变量也可以通过 varlist= 关键字参数指定;如果两者都存在,则将它们合并。当您希望在特定构造变量更改时重建目标时,这是必需的。字符串操作通常不需要这样做,因为扩展变量通常是命令行的一部分,但如果 Python 函数操作在生成命令行时使用构造变量的值,则可能需要这样做。
def build_it(target, source, env):
# build the target from the 'XXX' construction variable
open(target[0], 'w').write(env['XXX'])
return 0
# Use positional arguments.
a = Action(build_it, '$STRINGIT', ['XXX'])
# Alternatively, use a keyword argument.
a = Action(build_it, varlist=['XXX'])
所以在你的情况下改变:
env.Append( BUILDERS = {'Make_text' : Builder(action = text_file_maker)})
到
tfb_action = Action(text_file_maker, varlist=['my_text'])
env.Append( BUILDERS = {'Make_text' : Builder(action = tfb_action)})
我想要基于 SConstruct 文件中分配的变量构建文件。如本例所示:
import os
env = Environment(ENV = os.environ)
def text_file_maker(target, source, env):
with open(str(target[0]), "w") as text_file:
text_file.write(env['my_text'])
return 0
env.Append( BUILDERS = {'Make_text' : Builder(action = text_file_maker)})
env.Make_text(target = 'sour.txt',
source = None,
my_text = 'lemon')
env.Make_text(target = 'sweet.txt',
source = None,
my_text = 'apple')
运行 该脚本生成两个文本文件,内容为 'lemon' 和 'apple'。如果我再次 运行 运行脚本,SCons 会正确检测到目标存在:
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
scons: done building targets.
现在,如果我要更改一个目标,例如:
env.Make_text(target = 'sweet.txt',
source = None,
my_text = 'orange')
和运行脚本,我会得到scons: '.' is up to date.
,内容'orange'没有写入sweet.txt。
我可以指定一个依赖项:
Depends(['sweet.txt', 'sour.txt'], 'SConstruct')
但这会强制重建我的 SConstruct 脚本中的任何更改。
如何让 SCons 识别 SConstruct 脚本中影响目标的更改?
这可能是一个非常简单的问题,如果我遗漏了一些明显的问题,请原谅。
您的示例与联机帮助页中的答案非常相似(搜索 "Action Objects"):
https://scons.org/doc/production/HTML/scons-man.html
第三个和后续参数(如果存在)可以是构造变量或构造变量列表,在决定是否应因操作更改而重建目标时,其值将包含在操作的签名中。 变量也可以通过 varlist= 关键字参数指定;如果两者都存在,则将它们合并。当您希望在特定构造变量更改时重建目标时,这是必需的。字符串操作通常不需要这样做,因为扩展变量通常是命令行的一部分,但如果 Python 函数操作在生成命令行时使用构造变量的值,则可能需要这样做。
def build_it(target, source, env):
# build the target from the 'XXX' construction variable
open(target[0], 'w').write(env['XXX'])
return 0
# Use positional arguments.
a = Action(build_it, '$STRINGIT', ['XXX'])
# Alternatively, use a keyword argument.
a = Action(build_it, varlist=['XXX'])
所以在你的情况下改变:
env.Append( BUILDERS = {'Make_text' : Builder(action = text_file_maker)})
到
tfb_action = Action(text_file_maker, varlist=['my_text'])
env.Append( BUILDERS = {'Make_text' : Builder(action = tfb_action)})