Начальная загрузка Bazel для Raspberry Pi 4 не удалась, jni_md.h не найден - PullRequest
5 голосов
/ 05 марта 2020

В настоящее время я пытаюсь скомпилировать последнюю версию Bazel (2.2.0) из исходного кода на безголовом Raspberry Pi 4, на котором установлен Raspbian Buster. Я использовал эту страницу в качестве руководства по установке.

У меня не было проблем с выполнением инструкций на этой странице (все зависимости установлены, Java 8 установлены, изменен размер свопинга, et c et c) до момента, когда я начал компилировать. Сборка не удалась с этой ошибкой:

ERROR: /home/pi/bazel/src/main/java/com/google/devtools/build/lib/syntax/BUILD:150:1: C++ compilation of rule '//src/main/java/com/google/devtools/build/lib/syntax:libcpu_profiler.so' failed (Exit 1): gcc failed: error executing command
  (cd /tmp/bazel_hpBqNseU/out/execroot/io_bazel && \
  exec env - \
    PATH=/home/pi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games \
    PWD=/proc/self/cwd \
  /usr/bin/gcc -U_FORTIFY_SOURCE -fstack-protector -Wall -Wunused-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer -g0 -O2 '-D_FORTIFY_SOURCE=1' -DNDEBUG -ffunction-sections -fdata-sections '-std=c++0x' -MD -MF bazel-out/arm-opt/bin/src/main/java/com/google/devtools/build/lib/syntax/_objs/libcpu_profiler.so/cpu_profiler_unimpl.pic.d '-frandom-seed=bazel-out/arm-opt/bin/src/main/java/com/google/devtools/build/lib/syntax/_objs/libcpu_profiler.so/cpu_profiler_unimpl.pic.o' -fPIC -iquote . -iquote bazel-out/arm-opt/bin -iquote external/bazel_tools -iquote bazel-out/arm-opt/bin/external/bazel_tools -isystem external/bazel_tools/tools/jdk/include -isystem bazel-out/arm-opt/bin/external/bazel_tools/tools/jdk/include -fno-canonical-system-headers -Wno-builtin-macro-redefined '-D__DATE__="redacted"' '-D__TIMESTAMP__="redacted"' '-D__TIME__="redacted"' -c src/main/java/com/google/devtools/build/lib/syntax/cpu_profiler_unimpl.cc -o bazel-out/arm-opt/bin/src/main/java/com/google/devtools/build/lib/syntax/_objs/libcpu_profiler.so/cpu_profiler_unimpl.pic.o)
Execution platform: //:default_host_platform
In file included from src/main/java/com/google/devtools/build/lib/syntax/cpu_profiler_unimpl.cc:17:
bazel-out/arm-opt/bin/external/bazel_tools/toolsls/jdk/include/jni.h:45:10: fatal error: jni_md.h: No such file or directory
 #include "jni_md.h"
          ^~~~~~~~~~
compilation terminated.

Тем не менее, выполнение find / -name jni_md.h 2> /dev/null возвращает

/usr/lib/jvm/java-8-openjdk-armhf/include/linux/jni_md.h

Таким образом, файл заголовка отсутствует в моем system.

При просмотре онлайн ( этот вопрос конкретно ) мне, очевидно, нужно включить дополнительный аргумент для g cc, чтобы он мог видеть файл? Однако я не уверен, где именно я могу найти указанный c файл сборки, который мне нужно будет отредактировать, чтобы сделать это.

Если кто-то может помочь мне указать верное направление или если есть Было бы признательно другое решение, которое может исправить эту ошибку.

Ответы [ 3 ]

2 голосов
/ 30 марта 2020

Поскольку я пока не могу оставлять комментарии, я публикую ответ. Без помощи Патрика я бы не смог этого сделать. Мое решение основано на ответе Патрика.

Я создал файл исправления для вышеуказанного исправления и использовал condition:arm вместо значения по умолчанию.

Сохраните его как bazel-2.2.0-compile-armhf.patch в bazel build root каталог:

