4

我正在尝试建立一个涉及外部工具的构建,该工具产生一个目录作为输出(doxyindexer对于好奇的人)。到目前为止,我基本上已经掌握了这些命令:

target = "doxysearch.db/iamchert"
doxygen.Doxyindexer(target,["project1.xml","project2.xml","project3.xml"])
Default([target])
Default(Install(ARGUMENTS["cgibin"],"doxysearch.db"))

我遇到的问题是我想target成为目录本身,而不是目录中的一些随机文件。没有什么我可以 glob 因为目标在我构建它之前不存在,我不想假设 Dimitri 可能会改变任何东西!当我使用目录作为目标时,我收到此错误:

TypeError: Tried to lookup Dir 'doxysearch.db' as a File.:

这就是我选择iamchert成为目标的原因。这些行似乎都按预期工作,即使我的方法是 hack。但是,我无法让最后一行工作。我需要将目录复制doxysearch.dbcgi-bin用户在命令行中指定的目录中。也许有人可以解释如何正确执行此步骤?说到scons,我是新手!

我在搜索答案时遇到了麻烦,因为所涉及的所有搜索词都太常见了,无法找到我的具体帮助!

4

2 回答 2

6

SCons 实际上将目录中的所有文件视为该目录的依赖项。有一些黑暗的角落需要工作,但它应该在像这样的简单情况下工作。

您需要的是未记录的target_factory构建器标志。当你定义Doxyindexer这样做:

doxyindexer = Builder(..., target_factory=env.fs.Dir)

并让您的构建器返回目录本身。那应该避免你得到的 TypeError 。

于 2014-03-13T18:31:42.497 回答
3

我不确定 SCons 与作为目录的目标一起工作的效果如何。问题是:SCons 应该如何确定目录是否已更改以知道是否应该构建它?显而易见的答案是,如果目录中包含或多或少的文件,则认为该目录已更改,但我认为 SCons 目前不进行此检查,您可能必须创建自己的构建器才能获取它。

我做了以下示例来测试它,它永远不会构建:

env = Environment()
env.Command(target = 'targetDir',
            source = 'srcTextFile',
            action = Copy("$TARGET", "$SOURCE"))

当我执行 SCons 时,我总是得到相同的结果:

scons: '.' is up to date

关于您的 SCons 代码,我认为它会更好地工作如下:

targetDir = "doxysearch.db/iamchert"
srcFiles = ["project1.xml","project2.xml","project3.xml"]

doxygenTarget = doxygen.Doxyindexer(targetDir, srcFiles)

    # This may need to be called via the Command() builder like this:
    # cmd = "doxygen.Doxyindexer("$TARGET", "$SOURCE")
    # doxygenTarget = env.Command(target=targetDir, source=srcFiles, action=cmd)

# This call to Default isnt really necessary
Default(doxygenTarget)
Install(ARGUMENTS["cgibin"], doxygenTarget)
于 2013-06-02T13:22:12.933 回答