Ошибка компиляции glog с поддержкой gflags с использованием Bazel
Я получаю ошибку, когда пытаюсь скомпилировать glog с поддержкой gflags, используя Bazel. Репозиторий Github, воспроизводящий эту проблему и показывающий сообщение об ошибке компиляции, находится здесь: https://github.com/dionescu/bazeltrunk.git
Я подозреваю, что проблема возникает, потому что glog находит и использует файл config.h, опубликованный gflags. Однако я не понимаю, почему это происходит и почему текущая структура файлов сборки приводит к таким ошибкам. Одно решение, которое я нашел, состояло в том, чтобы предоставить свой собственный файл BUILD для gflags, где конфигурация находилась в отдельной зависимости (как это делает glog в моем примере).
Я был бы признателен за любую помощь в понимании проблемы в этом примере.
1 ответ
Проблема в том, что файл BUILD gflag включает в себя свой собственный конфигурационный файл. Добавление -H
к glog.BUILD's 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
^
Если вы посмотрите на config.h gflag, он использовал не очень полезный подход для закомментирования большей части конфигурации:
// ---------------------------------------------------------------------------
// 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
...
Так что ничего не определено.
Опции:
Самый простой способ - это, вероятно, сгенерировать config.h в вашем glog.BUILD:
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.
Кроме того, вы можете сделать что-то вроде этого в genrule, если вы хотите использовать свой //third_party/glog/config.h
(@//
является сокращением для хранилища вашего проекта):
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
файл тоже.