web-dev-qa-db-ja.com

Raspberry Pi 4のBazelのブートストラップに失敗しました、jni_md.hが見つかりません

現在、Raspbian BusterがインストールされているヘッドレスRaspberry Pi 4で、ソースから最新バージョンのBazel(2.2.0)をコンパイルしようとしています。 このページ をインストールガイドとして使用していました。

そのページの説明(すべての依存関係がインストールされている、Java 8がインストールされている、スワップサイズが変更されている、など)に従ってコンパイルを開始したところまで問題はありませんでした。ビルドはこのエラーで失敗しました:

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

したがって、ヘッダーファイルがシステムにない場合とは異なります。

オンラインで見回すことから( 特にこの質問 )ファイルを表示できるように、gccに追加の引数を含める必要があるようです。ただし、そのために編集する必要のある特定のビルドファイルがどこにあるのか正確にはわかりません。

誰かが私を正しい方向に向けるのを助けることができるか、このエラーを修正できる別の解決策があれば、それは高く評価されます。

6
astroJaguar

質問の「簡単な」最初の部分

リンクした他の質問とシステム上のファイルjni_md.hの場所から、gccコマンドに追加する必要がある「include」コマンドオプションを次に示します。

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

よりトリッキーな後編

質問の2番目の部分は、Bazelのビルド構成を変更して、適切に含めるようにする方法です。多くのターゲットプラットフォームでコンパイルする必要のある大きなプロジェクトは、プラットフォーム固有のファイル/コンパイラへのパスが指定されている複雑な構成ファイルに依存しています。最初は圧倒的で混乱を招く可能性があります。

1。問題はどこにありますか?

エラーを確認したところ、エラーはファイル/home/pi/bazel/src/main/Java/com/google/devtools/build/lib/syntax/BUILD:150:1にあるようです

以下は GitHubからの抜粋 です。

ビルドスクリプトのこの部分には、プラットフォームに応じてさまざまな構成が表示されます。これは、プラットフォームによって、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

「デフォルト」構成でプロジェクトをコンパイルしているようです。 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」のケースを構成に追加するために開発者の間でいくつかの議論があるようです。ただし、「デフォルト」構成でコンパイルしているようです。これが問題の根本的な原因である可能性がありますが、この構成を使用している理由があると思います。

システムは「Linuxタイプ」のように見えるため、「デフォルト」のケースに「Linux設定」を追加すると、特定のケースで問題が解決する場合があります。

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を使用すると問題が解決する場合もあります。

3
Patrick

コメントはまだ投稿できませんので、回答を投稿しています。パトリックの助けがなければ、私はこれを行うことができませんでした。私の解決策はパトリックスの答えに基づいています。

上記の修正のためのパッチファイルを作成し、デフォルトの代わりにcondition:armを使用しました。

これをbazel-2.2.0-compile-armhf.patchという名前でbazelビルドルートディレクトリに保存します。

--- 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

これで、Raspberry Pi(またはその他のarmhfデバイス)でBazel 2.2.0をコンパイルできます

2
Rick Jongbloed

コメントできません-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 .
0
Troy Kelly