使用Bazel构建C库

最后发布: 2017-06-21 01:06:49


问题

我正在尝试为以下目录结构编写Bazel Build文件。

thirdparty
    |_WORKSPACE
    |_somelib
    |    |_src
    |         |_ a.c
    |         |_ BUILD
    |    |_include
    |         |_a.h
    |_include
       |_ b.h

当前的BUILD文件:thirdparty / somelib / src / BUILD

cc_library(
 name = "a",
 srcs = ["a.c"],
 hdrs = ["thirdparty/somelib/include/a.h"],
)

此生成文件导致错误:

使用的命令:bazel build somelib / src:a

错误:/ thirdparty / somelib / src / BUILD:1:1:无此类软件包“ thirdparty / somelib / include / a.h”:在软件包路径上未找到并由“ // a / src:l引用”的BUILD文件

错误:对目标'// somelib / src:a'的分析失败; 建立中止。

我需要一些帮助来确定BUILD文件出了错的地方

bazel
回答

有很多方法可以解决此问题,其中一种是:

  1. BUILD文件添加到somelib/include及其内容:

     filegroup( name = "headers", srcs = ["ah"], visibility = ["//somelib/src:__pkg__"], ) 
  2. 更新somelib/src/BUILD为:

     cc_library( name = "a", srcs = ["ac"], hdrs = ["//somelib/include:headers"], ) 
  3. 您现在可以使用bazel build //somelib/src:a来构建它。

替代

另一个解决方案是将somelib/src/BUILD移到somelib/BUILD ,所以现在程序包是//somelib带有两个子目录srcinclude ,它们都没有自己的BUILD文件(因此它们本身不是程序包)。 然后,您将更新somelib/BUILD如下所示:

cc_library(
    name = "a",
    srcs = ["src/a.c"],
    hdrs = ["include/a.h"],
)

并且您将像bazel build //somelib:a一样构建它。

说明

参见https://bazel.build/versions/master/docs/build-ref.html#packages_targets