【问题标题】:Determine list of source files (*.[ch]) for a complex build with scons使用 scons 确定复杂构建的源文件列表 (*.[ch])
【发布时间】:2011-09-02 12:32:56
【问题描述】:

假设您有一个复杂的 C 项目源代码树,有很多目录和很多文件。 scons 构建支持多个目标(i386、sparc、powerpc)和多个变体(调试、发布)。当使用指定目标和变体的参数调用时,根有一个sconstruct(引用各种sconscripts),它为所有这些做正确的事情,例如scons target=i386 variant=release.

是否有一种简单的方法可以确定每个构建将使用哪些源文件(*.c 和 *.h)(它们都略有不同)?我的理论是 scons 无论如何都需要计算这个文件集以知道要编译哪些文件以及何时重新编译。它可以提供这些信息吗?

我做什么想做什么:

  • 记录详细的构建并对其进行后处理(可能不会告诉 *.h 文件)
  • find . -name '*.[ch]' 还会打印不需要的文件以进行单元测试和其他杂乱无章的工作,并且不是特定于目标的

理想情况下,我想做scons target=i386 variant=release printfileset 并查看正确的 *.[ch] 文件列表。然后,此列表可以作为 doxygen 等其他源文件修改工具的输入。

【问题讨论】:

    标签: build build-process scons


    【解决方案1】:

    这里有几个问题都被挤在一起了:

    • 您可以使用 --dry-run 标志阻止 SCons 运行编译器
    • 您可以使用 --debug=tree 或 --tree=all 标志从 SCons 获取依赖关系树,具体取决于您运行的版本
    • 给定一个文件列表,每行一个,您可以使用 grep 仅过滤掉您感兴趣的内容。

    当你把所有这些放在一起时,你最终会得到这样的结果:

    scons target=i386 variant=release printfileset -n --tree=all | egrep -i '^ .*\.(c|h|cpp|cxx|hpp|inl)$'
    

    【讨论】:

    • 这是一个很有前途的解决方案。这是我对文件集的第一个近似值:scons -n --tree=all | sed -ne '/\.[ch]$/s/^[-+ |]*//p' | sort -u
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多