我很难控制何时在scons中构建文件。我有一个非常简单的构建树示例(见下文),其中Poem
构建器只接受.txt
文件,并在相应的.eectxt
文件中将其转换为小写。
在我的SConstruct和SConscript文件中,我声明了3个.txt文件的依赖项。
但是我无法弄清楚是什么将这些放入默认构建中!
sconstest/
SConstruct
tiger.txt
src/
SConscript
hope.txt
jabberwocky.txt
其中* .txt文件是诗歌,我的SConstruct和SConscript看起来像这样:
SConstruct:
env = Environment();
def eecummings(target, source, env):
if (len(target) == 1 and len(source) == 1):
with open(str(source[0]), 'r') as fin:
with open(str(target[0]), 'w') as fout:
for line in fin:
fout.write(line.lower());
return None
env['BUILDERS']['Poem'] = Builder(action=eecummings, suffix='.eectxt', src_suffix='.txt');
Export('env');
poems = SConscript('src/SConscript');
tigerPoem = env.Poem('tiger.txt');
的src / SConscript:
Import('env');
input = ['jabberwocky.txt', 'hope.txt'];
output = [env.Poem(x) for x in input];
Return('output');
我想要做的是声明.eectxt
文件与相应.txt
文件的相关性,但不会导致它们被构建,除非我明确地将它们进入SConstruct文件中的Default()
版本,或者我在命令行显式请求它们。
我该怎么做?
答案 0 :(得分:1)
默认情况下,目录取决于驻留在其中的所有文件和/或目标。 所以跑步:
scons
然后将在当前目录下构建所有目标。
答案 1 :(得分:0)
我想出了如何做我想做的事,但我仍然不明白为什么我需要这样做。接受解释它的第一个体面的答案。
如果我将以下内容添加到根SConstruct文件中,那么这是有效的:
env.Ignore('.', tigerPoem);
env.Ignore('src', poems);
env.Alias('poems', [tigerPoem]+poems);
这忽略了默认目标中的3首诗,然后将它们添加为别名为“诗歌”的目标,所以如果我运行scons
它没有构建任何东西,但如果我运行scons poems
它会构建文件。
为什么这样做?为什么调用env.Poem(...)
会向默认目标添加内容?