我有一个与此类似的代码段:
# Compile protobuf headers
env.Protoc(...)
# Move headers to 'include' (compiled via protobuf)
env.Command([include headers...], [headers...], move_func)
# Compile program (depends on 'include' files)
out2 = SConscript('src/SConscript')
Depends(out2, [include headers...])
基本上,我有Protoc()
编译protobuf文件,然后标题被env.Command()
移动到'include'目录,最后程序通过'{1}}文件编译。 src”中。
由于这些是正在移动的头文件(src编译所依赖的),因此它们没有被scons明确定义为依赖(据我所知)。因此,编译运行,但头文件尚未移动,因此失败。我尝试通过SConscript
和Depends()
公开依赖,但没有成功。
据我所知,在通常情况下,scons应该“找出”依赖关系,但我不知道它是如何做到的。
谢谢!
答案 0 :(得分:0)
你似乎正在思考" make"关于构建过程的方法,这是使用SCons时的错误方法。您不能通过将它们放在不同的SConscripts中来订购单个构建步骤,然后按特殊顺序包含它们。您必须在实际源(例如C / CPP文件)和目标(如程序或PDF文件)之间定义正确的依赖关系。然后SCons能够找出正确的构建顺序,并将自动遍历项目的文件夹结构。如果需要,当依赖关系图(DAG)指示时,它将多次输入子文件夹。通常使用Builder来定义输入和输出之间的这种依赖关系...在您的情况下,Install()构建器将是一个很好的选择。另请参阅"最常见的常见问题解答列表中的#2提示" (https://bitbucket.org/scons/scons/wiki/FrequentlyAskedQuestions)。
此外,我只建议在UserGuide(http://www.scons.org/doc/production/HTML/scons-user.html)中阅读更多内容,以便更好地了解如何在更多" SConsy"办法。如果您遇到困难,请随时在scons-users@scons.org上的邮件列表中提出进一步的问题(参见http://www.scons.org/lists.php)。 最后,如果您要执行许多步骤,并且不需要任何特殊的输入/输出文件,那么SCons可能不是您当前任务的正确工具。它被设计为一个面向文件的构建系统,并考虑到自动并行化,一个简单的(Python?)脚本可能在单纯的串行代码中更好......