From cf3792628b0c4fc95d62fe2b2e77d63bee09ca47 Mon Sep 17 00:00:00 2001 From: MyungJoo Ham Date: Tue, 22 Sep 2026 16:44:06 +0900 Subject: [PATCH 1/4] [Meson] Enter the edge examples only when nnstreamer is found native/meson.build enters edgeAI_performance_benchmark on nns_edge_dep alone, but both of its executables - and example_training_offloading, nested in the same block - also list nns_dep, which is an optional dependency. With nnstreamer-edge installed and nnstreamer not, the directory is still entered and the build fails on a missing header: ../native/edgeAI_performance_benchmark/tensor_query_performance_benchmark.c:13:10: fatal error: nnstreamer_plugin_api.h: No such file or directory It reads as a missing include path rather than a missing dependency because nnstreamer-edge.pc sets includedir=/usr/include/nnstreamer, the same directory nnstreamer-dev installs into, so -I/usr/include/nnstreamer is on the command line while the header it looks for is not there. Gate the block on both dependencies, as every other optional group in the file is gated on what its targets actually link, and indent the nested nntrainer block so that the nesting is visible. The Debian package build is unaffected: debian/control build-depends on nnstreamer-dev and nnstreamer-edge-dev alike, so both examples are still built and installed there. Fixes: https://github.com/nnstreamer/nnstreamer/issues/5017 Signed-off-by: MyungJoo Ham Co-Authored-By: Claude Opus 5 --- native/meson.build | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/native/meson.build b/native/meson.build index 84ce1e76..d368d6f2 100644 --- a/native/meson.build +++ b/native/meson.build @@ -30,11 +30,11 @@ if have_tensorflow_lite subdir('example_low_light_image_enhancement') endif -if nns_edge_dep.found() +if nns_edge_dep.found() and nns_dep.found() subdir('edgeAI_performance_benchmark') -if nntrainer_dep.found() - subdir('example_training_offloading') -endif + if nntrainer_dep.found() + subdir('example_training_offloading') + endif endif if have_caffe2 From b34932cc9c2211035b72271904a99ad64d1ce28a Mon Sep 17 00:00:00 2001 From: MyungJoo Ham Date: Tue, 22 Sep 2026 16:44:17 +0900 Subject: [PATCH 2/4] [CI] Build the native examples with and without nnstreamer Nothing in this repository builds the meson tree, so a dependency gate that lets a subdirectory in without what it links stays invisible until someone configures that combination by hand. Add a job that builds native/ in the two configurations the edge examples care about - nnstreamer-edge alone, and nnstreamer-edge together with nnstreamer - and asserts in each that the benchmark binaries are exactly as present as the dependencies allow. The edge-only half fails to compile without the preceding commit; the other half keeps that fix from turning into a group nobody builds any more. Only the dependencies the unconditional examples need are installed, so the two configurations build seven and four targets and each job takes about a minute. Signed-off-by: MyungJoo Ham Co-Authored-By: Claude Opus 5 --- .github/workflows/meson-build.yml | 53 +++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 .github/workflows/meson-build.yml diff --git a/.github/workflows/meson-build.yml b/.github/workflows/meson-build.yml new file mode 100644 index 00000000..a76942e0 --- /dev/null +++ b/.github/workflows/meson-build.yml @@ -0,0 +1,53 @@ +name: Meson build + +on: + workflow_dispatch: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +permissions: + contents: read + +jobs: + native: + name: native examples (${{ matrix.config }}) + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + include: + - config: nnstreamer and nnstreamer-edge + nnstreamer_dev: nnstreamer-dev + edge_examples: 'yes' + - config: nnstreamer-edge only + nnstreamer_dev: '' + edge_examples: 'no' + steps: + - uses: actions/checkout@v4 + - name: Install the build dependencies + run: | + sudo add-apt-repository -y ppa:nnstreamer/ppa + sudo apt-get update + sudo apt-get install -y meson ninja-build pkg-config \ + libglib2.0-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \ + libunwind-dev libcairo2-dev nnstreamer-edge-dev ${{ matrix.nnstreamer_dev }} + - name: Build the native examples + run: | + meson setup build + meson compile -C build + - name: Check that the built examples match the dependencies + # nnstreamer-edge.pc puts /usr/include/nnstreamer on the command line on + # its own, so an edge example entered without nnstreamer fails on a + # missing header rather than on a missing dependency. + # https://github.com/nnstreamer/nnstreamer/issues/5017 + run: | + for name in performance_benchmark_query performance_benchmark_broadcast; do + bin="build/native/edgeAI_performance_benchmark/${name}" + if [ '${{ matrix.edge_examples }}' = 'yes' ]; then + test -x "${bin}" + else + test ! -e "${bin}" + fi + done From 3167817ff588373298bc1a429f99424b15952449 Mon Sep 17 00:00:00 2001 From: MyungJoo Ham Date: Wed, 23 Sep 2026 18:36:16 +0900 Subject: [PATCH 3/4] [CI] Run the Tizen app builds on ubuntu-24.04 Every job of tizen-build.yml asks for ubuntu-20.04, a runner image that GitHub no longer serves. The jobs stay queued until the run is cancelled after 24 hours, and no run of this workflow has completed since August 2025. Changing the label alone is not enough, because the Tizen Studio package manager checks its dependencies by package name, and noble fails that check in two ways: - It asks for python3.8 and libpython3.8, which the toolchain's gdb links. Noble ships neither; ppa:deadsnakes/ppa does. - It asks for libcurl3-gnutls, libglib2.0-0 and libv4l-0, which the t64 transition renamed. The libraries install under their new names, but the old names are only virtual, so the check still fails. equivs gives it installed packages under those names. Tizen Studio 6.1 asks for the same python3.8, so moving to a newer SDK does not avoid either workaround. libpython2.7 is dropped from the list: noble does not have it, and only the gcc-9.2 gdb binaries link it, which these jobs never run. libtinfo5, which the bundled clang needs and noble also lacks, needs nothing here: the SDK ships its own .deb for it and installs that. Signed-off-by: MyungJoo Ham Co-Authored-By: Claude Opus 5.5 --- .github/workflows/tizen-build.yml | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/.github/workflows/tizen-build.yml b/.github/workflows/tizen-build.yml index e0bdd570..bee97951 100644 --- a/.github/workflows/tizen-build.yml +++ b/.github/workflows/tizen-build.yml @@ -12,7 +12,7 @@ env: jobs: native: - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 strategy: matrix: # Only support tizen-8.0 application for now @@ -30,8 +30,17 @@ jobs: bash ${{ github.workspace }}/installer --accept-license ${{ github.workspace }}/tizen-studio export PATH=$PATH:${{ github.workspace }}/tizen-studio/package-manager + # python3.8 and the equivs name shims are for noble; drop them once the SDK supports it. + sudo add-apt-repository -y ppa:deadsnakes/ppa sudo apt update - sudo apt install -y libpython2.7 libkf5itemmodels5 libkf5kiowidgets5 libxcb-render-util0 libkchart2 libxcb-image0 libsdl1.2debian libv4l-0 libxcb-randr0 libxcb-shape0 libxcb-icccm4 gettext bridge-utils openvpn + sudo apt install -y python3.8 libpython3.8 equivs libkf5itemmodels5 libkf5kiowidgets5 libxcb-render-util0 libkchart2 libxcb-image0 libsdl1.2debian libv4l-0 libxcb-randr0 libxcb-shape0 libxcb-icccm4 gettext bridge-utils openvpn libcurl3-gnutls libglib2.0-0 + shims="${RUNNER_TEMP}/tizen-sdk-shims" + mkdir -p "${shims}" + for name in libcurl3-gnutls libglib2.0-0 libv4l-0; do + printf '%s\n' "Section: misc" "Priority: optional" "Standards-Version: 3.9.2" "Package: ${name}" "Version: 99:0" "Description: name shim for the Tizen SDK dependency check" > "${shims}/${name}.ctl" + (cd "${shims}" && equivs-build "${name}.ctl") + done + sudo dpkg -i "${shims}"/*.deb package-manager-cli.bin install NativeToolchain-Gcc-9.2 NativeCLI TIZEN-8.0 TIZEN-8.0-NativeAppDevelopment - name: Build Tizen native application shell: bash @@ -46,7 +55,7 @@ jobs: name: tizen_native_${{ matrix.app }} path: ${{ matrix.app }}.tpk web: - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 strategy: matrix: app: ['ImageClassificationSingleShot', 'ImageClassificationPipeline', 'ImageClassificationOffloading', 'ImageClassificationOffloadingYolo'] @@ -88,8 +97,17 @@ jobs: if: ${{ matrix.app == 'ImageClassificationOffloading' }} run: | export PATH=$PATH:${{ github.workspace }}/tizen-studio/tools/ide/bin:${{ github.workspace }}/tizen-studio/package-manager + # python3.8 and the equivs name shims are for noble; drop them once the SDK supports it. + sudo add-apt-repository -y ppa:deadsnakes/ppa sudo apt update - sudo apt install -y libpython2.7 libkf5itemmodels5 libkf5kiowidgets5 libxcb-render-util0 libkchart2 libxcb-image0 libsdl1.2debian libv4l-0 libxcb-randr0 libxcb-shape0 libxcb-icccm4 gettext bridge-utils openvpn + sudo apt install -y python3.8 libpython3.8 equivs libkf5itemmodels5 libkf5kiowidgets5 libxcb-render-util0 libkchart2 libxcb-image0 libsdl1.2debian libv4l-0 libxcb-randr0 libxcb-shape0 libxcb-icccm4 gettext bridge-utils openvpn libcurl3-gnutls libglib2.0-0 + shims="${RUNNER_TEMP}/tizen-sdk-shims" + mkdir -p "${shims}" + for name in libcurl3-gnutls libglib2.0-0 libv4l-0; do + printf '%s\n' "Section: misc" "Priority: optional" "Standards-Version: 3.9.2" "Package: ${name}" "Version: 99:0" "Description: name shim for the Tizen SDK dependency check" > "${shims}/${name}.ctl" + (cd "${shims}" && equivs-build "${name}.ctl") + done + sudo dpkg -i "${shims}"/*.deb package-manager-cli.bin install NativeToolchain-Gcc-9.2 NativeCLI TIZEN-8.0 TIZEN-8.0-NativeAppDevelopment tizen build-native -a arm -c llvm -C Debug -- ${{ github.workspace }}/Tizen.web/ImageClassificationOffloadingService tizen package -t tpk -- ${{ github.workspace }}/Tizen.web/ImageClassificationOffloadingService/Debug @@ -100,7 +118,7 @@ jobs: name: tizen_web_${{ matrix.app }} path: ${{ github.workspace }}/Tizen.web/${{ matrix.app }}/.buildResult/${{ matrix.app }}.wgt csharp: - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 strategy: matrix: app: ['TextClassification', 'OrientationDetection'] From 358882ad7f21769bd156510a3a0086c99d5d2ef0 Mon Sep 17 00:00:00 2001 From: MyungJoo Ham Date: Wed, 23 Sep 2026 18:59:12 +0900 Subject: [PATCH 4/4] [CI] Pin torch for the Yolo model export The ImageClassificationOffloadingYolo job exports yolov8s to TFLite with ultralytics 8.3.3, pinned since c468d34, but installs whatever torch is current. With torch 2.14, torch.onnx.export imports onnxscript, which nothing installs, so the export fails. Adding onnxscript is not enough: the export then crashes with SIGSEGV. Pin torch and torchvision to 2.4.1 and 0.19.1, the releases that were current when ultralytics 8.3.3 came out. With them the export succeeds on ubuntu-24.04 and writes yolov8s_float32.tflite. The web matrix runs with the default fail-fast, so this failure also cancelled ImageClassificationOffloading before it could finish. Signed-off-by: MyungJoo Ham Co-Authored-By: Claude Opus 5.5 --- .github/workflows/tizen-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tizen-build.yml b/.github/workflows/tizen-build.yml index bee97951..89daacb2 100644 --- a/.github/workflows/tizen-build.yml +++ b/.github/workflows/tizen-build.yml @@ -82,7 +82,7 @@ jobs: - name: Download tflite model if: ${{ matrix.app == 'ImageClassificationOffloadingYolo' }} run: | - pip install ultralytics==8.3.3 + pip install ultralytics==8.3.3 torch==2.4.1 torchvision==0.19.1 python3 ${{ github.workspace }}/Tizen.web/${{ matrix.app }}/get_tflite_model.py mv yolov8s_saved_model/yolov8s_float32.tflite ${{ github.workspace }}/Tizen.web/${{ matrix.app }}/res shell: bash