Поддержка Bazel Checkers

Какие варианты предоставляет Bazel для создания новых или расширения существующих целей, которые вызывают C / C ++ - средства проверки кода, такие как

  • qac
  • cppcheck
  • iwyu

?

Мне нужно использовать genrule или для этого есть какое-то другое целевое правило?

Является ли https://bazel.build/versions/master/docs/be/extra-actions.html мой единственный жизнеспособный выбор здесь?

В отраслях программного обеспечения, критически важных для безопасности, таких как авиация и автомобилестроение, очень часто результаты этих вызовов используются для сбора так называемых «метрических отчетов».

В этих случаях вызовы таких линтеров должны иметь выходные данные, которые затем обрабатываются действиями построения этих сборщиков отчетов по метрикам. В таких случаях я не могу найти полезный способ повторно использовать «дополнительные действия» Базеля. Идеи какие-нибудь?


person Nordlöw    schedule 03.06.2017    source источник


Ответы (1)


Я написал кое-что, в котором используются дополнительные действия для создания файла 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
comment
Я добавил здесь два дополнительных действия: github.com/nordlow/build- system-benchmark / blob / master / BUILD и зарегистрированный cppcheck_cat для вызова CCompile (угаданное имя), CcCompile (угаданное имя) и CppCompile. Но я не получаю дополнительных результатов при вызове github.com / nordlow / build-system-benchmark / blob / master / даже при его четкой компиляции. Что я пропустил? - person Nordlöw; 08.06.2017
comment
Вам нужно выполнить сборку с --experimental_action_listener=//:cppcheck_c_cpp, переданным в bazel. Кроме того, C и C ++ будут CppCompile. - person Brian Silverman; 08.06.2017