4

我有一个genrule输出包含 C++ 头文件的目录。我也有一个cxx_library使用genrule. 的headers字段cxx_library如下所示:

  ...
  headers = [
    ':my-headers',
  ],
  ...

问题是我的 C++ 源文件包含这样的标题:

#include "my_header.h"

但是 Buck 是这样准备临时区域的:

my-cxx-library#default,private-headers/out

out包含我生成的标题的文件夹的别名在哪里。

因此,为了使用标题,我必须像这样包含它们:

#include "out/my_header.h"

该库不是我自己的,所以我不想更改源代码。相反,我想使用类似 a 的东西subdir_glob来包含:my-headers/out.

我试过这个:

  ...
  headers = subdir_glob([
    (':my-headers/out', '**/*.h'),
  ]),
  ...

但是,似乎以这种方式完成时,字符串:my-headers不会被解析为:my-headers.

中是否有可以将规则扩展到其输出路径的函数?

4

1 回答 1

4

在今天并非易事,但您可以使用一种解决方法:

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

上面的代码假设所有这些都在同一个构建文件中,但如果不是,您只需要使用完全限定的构建目标

于 2017-01-12T16:01:38.853 回答