如何使SCONS更新构建中使用的文件的内容



更新作为构建一部分的文件的内容的合适的SCONS方法是什么?

我使用SCONS构建一个相当大的项目。但是为了一个简单的问题,假设它看起来像这样:

env.Program("foo", ["foo.c", "version.c"])

在某些构建条件下,有必要使用新信息(实际上是版本信息)更新构建中某个CPP文件的内容。在上面的例子中,我需要修改"version.c"的内容。我认为我可以用下面的例子很好地做到这一点:

env.Command(target="version.c", source=[], action=PythonFunctionToUpdateContents)
env.Program("foo", ["foo.c", "version.c"])

PythonFunctionToUpdateContents将使用target[0]作为文件的名称,打开它,查找一些特定的文本,更改它,将更改写回同一个文件。不幸的是,上面的示例不起作用。SCONS在构建目标文件之前会自动删除它,所以我的"version.c"文件在可以更新之前就被删除了。

我尝试在env.Command()调用中将目标文件和源文件设置为相同的文件,但这只是创建了一个依赖循环。

我知道我可以通过让SCONS生成整个version.c文件来解决这个问题,但这是不合适的,因为version.c包含许多其他代码,这些代码可以作为正常开发的一部分而更改。

通常的方法是使用"version.c. c. " In "或"version-in.c"或随便你怎么称呼它。修改并输出到version.c。您可以将"in"文件添加到版本控制系统中,而version.c文件则不在其中。因此,所有这些操作的结果如下所示:

env.Command(target="version.c", source="version-in.c",
            action=PythonFunctionToUpdateContents)
env.Program("foo", ["foo.c", "version.c"])

这也适用于其他构建系统——通常将输入文件同时作为输出文件是一个坏主意。最好使用中间文件来完成工作。

这个答案有点晚了,但无论如何,这里是:

您应该使用env.Precious("version.c")。这样可以防止在生成文件之前删除文件。

您可能还想使用env.NoClean("version.c"),这样它就不会在清理期间被删除。

你也许可以使用env.SideEffect,但那个似乎有一些奇怪的事情。我在邮件列表上被告知一般不要使用这个

最新更新