Я написал кое-что, в котором используются дополнительные действия для создания файла compile_commands.json, используемого clang-tidy и другие инструменты, и я хотел бы сделать то же самое для iwyu, когда я к нему подойду. Я не использовал эти другие инструменты, но полагаю, что они тоже подходят по той же схеме.
Основная идея состоит в том, чтобы запустить дополнительное действие, которое генерирует некоторые выходные данные для каждого файла (также известную как команда компиляции C / C ++), а затем после этого находит все выходные файлы (за пределами Bazel) и объединяет их. Достаточно полный пример можно найти здесь для справки. По сути, прослушиватель действий (написанный на Python) декодирует дополнительный протокол действия и извлекает исходные файлы, параметры компилятора и т. Д.:
action = extra_actions_base_pb2.ExtraActionInfo()
with open(argv[1], 'rb') as f:
action.MergeFromString(f.read())
cpp_compile_info = action.Extensions[extra_actions_base_pb2.CppCompileInfo.cpp_compile_info]
compiler = cpp_compile_info.tool
options = ' '.join(cpp_compile_info.compiler_option)
source = cpp_compile_info.source_file
output = cpp_compile_info.output_file
print('%s %s -c %s -o %s' % (compiler, options, source, output))
Если вы укажете дополнительное действие в виде шаблона вывода, затем он может записать этот вывод в файл. Если вы дадите выходным файлам отличительные имена, вы можете найти их все в выходном дереве и объединить вместе, как захотите.
Более сложный вариант - использовать запрос bazel --output = proto и напишите код для вычисления дополнительных выходных имен файлов действий для интересующих вас целей оттуда. Это требует написания большего количества кода, но у вас нет проблем со старыми файлами вывода в дереве вывода, которые случайно включаются при агрегировании.
Еще одна возможность - это FWIW, Аспекты. Однако я думаю, что для этого приемлемо работают дополнительные действия.
person
Brian Silverman
schedule
06.06.2017