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

时间:2017-06-18 08:25:27

标签: c++ clang++

编辑:我使用的是Linux Fedora 22。

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

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

例如,这样可以正常工作:

toolname f1.cpp f2.cpp --

但如何在不提供所有文件名的情况下执行此操作:

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

1 个答案:

答案 0 :(得分:1)

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

假设您使用的是linux,请尝试以下操作:

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

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

$(...)是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))

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