在 Buck 中,如何扩展 genrule 输出目录?
In Buck, how do I expand a genrule output directory?
我有一个 genrule
输出包含 C++ headers 的目录。我还有一个 cxx_library
,它使用 genrule
的输出。 cxx_library
的 headers
字段如下所示:
...
headers = [
':my-headers',
],
...
问题是我的 C++ 源文件包含这样的 headers:
#include "my_header.h"
但是巴克是这样准备暂存区的:
my-cxx-library#default,private-headers/out
其中 out
是包含我生成的 headers 的文件夹的别名。
所以为了使用 headers,我必须像这样包含它们:
#include "out/my_header.h"
图书馆不是我自己的,所以我不想更改 source-code。相反,我想使用 subdir_glob
之类的东西来包含 :my-headers/out
中的所有内容。
我试过这个:
...
headers = subdir_glob([
(':my-headers/out', '**/*.h'),
]),
...
但是,这样做似乎不会将字符串 :my-headers
解析为 :my-headers
的输出路径。
buck 中是否有可以将规则扩展到其输出路径的函数?
这 isn't trivially possible today,但您可以使用一个解决方法:
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',
},
上面的代码假定所有这些都在同一个 build file, but if it isn't, you just need to use a fully-qualified build target 中。
我有一个 genrule
输出包含 C++ headers 的目录。我还有一个 cxx_library
,它使用 genrule
的输出。 cxx_library
的 headers
字段如下所示:
...
headers = [
':my-headers',
],
...
问题是我的 C++ 源文件包含这样的 headers:
#include "my_header.h"
但是巴克是这样准备暂存区的:
my-cxx-library#default,private-headers/out
其中 out
是包含我生成的 headers 的文件夹的别名。
所以为了使用 headers,我必须像这样包含它们:
#include "out/my_header.h"
图书馆不是我自己的,所以我不想更改 source-code。相反,我想使用 subdir_glob
之类的东西来包含 :my-headers/out
中的所有内容。
我试过这个:
...
headers = subdir_glob([
(':my-headers/out', '**/*.h'),
]),
...
但是,这样做似乎不会将字符串 :my-headers
解析为 :my-headers
的输出路径。
buck 中是否有可以将规则扩展到其输出路径的函数?
这 isn't trivially possible today,但您可以使用一个解决方法:
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',
},
上面的代码假定所有这些都在同一个 build file, but if it isn't, you just need to use a fully-qualified build target 中。