--- src/main/java/com/google/devtools/build/lib/syntax/BUILD    2020-03-30 14:42:31.018189718 +0200
+++ src/main/java/com/google/devtools/build/lib/syntax/BUILD.2  2020-03-30 14:42:06.278705784 +0200
@@ -168,6 +168,7 @@
         "//src/conditions:freebsd": ["@bazel_tools//tools/jdk:jni_md_header-freebsd"],
         "//src/conditions:openbsd": ["@bazel_tools//tools/jdk:jni_md_header-openbsd"],
         "//src/conditions:windows": ["@bazel_tools//tools/jdk:jni_md_header-windows"],
+        "//src/conditions:arm": ["@bazel_tools//tools/jdk:jni_md_header-linux"],
         "//conditions:default": [],
     }),
     includes = ["../../../../../../../../../external/bazel_tools/tools/jdk/include"] + select({
@@ -177,6 +178,7 @@
         "//src/conditions:freebsd": ["../../../../../../../../../external/bazel_tools/tools/jdk/include/freebsd"],
         "//src/conditions:openbsd": ["../../../../../../../../../external/bazel_tools/tools/jdk/include/openbsd"],
         "//src/conditions:windows": ["../../../../../../../../../external/bazel_tools/tools/jdk/include/win32"],
+        "//src/conditions:arm": ["../../../../../../../../../external/bazel_tools/tools/jdk/include/linux"],
         "//conditions:default": [],
     }),
 )

Затем исправьте соответствующий файл BUILD

$ patch -p0  < bazel-2.2.0-compile-armhf.patch
patching file src/main/java/com/google/devtools/build/lib/syntax/BUILD

Теперь вы можете скомпилировать Bazel 2.2.0 на Raspberry Pi (или любом другом устройстве armhf)

1 голос
/ 06 марта 2020

«легкая» первая часть вашего вопроса

Из другого вопроса, на который вы ссылались, и расположения файла jni_md.h в вашей системе, здесь есть опция «include», которая вам нужна добавьте к вашей команде g cc:

gcc -I/usr/lib/jvm/java-8-openjdk-armhf/include/linux

Более сложная вторая часть

Вторая часть вашего вопроса - как изменить конфигурацию сборки Bazel так что соответствующее включение сделано. Большие проекты, которые нужно компилировать на многих целевых платформах, основаны на сложных файлах конфигурации, в которых указан путь к указанным платформам c файлам / компиляторам. Сначала это может быть ошеломляющим и запутанным.

1. В чем проблема?

Если посмотреть на вашу ошибку, я вижу, что ошибка исходит из файла /home/pi/bazel/src/main/java/com/google/devtools/build/lib/syntax/BUILD:150:1

Ниже приведен отрывок , взятый из GitHub :

В этой части сценария сборки показаны различные конфигурации в зависимости от целевой платформы архитектуры (windows / freebsd ...), поскольку в зависимости от платформы расположение файла jni_md.h будет различным.

# The C++ portion of the Starlark CPU profiler.
cc_binary(
    name = "libcpu_profiler.so",
    srcs = select({
        "//src/conditions:darwin": ["cpu_profiler_posix.cc"],
        "//src/conditions:linux_x86_64": ["cpu_profiler_posix.cc"],
        "//conditions:default": ["cpu_profiler_unimpl.cc"],
    }),
    linkshared = 1,
    deps = [":jni"],
)

# TODO(adonovan): move this to @bazel_tools//tools/jdk:jni where it belongs.
# TODO(adonovan): why is there no condition for "just linux"?
cc_library(
    name = "jni",
    hdrs = ["@bazel_tools//tools/jdk:jni_header"] + select({
        "//src/conditions:linux_x86_64": ["@bazel_tools//tools/jdk:jni_md_header-linux"],
        "//src/conditions:darwin": ["@bazel_tools//tools/jdk:jni_md_header-darwin"],
        "//src/conditions:freebsd": ["@bazel_tools//tools/jdk:jni_md_header-freebsd"],
        "//src/conditions:openbsd": ["@bazel_tools//tools/jdk:jni_md_header-openbsd"],
        "//src/conditions:windows": ["@bazel_tools//tools/jdk:jni_md_header-windows"],
        "//conditions:default": [],
    }),
    includes = ["../../../../../../../../../external/bazel_tools/tools/jdk/include"] + select({
        # Remove these crazy prefixes when we move this rule.
        "//src/conditions:linux_x86_64": ["../../../../../../../../../external/bazel_tools/tools/jdk/include/linux"],
        "//src/conditions:darwin": ["../../../../../../../../../external/bazel_tools/tools/jdk/include/darwin"],
        "//src/conditions:freebsd": ["../../../../../../../../../external/bazel_tools/tools/jdk/include/freebsd"],
        "//src/conditions:openbsd": ["../../../../../../../../../external/bazel_tools/tools/jdk/include/openbsd"],
        "//src/conditions:windows": ["../../../../../../../../../external/bazel_tools/tools/jdk/include/win32"],
        "//conditions:default": [],
    }),
)

