#bazel #bazel-rules
#базель #базель-правила
Вопрос:
Я новичок в Базеле. У меня есть проект, который построен с помощью Bazel. Он также использовал некоторые сторонние библиотеки, которые также созданы на базе bazel (из исходного кода).
Сейчас я пытаюсь экспортировать свой проект в качестве отдельной библиотеки для других. Я могу скомпилировать свой проект как so и скопировать связанные файлы hpp в каталог.
Но я не знаю, как обращаться со сторонними библиотеками. Есть ли какой-нибудь необычный способ сделать это? Или какие-нибудь примеры, на которые я могу сослаться?
Моя цель состоит в том, чтобы :
- Создайте проект в виде файла so. Скопируйте в специальный каталог. (ГОТОВО)
- Скопируйте все файлы заголовков с древовидной структурой. (ГОТОВО).
- Скопируйте также все внешние библиотеки в специальный каталог (НУЖНА ПОМОЩЬ)
- Скопируйте файлы заголовков внешних библиотек в тот же каталог заголовков (НУЖНА ПОМОЩЬ)
выход:
- включать/
- 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
правила для сторонних библиотек в рабочей области сторонних разработчиков для повышения модульности.