/cross-compile — build aarch64 binary for the H15 SBC
The Yocto SDK ships a full sysroot with all hailo-media-library libs prebuilt. For a single-app rebuild (typical case after /swap-model or any small main.cpp change), you do not need to build the whole library — just compile the one source file against the SDK's sysroot.
Inputs
- Path to the modified source file.
- Optional: target board (h15h vs h15l). Default to whichever SDK is installed on the host.
Procedure
Locate the SDK. Look for
environment-setup-armv8a-poky-linuxsomewhere under the user's working area./opt/poky/4.0.23/ # default install locationIf the search fails (no
environment-setup-armv8a-poky-linuxfound in the usual places), ask the user where the toolchain is located before proceeding — do not assume a path or jump to installing a new SDK. Only if the user confirms no SDK is installed, install it from the BSP package — look for.../prebuilt/sbc/sdk/poky-glibc-x86_64-core-image-minimal-armv8a-hailo15<arch>-sbc-toolchain-*.sh. It's a 2.5 GB self-extractor:<installer>.sh -y -d <destination-path>Install time is several minutes.
Source the env. This sets
CC,CXX,CXXFLAGS,PKG_CONFIG_PATH,PKG_CONFIG_SYSROOT_DIR, etc.. <sdk>/environment-setup-armv8a-poky-linux$CXXwill beaarch64-poky-linux-g++plus a long list of hardening flags and--sysroot=$SDKTARGETSYSROOT.Compile. A single-file build needs:
$CXX $CXXFLAGS -std=c++20 -DPERFETTO_NOT_FOUND \ $(pkg-config --cflags hailo-analytics hailo-medialib gstreamer-1.0 gstreamer-app-1.0 spdlog) \ main.cpp -o <app_name>.aarch64 \ $(pkg-config --libs hailo-analytics hailo-medialib gstreamer-1.0 gstreamer-app-1.0 spdlog) \ -lpthreadPick
<app_name>based on the source — e.g. the case-study name, or whatever the user calls the demo.- The perfetto define
-DPERFETTO_NOT_FOUNDmust match the library build, otherwise headers#error. - gstreamer pkg-configs are load-bearing even if main.cpp has no
<gst/gst.h>— analytics headers pull it in transitively.
- The perfetto define
Verify the artifact.
file <app_name>.aarch64 # → ELF 64-bit LSB pie executable, ARM aarch64, …Hand off to /deploy.
When to build the whole tree instead
If the user changed something inside hailo_analytics_api/, media_library/, or hailo-postprocess/ — i.e. a library, not just a top-level main.cpp — single-file compile won't help; the library needs rebuilding. The Media Library User Guide §6 documents the canonical Meson flow: source the SDK env first (so CC/CXX/PKG_CONFIG_PATH point at the cross toolchain), then run meson with the -Dplatform= flag matching the target board. The -Dplatform flag is required and board-specific — defaults to 15h, so H15L users must pass 15l explicitly or they'll get the wrong binary.
Each tree has a slightly different build, all per §6.2–§6.4:
. <sdk>/environment-setup-armv8a-poky-linux
# hailo-media-library (§6.2)
cd hailo-media-library
meson setup build --buildtype=release --prefix=/usr -Dplatform=15h # or -Dplatform=15l
ninja -C build
DESTDIR=/tmp/install ninja -C build install
scp -r /tmp/install/* root@<target-ip>:/
# hailo-analytics (§6.3) — heavier, can OOM
cd hailo-analytics
meson setup build --buildtype=release --prefix=/usr -Dplatform=15h \
-Dapps_install_dir=/home/root/apps
ninja -C build -j 10 -l 10 # job-limit prevents memory exhaustion
DESTDIR=/tmp/install ninja -C build install
scp -r /tmp/install/* root@<target-ip>:/
# hailo-postprocess (§6.4)
cd hailo-postprocess
meson setup build --buildtype=release --prefix=/usr -Dplatform=15h \
-Dpost_processes_install_dir=/usr/lib/hailo-post-processes/
ninja -C build
DESTDIR=/tmp/install ninja -C build install
scp -r /tmp/install/* root@<target-ip>:/
This is many minutes and produces .so files that also need to be deployed (replacing /usr/lib/libhailo_analytics.so.1.11.0 etc on the board). Confirm with the user before going down that path — it's heavier. (soon there will be a /build skill for that. check if that exists already)
Gotchas
mesonandpkg-configfrom the SDK come fromsysroots/x86_64-pokysdk-linux/usr/bin/. Sourcing the env script puts them onPATHahead of system tools — don't undo this.- The SDK is board-specific: Always cross-compile with the SDK that matches the target.
- The sysroot pkg-configs use
prefix=/usr— that's the target /usr, not the host's.$PKG_CONFIG_SYSROOT_DIRrewrites paths automatically. - Don't try to compile on the board. It has no
gcc/g++/pkg-configinstalled.