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

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

我研究了AddPostMethod,但这似乎对源文件列表中的所有文件都有效。CommandBuilder方法使用VARIANT_DIR,因此我无法编辑这些文件,然后将它们检入,因为它们不再映射到存储库。

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

更新
通过更多思考,汤姆的评论是正确的。尽管我有两个文件,一个是版本控制的文本文件(非源代码),另一个是非源控制的源文件,但是无法检入一个文件并阻止连续的构建/检入周期。 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成为程序构建器的源代码,您必须作弊(这里我们将其作为linkflag传递),否则将自动获得对它的完全依赖。

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

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

10-15 02:56
查看更多