Создание библиотеки CMake в рамках проекта Bazel


Я написал модуль поверх частной вилки от TensorFlow, который использует nanomsg.

Для моего локального сервера разработки я использовал cmake install для установки nanomsg (to /usr/local) и получил доступ к заголовочным файлам из их установленного расположения. Проект отлично работает локально.

Однако, мне сейчас нужно пакет nanomsg в моем TensorFlow рабочей области. Я попробовал следующие два подхода и не нашел ни одного удовлетворительным:

  1. Подобно этому ответ для OpenCV я предварительно скомпилировал nanomsg в частный репозиторий, загрузил его в свою рабочую область (в пределах tensorflow/workspace.bzl), используя директивуhttp_archive , а затем включил заголовки и библиотеки в соответствующий сценарий сборки. Это работает нормально, но не является портативным решением.

  2. Более портативное решение, я создал genrule для запуска определенной последовательности команд cmake, которые могут быть использованы для построения nanomsg. Этот подход более аккуратен, но genrule не может быть повторно использован для cmake другого проекты. (Я сослался на это обсуждение ).

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

1 3

1 ответ:

Как писал Ульф, я думаю, что предложенный вами вариант 2 должен работать нормально.

Относительно "могу ли я определить, если cmake не работает", да: cmake должен вернуться с кодом выхода ошибки (!= 0) когда он терпит неудачу. Это, в свою очередь, приведет к тому, что Bazel автоматически распознает действие genrule как неудачное и, таким образом, завершит сборку. Потому что Bazel устанавливает "set-e-o pipefail" перед запуском вашей команды (ср. https://docs.Базель.build/versions/master/be/general.html#genrule-environment ), он также должен работать, если вы связываете несколько команд cmake в своем genrule "cmd".

Если вы вызываете сценарий оболочки в атрибуте "cmd", который затем фактически выполняет команды cmake, убедитесь, что вы сами поместили" set-e-o pipefail " в первую строку вашего сценария. В противном случае сценарий не потерпит неудачу, когда cmake потерпит неудачу.

Если я неправильно понял ваш вопрос "Могу ли я определить, если cmake не работает", пожалуйста, дайте мне знать. :)