Ошибка компиляции 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 файл тоже.

Другие вопросы по тегам