我有一个genrule输出包含 C++ 标头的目录。我还有一个cxx_library使用genrule. 该字段headers看起来cxx_library像这样:
...
headers = [
':my-headers',
],
...
Run Code Online (Sandbox Code Playgroud)
问题是我的 C++ 源文件包含如下标头:
#include "my_header.h"
Run Code Online (Sandbox Code Playgroud)
但是 Buck 是这样准备暂存区的:
my-cxx-library#default,private-headers/out
Run Code Online (Sandbox Code Playgroud)
其中out包含我生成的标头的文件夹的别名。
因此,为了使用标头,我必须像这样包含它们:
#include "out/my_header.h"
Run Code Online (Sandbox Code Playgroud)
该库不是我自己的,所以我不想更改源代码。相反,我想使用类似 a 的东西subdir_glob来包含里面的所有内容:my-headers/out。
我试过这个:
...
headers = subdir_glob([
(':my-headers/out', '**/*.h'),
]),
...
Run Code Online (Sandbox Code Playgroud)
但是,似乎以这种方式完成后,字符串:my-headers不会解析为 的输出路径:my-headers。
Buck中是否有一个函数可以将规则扩展到其输出路径?
今天这不太可能,但您可以使用一种解决方法:
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',
)
Run Code Online (Sandbox Code Playgroud)
然后,在您的 中cxx_library,您只需headers通过引用位置来声明您的:
headers = {
'some_namespace/header_A.h': ':generated_header_A.h',
},
Run Code Online (Sandbox Code Playgroud)
上面的代码假设所有这些都在同一个构建文件中,但如果不是,您只需要使用完全限定的构建目标即可。