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

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

本文关键字:源文件 读取 C++ LibTooling 使用 Clang      更新时间:2023-10-16

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

我正在使用Clang 3.8 LibTooling lib来读取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))

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