у меня есть genrule
который выводит каталог, содержащий заголовки C ++. у меня тоже есть cxx_library
который использует вывод genrule
, headers
поле cxx_library
выглядит так:
...
headers = [
':my-headers',
],
...
Проблема в том, что мои исходные файлы C ++ содержат заголовки, подобные этим:
#include "my_header.h"
Но Бак подготавливает площадку так:
my-cxx-library#default,private-headers/out
куда out
это псевдоним к папке, содержащей мои сгенерированные заголовки.
Таким образом, чтобы использовать заголовки, я должен добавить их следующим образом:
#include "out/my_header.h"
Библиотека не моя, поэтому я не хотел бы менять исходный код. Вместо этого я хотел бы использовать что-то вроде subdir_glob
включить все внутри :my-headers/out
,
Я попробовал это:
...
headers = subdir_glob([
(':my-headers/out', '**/*.h'),
]),
...
Тем не менее, кажется, что когда это сделано, строка :my-headers
не разрешается до выходного пути :my-headers
,
Есть ли функция в доллар что может расширить правило для выходного пути?
это не тривиально возможно сегодня, но есть обходной путь, который вы можете использовать:
genrule(
name = 'headers',
cmd = 'generate_headers.py --outdir=$OUT'
out = 'headers-dir',
)
genrule(
name = 'generated_header_A.h',
cmd = 'cp $(location :headers)/genereated_header_A.h $OUT',
out = 'generated_header_A.h',
)
Тогда в вашем cxx_library
, вам просто нужно объявить свой headers
ссылаясь на местоположение:
headers = {
'some_namespace/header_A.h': ':generated_header_A.h',
},
Код выше предполагает, что все это в том же создать файл, но если это не так, вам просто нужно использовать полностью квалифицированный построить цель вместо.
Других решений пока нет …