Из вашей ошибки:

Платформа выполнения: //: default_host_platform

Похоже, вы компилируете проект в "default Конфигурация Если мы посмотрим на файл BUILD, то увидим, что при сборке с конфигурацией по умолчанию не указан путь cc_library:

cc_library(
    name = "jni",
    hdrs = ["@bazel_tools//tools/jdk:jni_header"] + select({
    "//conditions:default": [], # IT IS EMPTY
    }),
    includes = ["../../../../../../../../../external/bazel_tools/tools/jdk/include"] + select({
    "//conditions:default": [], # ALSO EMPTY HERE
    }),
)

Это объясняет, почему путь к местоположению jni_md.h не добавлено и почему вы получаете ошибку компиляции.

2. Как решить проблему?

Похоже, что между разработчиками идет обсуждение вопроса о добавлении простого "linux" в конфигурацию. Тем не менее, вы, кажется, компилируете в конфигурации «По умолчанию». Это может быть причиной root вашей проблемы, но я предполагаю, что есть причина, по которой вы используете эту конфигурацию.

Поскольку ваша система выглядит как «linux», добавление «linux конфигурации» в «по умолчанию» может решить проблему в вашем конкретном случае.

In файл BUILD, попробуйте изменить раздел cc_library на:

cc_library(
    name = "jni",
    hdrs = ["@bazel_tools//tools/jdk:jni_header"] + select({
    ...
    "//conditions:default": ["@bazel_tools//tools/jdk:jni_md_header-linux"],
    }),
    includes = ["../../../../../../../../../external/bazel_tools/tools/jdk/include"] + select({
    ...
    "//conditions:default": ["../../../../../../../../../external/bazel_tools/tools/jdk/include/linux"],
    }),
)

Это скорее "исправление", чем постоянное решение. Сообщите нам, если оно работает или если вы получаете другую ошибку Комментарии и другие предложения приветствуются. Как предлагается в другом ответе, использование более старой версии Bazel также может устранить проблему.

0 голосов
/ 06 марта 2020

Не могу комментировать - похоже, 2.2.0 не работает. Попробуйте BAZEL_VERSION = 2.1.1

sudo dpkg --add-architecture armhf

apt-get update && apt-get install -y --no-install-recommends \
  gnupg apt-utils curl unzip zip

echo 'deb http://deb.debian.org/debian/ sid main' | sudo tee -a /etc/apt/sources.list.d/sid-main.list

sudo apt-get update && sudo apt-get install -y --no-install-recommends -t sid openjdk-8-jdk

sudo apt-get install -y --no-install-recommends \
    ca-certificates build-essential software-properties-common \
    cmake g++ python pkg-config zip g++ zlib1g-dev unzip \
    autoconf automake libtool

sudo apt-get upgrade -y

export BAZEL_VERSION=2.1.1

cd /opt && \
    curl -L https://github.com/bazelbuild/bazel/releases/download/${BAZEL_VERSION}/bazel-${BAZEL_VERSION}-dist.zip -o bazel-${BAZEL_VERSION}-dist.zip && \
    unzip -q bazel-${BAZEL_VERSION}-dist.zip -d bazel && \
    rm -f bazel-${BAZEL_VERSION}-dist.zip

cd /opt/bazel && \
    env BAZEL_JAVAC_OPTS="-J-Xmx1536m -J-Xms1536m" EXTRA_BAZEL_ARGS="--host_javabase=@local_jdk//:jdk" bash ./compile.sh .
...