c++ - 获取 scons 以生成新的内部版本号

标签 c++ scons build-numbers

我想让 scons 从文件中读取以前的版本号,用新版本号和当前日期更新源文件,然后将版本号写回原始文件,为下一次构建做好准备。

需要在目标过期时发生。 IOW 如果没有构建发生,版本号不会改变。原始文件是源代码控制的,不是源文件,否则它可能会在 checkin 时触发另一个构建(由于 CI)。 澄清 从 scons 的角度来看,由于自动生成的源文件,代码总是过时的,但 scons 只会在检测到 SCM 更改时从持续集成作业 (Jenkins) 运行.

我查看了 AddPostMethod,但这似乎对源文件列表中的所有文件都有效。
CommandBuilder 方法使用 VARIANT_DIR 所以我无法编辑这些文件然后重新 checkin 它们,因为它们不再映射到 repo .

我希望我只是误解了 scons 的一些更精细的细节,否则我的想法已经用完了!

更新 通过更多的思考,汤姆的评论是正确的。虽然我有两个文件,一个版本控制的文本文件(非源代码)和一个非源代码控制的源文件,但无法 checkin 一个文件并阻止连续的构建/ checkin 循环。 Jenkins 将看到新的文本文件并衍生出一个构建,而 scons 将看到新生成的文件。所以除非我在某个时候删除生成的文件,尽管这似乎违背了这两种工具的工作流程。

有没有人有办法实现这个?这看起来很简单。最终,我只想在每次构建开始时生成构建编号。

最佳答案

来自 SCons User Guide section 8, Order-Only Dependencies ,您可以使用 Requires 方法:

import time

# put whatever text you want in your version.c; this is just regular python
version_c_text = """
char *date = "%s";
""" % time.ctime(time.time())
open('version.c', 'w').write(version_c_text)

version_obj = Object('version.c')

hello = Program('hello.c',
                LINKFLAGS = str(version_obj[0]))

Requires(hello, version_obj)

需要注意两点:首先,您必须添加显式的 Requires 依赖项。其次,你不能让 version_obj 成为 Program builder 的来源,你必须作弊(这里我们将它作为链接标志传递),否则你将自动完全依赖它。

这将始终更新 version.c,但不会仅仅因为 version.c 更改而重建。

关于c++ - 获取 scons 以生成新的内部版本号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17414213/

相关文章:

C++:从字符串流中读取

c++ - 何时使用 =default 使析构函数默认?

c++ - 如何在 scons 中添加 --whole-archive 链接器选项?

SConscript 环境错误 : No module named compilation_db

c - makefile 在 Scons 中定义等效项

variables - Devops YAML - 使用表达式设置构建名称

c++ - 用于提取红色 channel 的 SDL 库

c++ - Qt QNetworkAccessManager 长时间延迟发出完成信号

visual-studio - 我的 Visual Studio 自动递增内部版本号语法有什么问题?

adb - Android Things 的内部版本号/指纹