В Buck, как мне расширить каталог вывода genrule?

у меня есть 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,

Есть ли функция в что может расширить правило для выходного пути?

3

Решение

это не тривиально возможно сегодня, но есть обходной путь, который вы можете использовать:

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',
},

Код выше предполагает, что все это в том же создать файл, но если это не так, вам просто нужно использовать полностью квалифицированный построить цель вместо.

3

Другие решения

Других решений пока нет …