我正在尝试建立一个涉及外部工具的构建,该工具生成一个目录作为输出(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来说,我是个新手!
我在搜索答案时遇到了麻烦,因为所涉及的所有搜索词都太常见了,无法找到具体的帮助!
答案 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)