如何让scons将目录本身视为目标?

时间:2013-05-31 18:26:20

标签: doxygen scons

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

您需要的是未记录的target_factory构建器标志。定义Doxyindexer时,请执行以下操作:

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

让你的建造者返回dir本身。这应该避免你得到的TypeError。

答案 1 :(得分: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)