Clang 3.8 C++ - 使用 LibTooling 读取目录中的所有源文件

Clang 3.8 C++ - reading all the source files in a directory using LibTooling

编辑:我正在使用 Linux Fedora 22。

我正在使用 Clang 3.8 LibTooling 库读取 Cpp 源文件,解析 AST,然后对我提取的数据进行一些处理。当我在单个文件或作为输入给出的多个文件上使用命令行调用我的工具时,一切正常。

但是如果有几十个或者几百个文件,一次又一次全部写入就变得不可行了。那么,有没有办法反制呢?例如,我将所有源文件名称转储到一个 txt 文件中,并将其作为工具的输入,希望 Clang 的命令行解析器将从给定路径或其他方式读取文件?

例如,这很好用:

toolname f1.cpp f2.cpp --

但是如何在不给出所有文件名的情况下做到这一点:

toolname f1.cpp .......f1000.cpp --

您应该提供有关操作系统的信息,因为它很重要。

假设您在 linux 尝试以下操作:

toolname $(find directory -name "*.cpp") --

其中目录是包含您要处理的文件的目录的路径。

$(...) 是 linux 的 shell 语法。它启动括号之间的内容,并在完成后用启动命令的标准输出替换整个 $(...) 文本。 find 是 linux 命令,它在目录(及其子目录)中搜索符合给定条件的文件(在一个例子中,只有 -name 是给定 - 文件名,忽略目录,必须匹配 *.cpp 模式)。所以假设目录是 /home/q 并且会有三个文件:

/home/q/a.cpp
/home/q/a.h 
/home/q/b.cpp 

正在启动

toolname $(find /home/q -name "*.cpp") --

将启动子命令

find /home/q -name "*.cpp"

这将输出

/home/q/a.cpp
/home/q/b.cpp

(a.h 将被忽略,因为它不匹配 -name 模式),这将被放回原始命令:

toolname /home/a.cpp /home/b.cpp --

在 windows 的情况下,您可以使用 python 脚本,例如:

import os, sys, subprocess

toolname = os.path.abspath(sys.argv[1])
path = os.path.abspath(sys.argv[2])
args = [toolname]
for name in os.listdir(path):
  if name.endswith('.cpp'):
    args.append(os.path.join(path, name))
sys.exit(subprocess.call(args))

其中第一个参数是工具路径,第二个参数是文件目录路径(非递归)。