«Отсутствующие объявления зависимостей» для системных заголовков при кросс-компиляции с Bazel - PullRequest
2 голосов
/ 23 апреля 2020

Я пытаюсь выполнить кросс-компиляцию проекта (библиотека TensorFlow C), используя Bazel с инструментарием кросс-компиляции. После большого отчаяния (но это уже другая история) мне наконец удалось получить фактическую компиляцию внешних зависимостей (например, zlib или protobuf) для работы с моей цепочкой инструментов, однако теперь я получаю пропущенных объявлений зависимостей для все системные заголовки (предоставляемые кросс-компиляцией), которые включены в скомпилированное правило, генерирующее эту ошибку.

Эта точная ошибка описана в руководстве Bazel для настройки C ++ toolchains ( в самом низу в шаге 10). Они также предлагают исправление, которое состоит в добавлении feature к CcToolchainConfigInfo, который добавляет каталоги системных заголовков с помощью флагов -isystem.

Проблема, которая у меня возникла с этим исправлением является то, что я не могу добавить абсолютные пути этих каталогов, как описано, так как это вызывает эту ошибку: Путь включения ... ссылается на путь вне выполнения root.

Вместо использования абсолютных путей, я также попытался объявить новых локальных репозиториев в моих WORKSPACE с filegroups и cc_libraries, в которых перечислены пути в их srcs / hdrs / includes и ссылки на эти filegroups / cc_libraries в флагах -isystem, но ни одна из моих попыток не сработала. Возможно, я не сделал это правильно, но я попробовал много вариантов.

Если я не могу добавить абсолютные пути или заставить его работать в локальных репозиториях, то каков правильный способ сделать это?

1 Ответ

1 голос
/ 25 апреля 2020

Чтобы проверить, какие заголовки вы используете со своего хоста и должны считаться системными заголовками / считаются нормальными, даже если они явно не объявлены как зависимости, вы предоставляете список каталогов, содержащих такие заголовки, в атрибут cxx_builtin_include_directories атрибута create_cc_toolchain_config_info(), как вы определяете cc_toolchain. Например, написав один для моего системного компилятора и системных библиотек с хоста, я мог бы сказать:

cc_common.create_cc_toolchain_config_info(
    ...
    cxx_builtin_include_directories = [
        "/usr/include/",
        "/usr/lib64/gcc/x86_64-slackware-linux/9.3.0/include/",
    ],
    ...
)

В настоящее время я не знаю другого способа сделать это для инструментов хоста, которые не находятся в собственном дереве Базеля. , По крайней мере, с 3.1.0 это работает и задокументировано.

Примечание: это настраивает проверку зависимостей, а не пути поиска для инструментов как таковых, вот где соответствующий feature, который вы упомянули, вступает в игру .

...