Build Flutter engine for linux-arm/arm64
HW:
- Hardkernel ODROID-N2 (https://www.hardkernel.com/product/)
- Hardkernel ODROID-C4 (https://www.hardkernel.com/product/)
- ODROID-VU7A+ (https://www.hardkernel.com/product/)
OS:
- Ubuntu disco minimal 20191228(ODROID-N2) (http://ppa.linuxfactory.or.kr/images/raw/arm64/disco/)
- Ubuntu focal server 20201024(ODROID-C4) (http://ppa.linuxfactory.or.kr/images/raw/arm64/focal/)
- Ubuntu focal mate 20201020(ODROID-C4) (https://dn.odroid.com/S905X3/ODROID-C4/Ubuntu/)
Make sure the command ran successfully before running the next command!!
Dependencies
Host(Linux x86_64)
mkdir -p $HOME/flutter-engine/sdk/toolchain \
&& mkdir -p $HOME/flutter-engine/sdk/sysroot \
&& mkdir -p $HOME/flutter-engine/engine
Using docker, run docker run -it --volume="$HOME/flutter-engine:/root/flutter-engine:shared" ubuntu:18.04 /bin/bash
.
Then, run apt update && apt install sudo
on the container before following what is shown below.
sudo apt update -y \
&& sudo apt install -y bison build-essential cmake curl flex gcc git \
lsb-release libgmp-dev make ninja-build pkg-config python python3 \
rsync subversion texinfo vim wget \
&& sudo apt autoremove -y
Target(Linux ARM/ARM64)
Connect the SD card or eMMC with OS to your SBC.
sudo apt update -y \
&& sudo apt install -y build-essential clang cmake git libblkid-dev \
libfreetype6-dev libglib2.0-dev libgtk-3-dev liblzma-dev ninja-build \
pkg-config rsync symlinks vim \
&& sudo apt autoremove -y
sysroot
It may vary depending on various conditions. If symbolic links are broken, you will get some errors when following the steps below.
When I tested this, most of the errors occured for this reason.
Target(Linux ARM/ARM64)
sudo symlinks -crs /*
sudo rsync -a -e 'ssh -p <host port>' /lib /usr /etc /opt \
<host user>@<host ip>:~/flutter-engine/sdk/sysroot
Host(Linux x86_64)
When I built all successfully, the directory structure is shown below. Since /
(root) is copied to $HOME/flutter-engine/sdk/sysroot
, setting a symbolic link path to an absolute path can break symbolic links.
$HOME/flutter-engine/sdk/sysroot
├── lib -> usr/lib
└── usr
├── include
│ └── ...
└── lib
├── aarch64-linux-gnu
│ ├── crt1.o
│ ├── crti.o
│ ├── crtn.o
│ ├── ld-2.29.so
│ ├── ld-linux-aarch64.so.1 -> ld-2.29.so
│ ├── libc-2.29.so
│ ├── libc_nonshared.a
│ ├── libc.so
│ ├── libc.so.6 -> libc-2.29.so
│ ├── libdl-2.29.so
│ ├── libdl.so -> ../../../lib/aarch64-linux-gnu/libdl.so.2
│ ├── libdl.so.2 -> libdl-2.29.so
│ ├── libgcc_s.so.1
│ ├── libm-2.29.so
│ ├── libm.so -> libm.so.6
│ ├── libm.so.6 -> libm-2.29.so
│ ├── libpthread-2.29.so
│ ├── libpthread.so -> ../../../lib/aarch64-linux-gnu/libpthread.so.0
│ ├── libpthread.so.0 -> libpthread-2.29.so
│ ├── librt-2.29.so
│ ├── librt.so -> ../../../lib/aarch64-linux-gnu/librt.so.1
│ ├── librt.so.1 -> librt-2.29.so
│ ├── libstdc++.so.6 -> libstdc++.so.6.0.26
│ └── libstdc++.so.6.0.26
└── gcc
└── aarch64-linux-gnu
└── 8
├── crtbegin.o
├── crtbeginS.o
├── crtend.o
├── crtendS.o
├── libgcc.a
├── libgcc_s.so -> ../../../aarch64-linux-gnu/libgcc_s.so.1
└── libstdc++.so -> ../../../aarch64-linux-gnu/libstdc++.so.6
Host(Linux x86_64)
Clang installation
Clang and LLVM
git clone --branch=llvmorg-11.1.0 --depth=1 \
https://github.com/llvm/llvm-project.git $HOME/flutter-engine/llvm-project
cd $HOME/flutter-engine/llvm-project
- ARM
- ARM64
[ -d build_llvm ] && sudo rm -r build_llvm ;\
cmake -G Ninja \
-S llvm \
-B build_llvm \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CROSSCOMPILING=True \
-DCMAKE_INSTALL_PREFIX=$HOME/flutter-engine/sdk/toolchain \
-DLLVM_ENABLE_PROJECTS=clang \
-DLLVM_DEFAULT_TARGET_TRIPLE=arm-linux-gnueabihf \
-DLLVM_TARGET_ARCH=ARM \
-DLLVM_TARGETS_TO_BUILD=ARM
[ -d build_llvm ] && sudo rm -r build_llvm ;\
cmake -G Ninja \
-S llvm \
-B build_llvm \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CROSSCOMPILING=True \
-DCMAKE_INSTALL_PREFIX=$HOME/flutter-engine/sdk/toolchain \
-DLLVM_ENABLE_PROJECTS=clang \
-DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-gnu \
-DLLVM_TARGET_ARCH=AArch64 \
-DLLVM_TARGETS_TO_BUILD=AArch64
cmake --build build_llvm \
&& sudo cmake --install build_llvm
binutils-gdb
git clone --depth=1 git://sourceware.org/git/binutils-gdb.git \
$HOME/flutter-engine/binutils-gdb
cd $HOME/flutter-engine/binutils-gdb
- ARM
- ARM64
./configure --prefix="$HOME/flutter-engine/sdk/toolchain" \
--enable-gold \
--enable-ld \
--target=arm-linux-gnueabihf
./configure --prefix="$HOME/flutter-engine/sdk/toolchain" \
--enable-gold \
--enable-ld \
--target=aarch64-linux-gnu
make -j$(expr $(expr $(nproc) \* 6) \/ 5) \
&& sudo make install
libcxxabi and libcxx
libcxx
is statically linked to the engine for minimal dependencies.
cd $HOME/flutter-engine/llvm-project
- ARM
- ARM64
[ -d build_libcxxabi ] && sudo rm -r build_libcxxabi ;\
cmake -G Ninja \
-S libcxxabi \
-B build_libcxxabi \
-DCMAKE_MAKE_PROGRAM=$(which ninja) \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_SYSROOT=$HOME/flutter-engine/sdk/sysroot \
-DCMAKE_INSTALL_PREFIX=$HOME/flutter-engine/sdk/toolchain \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_PROCESSOR=ARM \
-DCMAKE_C_COMPILER=$HOME/flutter-engine/sdk/toolchain/bin/clang \
-DCMAKE_CXX_COMPILER=$HOME/flutter-engine/sdk/toolchain/bin/clang++ \
-DCMAKE_AR=$HOME/flutter-engine/sdk/toolchain/bin/arm-linux-gnueabihf-ar \
-DCMAKE_RANLIB=$HOME/flutter-engine/sdk/toolchain/bin/arm-linux-gnueabihf-ranlib \
-DLLVM_TARGETS_TO_BUILD=ARM \
-DLIBCXX_ENABLE_SHARED=False \
-DLIBCXXABI_ENABLE_EXCEPTIONS=False
[ -d build_libcxxabi ] && sudo rm -r build_libcxxabi ;\
cmake -G Ninja \
-S libcxxabi \
-B build_libcxxabi \
-DCMAKE_MAKE_PROGRAM=$(which ninja) \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_SYSROOT=$HOME/flutter-engine/sdk/sysroot \
-DCMAKE_INSTALL_PREFIX=$HOME/flutter-engine/sdk/toolchain \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_PROCESSOR=AArch64 \
-DCMAKE_C_COMPILER=$HOME/flutter-engine/sdk/toolchain/bin/clang \
-DCMAKE_CXX_COMPILER=$HOME/flutter-engine/sdk/toolchain/bin/clang++ \
-DCMAKE_AR=$HOME/flutter-engine/sdk/toolchain/bin/aarch64-linux-gnu-ar \
-DCMAKE_RANLIB=$HOME/flutter-engine/sdk/toolchain/bin/aarch64-linux-gnu-ranlib \
-DLLVM_TARGETS_TO_BUILD=AArch64 \
-DLIBCXX_ENABLE_SHARED=False \
-DLIBCXXABI_ENABLE_EXCEPTIONS=False
cmake --build build_libcxxabi \
&& sudo cmake --install build_libcxxabi
- ARM
- ARM64
[ -d build_libcxx ] && sudo rm -r build_libcxx ;\
cmake -G Ninja \
-S libcxx \
-B build_libcxx \
-DCMAKE_MAKE_PROGRAM=$(which ninja) \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_SYSROOT=$HOME/flutter-engine/sdk/sysroot \
-DCMAKE_INSTALL_PREFIX=$HOME/flutter-engine/sdk/toolchain \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_PROCESSOR=ARM \
-DCMAKE_C_COMPILER=$HOME/flutter-engine/sdk/toolchain/bin/clang \
-DCMAKE_CXX_COMPILER=$HOME/flutter-engine/sdk/toolchain/bin/clang++ \
-DCMAKE_AR=$HOME/flutter-engine/sdk/toolchain/bin/arm-linux-gnueabihf-ar \
-DCMAKE_RANLIB=$HOME/flutter-engine/sdk/toolchain/bin/arm-linux-gnueabihf-ranlib \
-DLLVM_TARGETS_TO_BUILD=ARM \
-DLIBCXX_ENABLE_EXCEPTIONS=False \
-DLIBCXX_ENABLE_SHARED=False \
-DLIBCXX_ENABLE_RTTI=False \
-DLIBCXX_CXX_ABI=libcxxabi \
-DLIBCXX_CXX_ABI_INCLUDE_PATHS=$HOME/flutter-engine/llvm-project/libcxxabi/include \
-DLIBCXX_CXX_ABI_LIBRARY_PATH=$HOME/flutter-engine/sdk/toolchain/lib \
-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=True
[ -d build_libcxx ] && sudo rm -r build_libcxx ;\
cmake -G Ninja \
-S libcxx \
-B build_libcxx \
-DCMAKE_MAKE_PROGRAM=$(which ninja) \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_SYSROOT=$HOME/flutter-engine/sdk/sysroot \
-DCMAKE_INSTALL_PREFIX=$HOME/flutter-engine/sdk/toolchain \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_PROCESSOR=AArch64 \
-DCMAKE_C_COMPILER=$HOME/flutter-engine/sdk/toolchain/bin/clang \
-DCMAKE_CXX_COMPILER=$HOME/flutter-engine/sdk/toolchain/bin/clang++ \
-DCMAKE_AR=$HOME/flutter-engine/sdk/toolchain/bin/aarch64-linux-gnu-ar \
-DCMAKE_RANLIB=$HOME/flutter-engine/sdk/toolchain/bin/aarch64-linux-gnu-ranlib \
-DLLVM_TARGETS_TO_BUILD=AArch64 \
-DLIBCXX_ENABLE_EXCEPTIONS=False \
-DLIBCXX_ENABLE_SHARED=False \
-DLIBCXX_ENABLE_RTTI=False \
-DLIBCXX_CXX_ABI=libcxxabi \
-DLIBCXX_CXX_ABI_INCLUDE_PATHS=$HOME/flutter-engine/llvm-project/libcxxabi/include \
-DLIBCXX_CXX_ABI_LIBRARY_PATH=$HOME/flutter-engine/sdk/toolchain/lib \
-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=True
cmake --build build_libcxx \
&& sudo cmake --install build_libcxx
depot_tools
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git \
$HOME/flutter-engine/depot_tools
export PATH=$PATH:$HOME/flutter-engine/depot_tools
flutter-engine
Ref: https://github.com/flutter/flutter/wiki/Setting-up-the-Engine-development-environment
After reading the Ref above, follow flutter-engine part.
echo 'solutions = [
{
"managed": False,
"name": "src/flutter",
"url": "[email protected]:hhk7734/engine.git",
"custom_deps": {},
"deps_file": "DEPS",
"safesync_url": "",
},
]' >> $HOME/flutter-engine/engine/.gclient \
&& cd $HOME/flutter-engine/engine \
&& gclient sync -D
Select engine revision
cd $HOME/flutter-engine/engine/src/flutter \
&& git remote add upstream [email protected]:flutter/engine.git
git checkout master \
&& git pull upstream master \
&& git push origin master
git checkout <engine revision>
gclient sync -D
Dependencies
cd $HOME/flutter-engine/engine/src \
&& sudo ./build/install-build-deps-android.sh
sudo ./build/install-build-deps.sh
sudo ./flutter/build/install-build-deps-linux-desktop.sh
Build
cd $HOME/flutter-engine/engine/src
- ARM
- ARM64
cp $HOME/flutter-engine/sdk/sysroot/usr/lib/arm-linux-gnueabihf/pkgconfig/* \
$HOME/flutter-engine/sdk/sysroot/usr/share/pkgconfig
[ -d out/linux_debug_arm ] && sudo rm -r out/linux_debug_arm ;\
./flutter/tools/gn \
--target-sysroot $HOME/flutter-engine/sdk/sysroot \
--target-toolchain $HOME/flutter-engine/sdk/toolchain \
--target-triple arm-linux-gnueabihf \
--target-os linux \
--linux-cpu arm \
--embedder-for-target \
--no-lto \
--no-goma \
--runtime-mode debug \
--arm-float-abi hard
ninja -C out/linux_debug_arm
[ -d out/linux_profile_arm ] && sudo rm -r out/linux_profile_arm ;\
./flutter/tools/gn \
--target-sysroot $HOME/flutter-engine/sdk/sysroot \
--target-toolchain $HOME/flutter-engine/sdk/toolchain \
--target-triple arm-linux-gnueabihf \
--target-os linux \
--linux-cpu arm \
--embedder-for-target \
--no-lto \
--no-goma \
--runtime-mode profile \
--arm-float-abi hard
ninja -C out/linux_profile_arm
[ -d out/linux_release_arm ] && sudo rm -r out/linux_release_arm ;\
./flutter/tools/gn \
--target-sysroot $HOME/flutter-engine/sdk/sysroot \
--target-toolchain $HOME/flutter-engine/sdk/toolchain \
--target-triple arm-linux-gnueabihf \
--target-os linux \
--linux-cpu arm \
--embedder-for-target \
--no-lto \
--no-goma \
--runtime-mode release \
--arm-float-abi hard
ninja -C out/linux_release_arm
cp $HOME/flutter-engine/sdk/sysroot/usr/lib/aarch64-linux-gnu/pkgconfig/* \
$HOME/flutter-engine/sdk/sysroot/usr/share/pkgconfig
[ -d out/linux_debug_arm64 ] && sudo rm -r out/linux_debug_arm64 ;\
./flutter/tools/gn \
--target-sysroot $HOME/flutter-engine/sdk/sysroot \
--target-toolchain $HOME/flutter-engine/sdk/toolchain \
--target-triple aarch64-linux-gnu \
--target-os linux \
--linux-cpu arm64 \
--embedder-for-target \
--no-lto \
--no-goma \
--runtime-mode debug
ninja -C out/linux_debug_arm64
[ -d out/linux_profile_arm64 ] && sudo rm -r out/linux_profile_arm64 ;\
./flutter/tools/gn \
--target-sysroot $HOME/flutter-engine/sdk/sysroot \
--target-toolchain $HOME/flutter-engine/sdk/toolchain \
--target-triple aarch64-linux-gnu \
--target-os linux \
--linux-cpu arm64 \
--embedder-for-target \
--no-lto \
--no-goma \
--runtime-mode profile
ninja -C out/linux_profile_arm64
[ -d out/linux_release_arm64 ] && sudo rm -r out/linux_release_arm64 ;\
./flutter/tools/gn \
--target-sysroot $HOME/flutter-engine/sdk/sysroot \
--target-toolchain $HOME/flutter-engine/sdk/toolchain \
--target-triple aarch64-linux-gnu \
--target-os linux \
--linux-cpu arm64 \
--embedder-for-target \
--no-lto \
--no-goma \
--runtime-mode release
ninja -C out/linux_release_arm64