Build 确定带有SCON的复杂生成的源文件列表(*[ch])

Build 确定带有SCON的复杂生成的源文件列表(*[ch]),build,build-process,scons,Build,Build Process,Scons,假设一个C项目有一个复杂的源代码树,有很多目录和很多文件。scons构建支持多个目标(i386、sparc、powerpc)和多个变体(调试、发布)。根目录下有一个sconstruct(引用各种sconscripts),当使用指定目标和变量的参数调用时,它对所有这些都做了正确的事情,例如scons target=i386 variant=release 是否有一种简单的方法来确定每个版本将使用哪些源文件(*.c和*.h)(它们都略有不同)?我的理论是,scons无论如何都需要计算这个文件集,以知

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

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

我不想做的事:

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

理想情况下,我希望执行
scons target=i386 variant=release printfileset
并查看*[ch]文件的正确列表。然后,此列表可以作为进一步的源文件搜索工具(如doxygen)的输入。

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

  • 您可以使用--dry run标志阻止SCON运行编译器
  • 您可以使用--debug=tree或--tree=all标志从SCON获取依赖关系树,具体取决于您正在运行的版本
  • 给定一个文件列表,每行一个,您可以使用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