gpt4 book ai didi

scons - 获取 scons 以在重建时区分空源和不存在的源

转载 作者:行者123 更新时间:2023-12-05 08:04:19 27 4
gpt4 key购买 nike

在构建我的程序时,区分不存在的文件和空文件很重要。但是,scons 似乎对它们一视同仁,并且在源文件从这些状态之一更改为另一种状态时忽略了重建目标。


逐步示例:

第 0 步:

构造

foo = Command('foo', [], 'echo $TARGET is not created here!')
bar = Command('bar', foo, 'touch $TARGET ; test -f $SOURCE')
Default(bar)

结果:

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
echo foo is not created here!
foo is not created here!
touch bar ; test -f foo
scons: *** [bar] Error 1
scons: building terminated because of errors.

我的解释:

foo 的命令无法创建文件,但它不会引发错误,因此运行 bar 的命令。它检查 foo 是否存在并返回错误。构建失败(到目前为止一切如预期)。

第 1 步:

构造:

foo = Command('foo', [], 'touch $TARGET')
bar = Command('bar', foo, 'touch $TARGET ; test -f $SOURCE')
Default(bar)

结果:

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
touch foo
touch bar ; test -f foo
scons: done building targets.

我的解释:

foo 被重建,因为它已经改变。这次它创建了一个空文件。 bar 正在重建,因为它之前失败了。这次成功了。构建成功(仍然符合预期)。

第 2 步:

构造

foo = Command('foo', [], 'echo $TARGET is not created here!')
bar = Command('bar', foo, 'touch $TARGET ; test -f $SOURCE')
Default(bar)

结果:

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
echo foo is not created here!
foo is not created here!
scons: `bar' is up to date.
scons: done building targets.

我的解释:

foo 被重建,因为它又发生了变化(恢复到以前的版本)。文件 foo 不再存在,因为 scons 在构建文件之前删除文件并且命令无法重新创建它。 bar 没有重建,因为 scons 似乎没有检测到源文件中的更改。构建成功但不应该成功!


如何在最后一步强制 scons 重建 bar

该解决方案应该可以很好地扩展到生成许多文件的“foo”命令,这些文件的列表是在 SConscript 中以编程方式生成的,不能硬编码。

最佳答案

顺便说一句,scons 现在确实区分 emtpy 和不存在,这是最近的更改(提交 3b7f8b4ce0,github.com/SCons/scons/pull/3833)。

关于scons - 获取 scons 以在重建时区分空源和不存在的源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69427947/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com