使用 Bazel 编译带有 gflags 支持的 glog 失败
Failure compiling glog with gflags support using Bazel
当我尝试使用 Bazel 编译带有 gflags 支持的 glog 时失败。重现此问题并显示编译错误消息的 github 存储库位于此处:https://github.com/dionescu/bazeltrunk.git
我怀疑问题的发生是因为 glog 正在查找并使用 gflags 发布的 "config.h" 文件。但是,我不明白为什么会发生这种情况以及为什么构建文件的当前结构会导致此类错误。我找到的一种解决方案是为 gflags 提供我自己的 BUILD 文件,其中配置处于单独的依赖项中(在我的示例中 glog 是如何做到的)。
如果能帮助我理解此示例中的问题,我将不胜感激。
问题是 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
(@//
是 shorthand 对于您的项目存储库,您可以在 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
文件。
当我尝试使用 Bazel 编译带有 gflags 支持的 glog 时失败。重现此问题并显示编译错误消息的 github 存储库位于此处:https://github.com/dionescu/bazeltrunk.git
我怀疑问题的发生是因为 glog 正在查找并使用 gflags 发布的 "config.h" 文件。但是,我不明白为什么会发生这种情况以及为什么构建文件的当前结构会导致此类错误。我找到的一种解决方案是为 gflags 提供我自己的 BUILD 文件,其中配置处于单独的依赖项中(在我的示例中 glog 是如何做到的)。
如果能帮助我理解此示例中的问题,我将不胜感激。
问题是 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.hgenrule(
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
(@//
是 shorthand 对于您的项目存储库,您可以在 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
文件。