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

时间:2013-07-01 21:43:57

标签: c++ scons build-numbers

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

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

我已查看AddPostMethod,但这似乎触发了源文件列表中的所有文件。
CommandBuilder方法使用VARIANT_DIR,因此我无法编辑这些文件,然后重新检入它们,因为它们不再映射到回购。

我希望我只是误解了scons的一些细节,否则我的想法就会用尽!

更新 通过更多思考,汤姆的评论是正确的。虽然我有两个文件,一个版本控制的文本文件(非源代码)和一个非源代码控制的源文件,但是无法检查一个文件并阻止连续的构建/签入周期。 Jenkins将看到新的文本文件并分离构建,scons将看到新生成的文件。因此,除非我在某个时候删除生成的文件,尽管这似乎违背了两个工具的工作流程。

有没有人有任何方法可以实现这一目标?看起来很简单。最终,我只想在每次构建开始时生成构建号。

1 个答案:

答案 0 :(得分:1)

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的源代码,你必须作弊(这里我们将它作为linkflag传递),否则你将自动完全依赖它。

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