【问题标题】:Get which files have been modified files inside SCons builder action在 SCons 构建器操作中获取哪些文件已被修改
【发布时间】:2015-09-04 12:00:49
【问题描述】:

Python 函数可以是 Builder 中使用的 SCons 操作,如 SCons user manual 中所述。每当任何源发生更改时,SCons 都会调用此函数。源作为 SCons Files 对象的列表传递 在这个函数中,我想知道特定源是否已更改(以及哪些源文件迫使 SCons 重建构建器的目标)。

所以如果“file.target”是使用“file1.src”和“file2.src”使用调用python函数“custom_build”的自定义构建器构建的:

env.CUSTOM_BUILDER('file.target', ['file1.src', 'file2.src'])

def custom_build(env, source, target):
    # Checks if file1.src has been modified
    if source[0].has_been_modified:  # Does something like this exist??

我在调试时检查了这个文件对象,但没有成功。是否有任何属性可以知道特定文件在 SCons 构建器中发生了更改?

【问题讨论】:

  • 这不是建造者行动的任务。通过将*.src 文件定义为目标的源,SCons 会自动注册这些文件之间的依赖关系。当您的源文件之一发生更改时(取决于您使用的 Decider() 方法),您的操作“custom_build”将被调用。它的唯一任务是从给定的源重新创建目标,关于何时发生此步骤的决定是在另一个层面上。
  • 我明白你的意思。但是假设要重新创建目标,我需要知道哪些文件已被修改。假设目标是一个简单文件,其中列出了已从所有可能的源中修改的文件,这些源可用于重新创建目标。 SCons 有这些信息,所以我的问题是如何获取它。
  • 我找到并发布了一个适合我需要的解决方案。无论如何,感谢您在回复中的时间和关注。

标签: python scons


【解决方案1】:

我在搜索 Node.__init__ 包时找到了一个可能的解决方案(SCons 选项 --debug=explain 在此处提供有关每个目标更改的源的信息)。这不是很好,但似乎可以完成这项工作。至少,它很适合我。关键是在目标上使用changed_since_last_build

def build(env, target, source):
    old = target[0].get_stored_info()
    old = old.binfo
    old.prepare_dependencies()
    old_bkids = old.bsources + old.bdepends + old.bimplicit
    old_bkidsigs = old.bsourcesigs + old.bdependsigs + old.bimplicitsigs
    osig = dict(zip(old_bkids, old_bkidsigs))

    for src_file, info in osig.iteritems():
        print str(src_file) + ' change status: ' + str(src_file.changed_since_last_build(target[0], info))

【讨论】:

  • 据我所知,您只是在使用 SCons 内部使用的相同方法来确定文件是否已更改。但是,每当您显式调用新的“构建”方法时,您就是在 SConstruct/SConscript 中执行此代码。如果您的源(其中一个)是在构建过程中生成的(例如自动生成的标头),这将失败。在足够简单的情况下它可能对您有用,但我想警告其他用户不要在他们的项目中使用此方法。对不起,他们会脸色难看。
  • 简短的补充说明:您当前在源上调用changed_since_last_build,而不是在目标上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 2014-07-29
  • 2015-12-23
相关资源
最近更新 更多