如何获取将在 SCons 中重建后编译的 File 对象?
How to get File objects that will be compiled after a rebuild in SCons?
我必须处理编译期间生成的一些日志文件。
因为一些编译器将错误附加到以前构建中创建的日志中,如果要再次编译这些文件,我必须删除在以前构建中生成的错误日志文件。
我需要重建期间编译的文件对象列表。目前构建器return所有要编译的文件。
这可以用 SCons 实现吗?
您正在从一个可以快速进入 SCons 内部结构 "rabbit hole" 的角度解决问题。
这里的要点是:SCons 不知道你的日志文件,所以你必须教它。在某种程度上,您必须将这些构建步骤标记(或标记)为特殊的,以便 SCons 知道:"Aha, when I execute this Action to create foo.o
from foo.cpp
...there is also a foo.log
afterwards and I need to know about it."
这就是方法 SideEffect()
和 Clean()
的用途(参见 UserGuide and MAN page)。前者专门针对多个构建步骤写入一个额外的(日志)文件,但它们都使用相同文件名的情况。因此,即使使用“-j
”选项调用 SCons,单个构建步骤也需要按顺序 运行。
您没有提供任何关于您目前是否属于这种情况的进一步信息,但我认为不是...所以根本不需要 SideEffect 来解决您的问题:
./runme.sh
==========
#!/bin/sh
cp
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.txt
得到 cleaned[=38= 时,它也必须删除文件 out.log
].
如果对每个编译命令都这样做被证明太麻烦,你可以为它写一个小的 Python 包装方法,甚至写你自己的 "pseudo-Builder"。您可以在我们的 ToolsForFools Guide 中找到有关后者的更多信息和指南。
是的,您必须显式调用“scons -c
”来清理日志文件和所有目标...SCons 不会在每次重建时自动删除日志文件,因为它不知道这是你想要的。您(或其他用户)可能想要连接多个构建的日志输出,那么 SCons 怎么知道?
详细说明您实际提出的问题,SCons 只知道有一个目标文件和一个源文件。如果源文件已更改(不是最新的)或目标尚不存在,它会知道可以执行以构建目标的操作列表。这可以是单个字符串,或 Python 函数,或它们的混合列表。但是没有进行语义分析,SCons 试图找出那些单个 Actions mean 的意思。试图"guess",因为涉及可执行文件“gcc
”,它必须是一个编译步骤,是一种过于简单的方法。如果有人对他的编译器使用任意命名的 link 怎么办?交叉编译,为了所有不同的目的跨越一棵巨大的不同编译器名称的树呢?性能分析和内存检查工具(如 Insure++)又如何,您必须在其中调用“insure gcc
”?
最后,当您只能查看我给您的命令行时,您将如何定义 "compiling"? ;)
我必须处理编译期间生成的一些日志文件。
因为一些编译器将错误附加到以前构建中创建的日志中,如果要再次编译这些文件,我必须删除在以前构建中生成的错误日志文件。
我需要重建期间编译的文件对象列表。目前构建器return所有要编译的文件。
这可以用 SCons 实现吗?
您正在从一个可以快速进入 SCons 内部结构 "rabbit hole" 的角度解决问题。
这里的要点是:SCons 不知道你的日志文件,所以你必须教它。在某种程度上,您必须将这些构建步骤标记(或标记)为特殊的,以便 SCons 知道:"Aha, when I execute this Action to create foo.o
from foo.cpp
...there is also a foo.log
afterwards and I need to know about it."
这就是方法 SideEffect()
和 Clean()
的用途(参见 UserGuide and MAN page)。前者专门针对多个构建步骤写入一个额外的(日志)文件,但它们都使用相同文件名的情况。因此,即使使用“-j
”选项调用 SCons,单个构建步骤也需要按顺序 运行。
您没有提供任何关于您目前是否属于这种情况的进一步信息,但我认为不是...所以根本不需要 SideEffect 来解决您的问题:
./runme.sh
==========
#!/bin/sh
cp
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.txt
得到 cleaned[=38= 时,它也必须删除文件 out.log
].
如果对每个编译命令都这样做被证明太麻烦,你可以为它写一个小的 Python 包装方法,甚至写你自己的 "pseudo-Builder"。您可以在我们的 ToolsForFools Guide 中找到有关后者的更多信息和指南。
是的,您必须显式调用“scons -c
”来清理日志文件和所有目标...SCons 不会在每次重建时自动删除日志文件,因为它不知道这是你想要的。您(或其他用户)可能想要连接多个构建的日志输出,那么 SCons 怎么知道?
详细说明您实际提出的问题,SCons 只知道有一个目标文件和一个源文件。如果源文件已更改(不是最新的)或目标尚不存在,它会知道可以执行以构建目标的操作列表。这可以是单个字符串,或 Python 函数,或它们的混合列表。但是没有进行语义分析,SCons 试图找出那些单个 Actions mean 的意思。试图"guess",因为涉及可执行文件“gcc
”,它必须是一个编译步骤,是一种过于简单的方法。如果有人对他的编译器使用任意命名的 link 怎么办?交叉编译,为了所有不同的目的跨越一棵巨大的不同编译器名称的树呢?性能分析和内存检查工具(如 Insure++)又如何,您必须在其中调用“insure gcc
”?
最后,当您只能查看我给您的命令行时,您将如何定义 "compiling"? ;)