Сборка кода C++ с циклической зависимостью с использованием Bazel Build System

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

У меня есть C++ код с круговыми зависимостями. Пока это не решено, мне нужна система сборки, которая может создавать такой код. Мой вопрос: может ли Bazel создавать код с циклическими зависимостями, особенно код C++? Если да, можете ли вы поделиться с нами рекомендациями или полезными ссылками на то же самое?

1 ответ

Это зависит от того, как именно выглядит ваша круговая зависимость.

  1. Два.cc-файла зависят друг от друга.h-файлов

    Либо поместите оба файла.cc и.h в одно и то же правило cc_library, либо используйте правила только для заголовков для файлов.h, а cc_library для файлов.cc зависит от соответствующего другого cc_library.

  2. Два.h файла, которые #include друг друга

    Они оба должны быть в одной и той же cc_library, чтобы Bazel мог справиться с этим.

    В качестве альтернативы, если у вас есть встроенные средства защиты, вы можете выполнить рефакторинг следующим образом: допустим, файлы - это ah и bh. Вы бы переименовали bh в b-impl.h, удалите #include для ah из b-impl.h и добавьте новый файл bh, который #includes ah. Он сделает порядок включения всегда согласованным и удалит цикл, будучи в основном обратно совместимым (при условии, что оба они не пытаются объявить одни и те же символы, а код, включающий их, зависел от приказ).

  3. Два.cc файла, которые #include друг друга

    Эээ... Я надеюсь, что это не ваш случай.

  4. Два.a файла с взаимными ссылками на символы

    Обычно это обрабатывается с помощью --start-group aa ba --end-group, но в Базеле сейчас нет механизма для этого. См. https://github.com/bazelbuild/bazel/issues/818.

Другие вопросы по тегам