Сборка кода C++ с циклической зависимостью с использованием Bazel Build System
В моей охоте на систему сборки, которая может обрабатывать несколько языков и создавать код в пошаговом режиме, я обнаружил, что Bazel - очень хорошее решение. Однако есть одна проблема, решение которой у меня нет.
У меня есть C++ код с круговыми зависимостями. Пока это не решено, мне нужна система сборки, которая может создавать такой код. Мой вопрос: может ли Bazel создавать код с циклическими зависимостями, особенно код C++? Если да, можете ли вы поделиться с нами рекомендациями или полезными ссылками на то же самое?
1 ответ
Это зависит от того, как именно выглядит ваша круговая зависимость.
Два.cc-файла зависят друг от друга.h-файлов
Либо поместите оба файла.cc и.h в одно и то же правило cc_library, либо используйте правила только для заголовков для файлов.h, а cc_library для файлов.cc зависит от соответствующего другого cc_library.
Два.h файла, которые #include друг друга
Они оба должны быть в одной и той же cc_library, чтобы Bazel мог справиться с этим.
В качестве альтернативы, если у вас есть встроенные средства защиты, вы можете выполнить рефакторинг следующим образом: допустим, файлы - это ah и bh. Вы бы переименовали bh в b-impl.h, удалите #include для ah из b-impl.h и добавьте новый файл bh, который #includes ah. Он сделает порядок включения всегда согласованным и удалит цикл, будучи в основном обратно совместимым (при условии, что оба они не пытаются объявить одни и те же символы, а код, включающий их, зависел от приказ).
Два.cc файла, которые #include друг друга
Эээ... Я надеюсь, что это не ваш случай.
Два.a файла с взаимными ссылками на символы
Обычно это обрабатывается с помощью --start-group aa ba --end-group, но в Базеле сейчас нет механизма для этого. См. https://github.com/bazelbuild/bazel/issues/818.