Пакет Bazel: Как экспортировать артефакты сборки в другой каталог с внешней зависимостью?

#bazel #bazel-rules

#базель #базель-правила

Вопрос:

Я новичок в Базеле. У меня есть проект, который построен с помощью Bazel. Он также использовал некоторые сторонние библиотеки, которые также созданы на базе bazel (из исходного кода).

Сейчас я пытаюсь экспортировать свой проект в качестве отдельной библиотеки для других. Я могу скомпилировать свой проект как so и скопировать связанные файлы hpp в каталог.

Но я не знаю, как обращаться со сторонними библиотеками. Есть ли какой-нибудь необычный способ сделать это? Или какие-нибудь примеры, на которые я могу сослаться?

Моя цель состоит в том, чтобы :

  1. Создайте проект в виде файла so. Скопируйте в специальный каталог. (ГОТОВО)
  2. Скопируйте все файлы заголовков с древовидной структурой. (ГОТОВО).
  3. Скопируйте также все внешние библиотеки в специальный каталог (НУЖНА ПОМОЩЬ)
  4. Скопируйте файлы заголовков внешних библиотек в тот же каталог заголовков (НУЖНА ПОМОЩЬ)

выход:

  • включать/
    • my_library_name/
    • имя третьей части1/
    • имя третьей части2/
  • библиотека/
    • libmy_library.so
    • libthird_party_name1.so
    • libthird_party_name2.so

Комментарии:

1. Находятся ли ваш проект и сторонние библиотеки в одной рабочей области?

2. Вы могли бы создать шаблон, который принимает объекты библиотеки в качестве входных данных и выводит один файл tar со всеми вашими файлами в комплекте, как вы хотели бы, чтобы он был развернут?

3. @dms Нет, они не находятся в одном рабочем пространстве. Я импортировал их в РАБОЧУЮ область проекта и использую в качестве третьей стороны.

4. @Laurenz Спасибо за ваше предложение. Я пишу этот жанр. Но я не уверен, как копировать библиотеки. Так как они находятся в bazel-bin/my_library_name/ amp; bazel-bin/внешнее/третье имя_части1. Должен ли я жестко указать путь и скопировать оттуда библиотеки? Или есть лучший способ сделать это?

5. Если у вас есть контроль над файлами сборки сторонних библиотек, вы можете использовать pkg_tar правила для сбора выходных файлов (можете добавить дополнительную информацию в надлежащем ответе, если это так).

Ответ №1:

Если у вас есть контроль над BUILD файлами сторонних библиотек, вы можете предоставить файлы заголовков отдельно, а затем использовать pkg_tar правила для сбора целевых файлов в основном проекте.

Например, предположим, что структура папок выглядит следующим образом:

 . |-- project | |-- BUILD | |-- mylib | | |-- BUILD | | |-- mylib.cpp | | `-- mylib.h | `-- WORKSPACE `-- thirdparty  |-- lib1  | |-- BUILD  | |-- lib1.cpp  | `-- lib1.h  |-- lib2  | |-- BUILD  | |-- lib2.cpp  | `-- lib2.h  `-- WORKSPACE  

файлы сборки ваших сторонних библиотек могут содержать a filegroup и a cc_library :

 # thirdparty/lib1/BUILD  filegroup(  name = "headers",  srcs = ["lib1.h"],  visibility = ["//visibility:public"], )  cc_library(  name = "lib1",  hdrs = [":headers"],  srcs=["lib1.cpp"],  visibility = ["//visibility:public"], )  

Та же схема будет применяться thirdparty/lib2/BUILD и project/mylib/BUILD к и.

Теперь в основном проекте у вас может быть основной BUILD скрипт, который собирает все файлы в tar архив:

 # project/BUILD  load("@bazel_tools//tools/build_defs/pkg:pkg.bzl", "pkg_tar")  pkg_tar(  name = "release_headers",  srcs = [  "//mylib:headers",  "@thirdparty//lib1:headers",  "@thirdparty//lib2:headers",  ],  package_dir = "include", )  pkg_tar(  name = "release_libs",  srcs = [  "//mylib",  "@thirdparty//lib1",  "@thirdparty//lib2",  ],  package_dir = "lib", )  pkg_tar(  name = "release",  deps = [  ":release_headers",  ":release_libs",  ], )  

Здание :release должно создать tar файл с нужной структурой:

 $gt; bazel build :release ... Target //:release up-to-date:  bazel-bin/release.tar ...  
 $gt; tar -tf bazel-bin/release.tar ./ ./include/ ./include/mylib.h ./include/lib1.h ./include/lib2.h ./lib/ ./lib/libmylib.a ./lib/libmylib.so ./lib/liblib1.a ./lib/liblib1.so ./lib/liblib2.a ./lib/liblib2.so  

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