Build Bazel on Raspberry Pi
In this post you will learn the followings:
- What is bazel
- How to build it on Raspberry PI 3 B+
What is Bazel?
The answer to this question is simple! Bazel is a build tool like Make, Maven, etc.! It will build your code like other build tools but from my point of view the advantages that bazel gives are:
-
it provides a simple workspace to build codes in different languages
-
it is multi-platform, that’s why we want to use it in Raspberry Pi.
You can find more information about bazel on its official website.
How to build it on Raspberry PI 3B+
Sometimes you want to build a very simple application (Let say, object detection and tracking using Tensorflow ;)) in C/C++ on your edge device like Raspberry Pi (or whatever) but it uses huge libraries and you first need to build those libraries for your edge device and there you will need to use bazel. The following steps are necessary to build bazel version 3.7.2 from the source which has been tested on Raspberry PI 3B+ 1.4GHz Cortex-A53 Rev. 1.3 with 1GB RAM and 16GB SD card which runs Raspberry Pi OS based on Debian Buster (Legacy). I guess these steps also work for other versions (comment below if it didn’t work – we will make it work).
-
If you have a fresh SD card with Raspbian on it, first make sure to expand the filesystem, so it ensures the availability of all SD card. You can do it in different ways like:
sudo raspi-config # Advanced Options -> Expand Filesystem
-
(Optional): increase swap size:
sudo dphys-swapfile swapoff # Disable Swap sudo nano /etc/dphys-swapfile # Set CONF_SWAPSIZE to 512 or more sudo dphys-swapfile swapon # Enable Swap
-
Install the requirements for compiling bazel:
sudo apt update sudo apt install build-essential libatomic1 zip unzip
-
Install openjdk 11 (you may compile it with openjdk 8 – see this for more information) set it:
sudo apt install openjdk-11-jdk-headless sudo update-java-alternatives -s java-1.11.0-openjdk-armhf
-
Download the proper source version from Github releases, I’ve used Release 3.7.2 (2020-12-17):
mkdir ~/bazel11 && cd $_ wget https://github.com/bazelbuild/bazel/releases/download/[YOUR_VERSION]/bazel-[YOUR_VERSION]-dist.zip unzip bazel-[YOUR_VERSION]-dist.zip
-
Open
~/bazel/tools/cpp/unix_cc_configure.bzl
and add-latomic
link flag tobazel_linkopts
around line 395. Otherwise, some undefined reference to … will pop up during compilation. -
Open
~/bazel/tools/jdk/BUILD
and add":jni_md_header-linux"
to"//conditions:default"
around line 145 forcc_library
-bazel-rule inhdrs
-block . And"include/linux"
to"//conditions:default"
inincludes
-block. -
Start compiling (it will take time):
env EXTRA_BAZEL_ARGS="--host_javabase=@local_jdk//:jdk" bash ./compile.sh
-
You can add output/bazel to PATH or copy everything in
/usr/local/bin
. -
Run bazel in the terminal and you should see the following result:
[bazel release 3.7.2- (@non-git)] Usage: bazel <command> <options> ... Available commands: analyze-profile Analyzes build profile data. aquery Analyzes the given targets and queries the action graph. build Builds the specified targets. canonicalize-flags Canonicalizes a list of bazel options. clean Removes output files and optionally stops the server. coverage Generates code coverage report for specified test targets. cquery Loads, analyzes, and queries the specified targets w/ configurations. dump Dumps the internal state of the bazel server process. fetch Fetches external repositories that are prerequisites to the targets. help Prints help for commands, or the index. info Displays runtime info about the bazel server. license Prints the license of this software. mobile-install Installs targets to mobile devices. print_action Prints the command line args for compiling a file. query Executes a dependency graph query. run Runs the specified target. shutdown Stops the bazel server. sync Syncs all repositories specified in the workspace file test Builds and runs the specified test targets. version Prints version information for bazel. Getting more help: bazel help <command> Prints help and options for <command>. bazel help startup_options Options for the JVM hosting bazel. bazel help target-syntax Explains the syntax for specifying targets. bazel help info-keys Displays a list of keys used by the info command.
That’s it!
Hi, thanks for this tutorial
I have used the same version as yours, however I get the following output when compiling
pi@raspberrypi:~/bazel $ env EXTRA_BAZEL_ARGS=”–host_javabase=@local_jdk//:jdk” bash ./compile.sh
🍃 Building Bazel from scratchfind: ‘/usr/share/java/netty-buffer.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-codec-dns.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-codec-haproxy.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-codec-http2.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-codec-http.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-codec.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-codec-memcache.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-codec-mqtt.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-codec-redis.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-codec-smtp.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-codec-socks.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-codec-stomp.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-common.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-handler.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-handler-proxy.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-resolver-dns.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-resolver-dns-native-macos.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-resolver.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-transport.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-transport-native-epoll.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-transport-native-kqueue.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-transport-native-unix-common.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-transport-sctp.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/gson.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/tomcat9-annotations-api.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/tomcat9-annotations-api.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/java-allocation-instrumenter.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/protobuf.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/protobuf-util.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/protobuf.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/protobuf-util.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/commons-collections3.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/commons-lang.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/commons-compress.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/commons-logging.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/commons-pool2.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/velocity.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/asm.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/jackson-core.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/jcip-annotations.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/jcip-annotations.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/jsr305.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/jsr305.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/netty-tcnative.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/javapoet.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/jaxb-api.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/xz.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/geronimo-annotation-1.3-spec.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/com.android.tools.common.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/com.android.tools.repository.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/com.android.tools.layoutlib.layoutlib-api.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/guava.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/guava.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/org.jacoco.agent.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/org.jacoco.agent.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/org.jacoco.core.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/org.jacoco.core.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/org.jacoco.core.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/org.jacoco.core.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/org.jacoco.report.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/org.jacoco.report.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/org.jacoco.agent.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/org.jacoco.agent.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/auto-common.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/auto-service.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/auto-service-annotations.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/escapevelocity.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/auto-value.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/auto-value-annotations.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/auto-value.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/auto-value-annotations.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/auto-common.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/escapevelocity.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/javapoet.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/google-api-client.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/google-api-client-jackson2.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/google-http-client.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/google-http-client-jackson2.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/google-auth-library-oauth2-http.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/google-auth-library-credentials.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/error-prone-annotations.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/error-prone-type-annotations.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/error-prone-annotations.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/java-diff-utils.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/opencensus-api.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/opencensus-contrib-grpc-metrics.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/perfmark-api.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/flogger.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/flogger-system-backend.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/google-extensions.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/flogger.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/flogger-system-backend.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/google-extensions.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/checker-qual.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/grpc-api.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/grpc-auth.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/grpc-context.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/grpc-core.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/grpc-netty.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/grpc-protobuf.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/grpc-protobuf-lite.jar’: Aucun fichier ou dossier de ce type
find: ‘/usr/share/java/grpc-stub.jar’: Aucun fichier ou dossier de ce type
ERROR: Must specify PROTOC if not bootstrapping from the distribution artifact
NOTE: This failure is likely occuring if you are trying to bootstrap bazel from
a developer checkout. Those checkouts do not include the generated output of
the protoc compiler (as we prefer not to version generated files).
To build a developer version of bazel, do
bazel build //src:bazel
To bootstrap your first bazel binary, please download a dist archive from our
release page at https://github.com/bazelbuild/bazel/releases and run
compile.sh on the unpacked archive.
The full install instructions to install a release version of bazel can be found
at https://docs.bazel.build/install-compile-source.html
For a rationale, why the bootstrap process is organized in this way, see
https://bazel.build/designs/2016/10/11/distribution-artifact.html
pi@raspberrypi:~/bazel $
Any idea how to resolve the pb?
Thanks
Please explain more.
Which OS are you installed? If Raspbian, use Lagecy!
Which version of Java and Bazel you have on your OS?