1

当我尝试使用 Bazel 编译带有 gflags 支持的 glog 时失败了。重现此问题并显示编译错误消息的 github 存储库在这里:https ://github.com/dionescu/bazeltrunk.git

我怀疑问题的发生是因为 glog 正在查找并使用 gflags 发布的“config.h”文件。但是,我不明白为什么会发生这种情况以及为什么构建文件的当前结构会导致此类错误。我发现的一种解决方案是为 gflags 提供我自己的 BUILD 文件,其中配置位于单独的依赖项中(就像 glog 在我的示例中所做的那样)。

对于理解此示例中的问题,我将不胜感激。

4

1 回答 1

1

问题是 gflag 的 BUILD 文件包含它自己的配置。添加-H到 glog.BUILD 的copts产量:

. external/glog_archive/src/utilities.h
.. external/glog_archive/src/base/mutex.h
... bazel-out/local-fastbuild/genfiles/external/com_github_gflags_gflags/config.h
In file included from external/glog_archive/src/utilities.h:73:0,
                 from external/glog_archive/src/utilities.cc:32:
external/glog_archive/src/base/mutex.h:147:3: error: #error Need to implement mutex.h for your architecture, or #define NO_THREADS
 # error Need to implement mutex.h for your architecture, or #define NO_THREADS
   ^

如果您查看 gflag 的 config.h,它采用了一种不太有用的方法来注释掉大部分配置:

// ---------------------------------------------------------------------------
// System checks

// Define if you build this library for a MS Windows OS.
//cmakedefine OS_WINDOWS

// Define if you have the <stdint.h> header file.
//cmakedefine HAVE_STDINT_H

// Define if you have the <sys/types.h> header file.
//cmakedefine HAVE_SYS_TYPES_H
...

所以什么都没有定义。

选项:

最简单的方法可能是在您的 glog.BUILD 中生成 config.h:

genrule(
    name = "config",
    outs = ["config.h"],
    cmd = "cd external/glog_archive; ./configure; cd ../..; cp external/glog_archive/src/config.h $@",
    srcs = glob(["**"]),
)

# Then add the generated config to your glog target.
cc_library(
    name = "glog",
    srcs = [...],
    hdrs = [
        ":config.h",
        ...

这将 .h 文件置于比 gflags 版本更高的优先级位置。

或者,如果您想使用您的//third_party/glog/config.h(@//是项目存储库的简写),您可以在 genrule 中执行类似的操作:

genrule(
    name = "config",
    outs = ["config.h"],
    cmd = "cp $(location @//third_party/glog:config.h) $@",
    srcs = ["@//third_party/glog:config.h"],
)

您也必须添加exports_files(['config.h'])third_party/glog/BUILD文件中。

于 2017-07-24T17:40:36.393 回答