Как убедиться, что какой-то код не компилируется с помощью Bazel?

У меня есть несколько фрагментов кода C ++ (шаблоны, макросы и т. Д.), Которые не предназначены для компиляции при использовании определенных способов. Написание от руки фрагмента кода, который выполняет то, что не должно компилироваться, и проверки того, что он не компилируется, достаточно просто, но это не автоматизировано. Похоже, Bazel должен иметь возможность скомпилировать фрагмент кода и автоматически проверить, что он не компилируется как часть bazel test, и это кажется довольно распространенной ситуацией с кодом C ++. Есть ли встроенный способ сделать это?

Я пытаюсь избежать применения моего собственного правила Skylark, которое генерирует сценарий оболочки, который вызывает компилятор C ++, потому что обработка всех аргументов, которые Bazel передает в цепочку инструментов C ++, действительно сложно. В настоящее время bazelbuild / bazel # 146 и некоторые другие связанные проблемы означают, что вся информация отсутствует т даже в наличии.


person Brian Silverman    schedule 13.06.2017    source источник


Ответы (2)


Напишите тест, который создает временную рабочую область и файлы BUILD и C ++ в ней, затем вызывает Bazel внутри теста и проверяет его код выхода и вывод stderr.

Мы все время делаем аналогичные вещи с собственными интеграционными тестами Bazel. См. Полный пример в фиксации e78ad83: тестовые данные зависят от самого Bazel, устанавливает создает макет рабочей области и файл BUILD и запускает Bazel как подпроцесс, затем утверждает его стандартный вывод (в данном случае: результат bazel info server_pid). (NB: некоторые из этих исходных файлов были обновлены с тех пор, поэтому обратите внимание на последние версии.)

person László    schedule 14.06.2017
comment
Согласно обсуждению списка рассылки, это не совсем то Искал но уже близко. Я надеялся избежать дублирования или выяснить, как повторно использовать пользовательский CROSSTOOL, bazel.rc и другие, но похоже, что это пока невозможно. Как только C ++ Skylark API станет более полным, это должно быть легче решить лучше, но пока это хорошо, как есть. Спасибо! - person Brian Silverman; 24.06.2017

Возможно, просто создайте тесты, используя неправильный код в качестве целей cc_binary, а затем напишите сценарий оболочки или другой инструмент для вызова Bazel, чтобы построить их и проверить код возврата. Но не самый чистый способ.

Таким образом, сценарий оболочки будет делать несколько вызовов Bazel, делая что-то вроде этого. По крайней мере, вам не нужно было бы выяснять, какие вызовы компилятора делает Bazel, но вы теряете красивое интегрированное тестирование Bazel.

bazel build //tests:test_that_should_fail_at_compile_time
if [ $? != 0 ]; then
    echo "Test Passed!"
fi
person zlalanne    schedule 14.06.2017