使用Bazel构建C库

时间:2017-06-21 01:06:50

标签: bazel

我正在尝试为以下目录结构编写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':在包路径上找不到BUILD文件并由&#引用39; // A / SRC:升

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

我需要一些帮助来弄清楚我在构建文件中出错的地方

1 个答案:

答案 0 :(得分:3)

解决方案

有很多方法可以解决这个问题,其中之一是:

  1. BUILD文件添加到somelib/include,其中包含以下内容:

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

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

  4. 替代

    另一种解决方案是将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