如何获取 SCons 中重建后将要编译的 File 对象?

问题描述 投票:0回答:1

我必须处理一些编译过程中生成的日志文件。

因为某些编译器会将错误附加到先前版本中创建的日志中,所以如果要再次编译该文件,我必须删除先前版本中生成的错误日志文件。

我需要在重建期间编译的文件对象列表。目前构建器返回所有要编译的文件。

使用 SCons 可以实现这一目标吗?

scons
1个回答
2
投票

你处理问题的角度很快就会导致你陷入 SCons 内部的“兔子洞”。

这里的要点是:SCons 不知道你的日志文件,所以你必须教它。以某种方式,您必须将这些构建步骤标记(或标记)为特殊的,以便 SCons 知道:“啊哈,当我执行此操作以从

foo.o
创建
foo.cpp
...还有一个
foo.log
之后我需要知道这件事。”

这就是方法

SideEffect()
Clean()
的用途(请参阅 UserGuideMAN page)。前者专门针对多个构建步骤写入额外(日志)文件但它们都使用相同文件名的情况。因此,即使使用“
-j
”选项调用 SCons,单个构建步骤也需要按顺序运行。 您没有提供任何有关您目前是否属于这种情况的进一步信息,但我认为情况并非如此......因此根本不需要 SideEffect 来解决您的问题:

./runme.sh
==========
#!/bin/sh

cp $1 $2
echo "Hi there" >> out.log

./SConstruct
============
env = Environment()
t = env.Command('out.txt', 'in.txt', './runme.sh $SOURCE $TARGET')
env.Clean(t, 'out.log')

通过添加

Clean()
规范,SCons 知道当实际目标
out.log
cleaned
时,它也必须删除文件 out.txt。 如果对每个编译命令执行此操作被证明太麻烦,您可以为其编写一个小的 Python 包装方法,甚至编写您自己的“伪生成器”。您可以在我们的ToolsForFools Guide中找到有关后者的更多信息和指南。 是的,您必须显式调用“
scons -c
”来清理日志文件和所有目标...SCons 不会在每次重建时自动删除日志文件,因为它不知道这是什么你要。您(或其他用户)可能想要连接多个构建的日志输出,那么 SCons 如何知道?

详细说明您实际提出的问题,SCons 所知道的只是有一个目标文件和一个源文件。如果源文件已更改(不是最新的)或目标尚不存在,则它知道可以执行以构建目标的操作列表。这可以是单个字符串,也可以是 Python 函数,也可以是这些字符串的组合列表。但没有进行语义分析,SCons 试图找出这些单个操作的含义。尝试“猜测”,因为涉及可执行文件“

gcc
”,所以它一定是编译步骤,这是一种过于简单的方法。如果有人使用任意命名的链接到他的编译器怎么办?交叉编译怎么样,跨越不同编译器名称的巨大树来满足所有不同的目的?像 Insure++ 这样的性能分析和内存检查工具怎么样,你必须调用“
insure gcc
”来代替? 最后,当只能查看我给你的命令行时,你将如何定义“编译”? ;)

© www.soinside.com 2019 - 2024. All rights reserved.