Базель - Включая все заголовки из каталога при импорте статической библиотеки - PullRequest
0 голосов
/ 27 июня 2019

Я новичок в Bazel и пытаюсь добавить статическую библиотеку в мою сборку.

В качестве простого примера скажем, что у меня есть следующее.

cc_import(
  name = "my_test_lib"
  static_library = "lib\my_test_lib\test.lib"
  hdrs = ["lib\my_test_lib\include\headerA.h", 
          "lib\my_test_lib\include\headerB.h"]
  visibility = ["//visibility:public"],
)

Теперь этоработает отлично.

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

 hdrs = [ "lib\my_test_lib\include\*"]

1 Ответ

1 голос
/ 28 июня 2019

Вам нужна функция glob.

Чтобы использовать ее в вышеприведенном примере, вы должны сделать что-то вроде этого

cc_import(
  name = "my_test_lib"
  static_library = "lib/my_test_lib/test.lib"
  hdrs = glob(["lib/my_test_lib/include/*.h"])
  visibility = ["//visibility:public"],
)

, чтобы найти все файлы, заканчивающиеся .h под lib\my_test_lib\include и поместите их в атрибут hdrs вашего cc_import.

В документации Bazel есть дополнительная информация о glob: https://docs.bazel.build/versions/master/be/functions.html#glob

Примечание: всегда используйте прямые косые черты на всех платформах в файлах Bazel BUILD (даже в Windows).

Несколько шаблонов глобуса

Иногда полезно вставитьболее одного шаблона в глобе, например, вот так

cc_import(
  ...
  hdrs = glob([
    "lib/my_test_lib/include/*.h",
    "lib/my_test_lib/include/*.hpp",
    "lib/my_test_lib/public/*.h",
  ]),
  ...
)

Объединение глобуса с жестко закодированным списком файлов

Еще одна полезная вещь - это комбинирование глобусов сжестко закодированные пути.Там может быть несколько нужных вам файлов, а затем каталог, который вы также хотите включить.Вы можете сделать это, используя оператор +, чтобы объединить жестко закодированный список путей с глобальными результатами, подобными этому

cc_import(
  ...
  hdrs = [
    "lib/my_test_lib/some_header.h",
  ] + glob([
    "lib/my_test_lib/include/*.h",
  ]),
  ...
)

Глобализация иерархии каталогов (остерегайтесь массивных включений)

Функция glob также поддерживает обход каталогов и их подкаталогов при поиске файлов.Это можно сделать с помощью шаблона ** glob.Так, например, чтобы захватить все файлы .h в каталоге my_test_lib, используйте этот глобус

cc_import(
  ...
  hdrs = glob([
    "lib/my_test_lib/**/*.h",
  ]),
  ...
)

Осторожно: сюда будут включены все файлы ниже указанного каталога, как и ожидалось.Это может выйти из-под контроля, поскольку неясно, какие файлы включены.Может быть лучше держаться подальше от **.

...