1

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

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

我已经调查过了AddPostMethod,但这似乎会触发源文件列表中的所有文件。
CommandBuilder方法使用,VARIANT_DIR所以我无法编辑这些文件,然后将它们重新签入,因为它们不再映射到存储库。

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

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

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

4

1 回答 1

1

SCons 用户指南第 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 更改而重建。

于 2014-06-11T22:27:03.413 回答