我有这个cmake
项目,我想使用clang-tidy
进行现代化。为了避免同时发生太多事情,我只激活了modernize-use-override
选项。但是,当我应用此方法时:
$> run-clang-tidy -header-filter='.*' -checks='-*, modernize-use-override' -fix
对于项目,clang-tidy
插入override
说明符的多个实例,例如:
void update_sizes() override override override etc.
我尝试遵循here的建议,并使用cmake
创建json编译命令数据库:
$>cmake ../../ -DCMAKE_BUILD_TYPE=debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
我通过将cmake
设置为系统范围的默认值(使用clang
)来确保update-alternative
实际上正在使用cmake
编译器。在这种情况下,clang-6
会生成调用clang编译器的make文件。
我正在使用Ubuntu 18.10和clang 7。
我还尝试使用cmake
并设置ninja
来生成make
构建脚本而不是gcc
文件,但是结果始终相同。
在应用此修复程序之前,整个项目都可以使用clang
和run-clang-tidy.py
进行编译。
请注意,这里有一个类似的讨论here,但是这里给出的建议是使用ctInvoices
,这正是我在做的事情。因此,我不认为这是重复的。
答案 0 :(得分:2)
这是您链接到的讨论中引用的相同问题,在我看来,这似乎是一个错误。您有几种选择:
答案 1 :(得分:1)
这是一个很老的问题,但是在clang 11中仍然存在问题。问题在于clang存储头文件路径的方式。您可以在yaml文件中轻松看到此内容,例如
在第一个yaml文件中:
FilePath:“ C:/ SOURCES / APP / COMMON / CORE /../../../ Libs / Sdk / Public / File.h”
在secod yaml文件中:
FilePath:“ C:/ SOURCES / APP / COMMON / APPCORE / VIEWS /../../../../ Libs / Sdk / Public / File.h”
上面的路径是相同的,但是对于'clang apply replaces'来说不是。
解决此问题的最简单方法是修改脚本'run-clang-tidy.py',以在运行'clang apply replaces'之前修复yaml文件中的所有路径
def FixPath(line):
value = line.find("'")
if value != -1:
left = line[:value]
right = line[value+1:len(line)-2]
right = "'" + os.path.normpath(right) + "'"
line = left + right.lower() + "\n"
return line
def FixYamlContent(tmpdir):
for replacefile in glob.iglob(os.path.join(tmpdir, '*.yaml')):
with open(replacefile, "r+") as file_rw:
lines = []
for line in file_rw:
if line.find("FilePath:") != -1:
line = FixPath(line)
lines.append(line)
file_rw.seek(0)
file_rw.writelines(lines)
file_rw.truncate()
要使用上述代码,您需要在函数 apply_fixes 之前调用函数 FixYamlContent(tmpdir)。我不是python开发人员,并且上面的代码尚未经过全面测试,但是您明白了。