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

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

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

2

Решение

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

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

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

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

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

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

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

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

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

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector