Skip to content

Commit e3ad029

Browse files
walidbrgunes-arm
authored andcommitted
Update OOB test script for v25.11 release
Change-Id: Ia43c58fef91d3623b9a93009661315752b426516 Signed-off-by: Walid BEN ROMDHANE <[email protected]>
1 parent 64c3f92 commit e3ad029

File tree

1 file changed

+62
-13
lines changed

1 file changed

+62
-13
lines changed

scripts/build_android_ndk_guide.sh

Lines changed: 62 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#
55
# SPDX-License-Identifier: MIT
66
#
7-
87
function Usage() {
98
echo "This script builds Arm NN for Android using the Android NDK. The script builds"
109
echo "the Arm NN core library and its dependencies."
@@ -90,20 +89,21 @@ function GetAndroidNDK {
9089
cd $WORKING_DIR
9190
if [[ ! -d android-ndk-r26b ]]; then
9291
echo "+++ Getting Android NDK"
93-
wget https://dl.google.com/android/repository/android-ndk-r26b-linux.zip
94-
unzip android-ndk-r26b-linux.zip
92+
wget -O android-ndk-r26b-linux.zip https://dl.google.com/android/repository/android-ndk-r26b-linux.zip
93+
unzip -o android-ndk-r26b-linux.zip
94+
rm -f android-ndk-r26b-linux.zip
9595
fi
9696
}
9797

9898
function GetAndBuildCmake {
9999
echo "+++ Building Cmake 3.22.1"
100100
cd $WORKING_DIR
101-
sudo apt-get install libssl-dev
101+
sudo apt-get update -y && sudo apt-get install -y libssl-dev build-essential ca-certificates
102102
wget https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1.tar.gz
103103
tar -zxf cmake-3.22.1.tar.gz
104104
pushd cmake-3.22.1
105105
./bootstrap --prefix=$WORKING_DIR/cmake/install
106-
make all install
106+
make all install -j16
107107
popd
108108
}
109109

@@ -130,6 +130,7 @@ function GetAndBuildFlatbuffers {
130130

131131
CXXFLAGS="-fPIC" $CMAKE .. \
132132
-DFLATBUFFERS_BUILD_FLATC=1 \
133+
-DTFLITE_HOST_TOOLS_DIR=$WORKING_DIR/flatbuffers-x86/bin \
133134
-DCMAKE_INSTALL_PREFIX:PATH=$WORKING_DIR/flatbuffers-x86
134135

135136
make all install -j16
@@ -140,11 +141,11 @@ function GetAndBuildFlatbuffers {
140141
rm -f CMakeCache.txt
141142

142143
rm -rf build-android
143-
mkdir build-android
144+
mkdir -p build-android
144145
cd build-android
145146

146147
rm -rf $WORKING_DIR/flatbuffers-android
147-
mkdir $WORKING_DIR/flatbuffers-android
148+
mkdir -p $WORKING_DIR/flatbuffers-android
148149

149150
CC=/usr/bin/aarch64-linux-gnu-gcc CXX=/usr/bin/aarch64-linux-gnu-g++ \
150151
CXXFLAGS="-fPIC" $CMAKE .. \
@@ -216,7 +217,7 @@ function GetAndBuildComputeLibrary {
216217
}
217218

218219
function GetAndBuildTFLite {
219-
TENSORFLOW_REVISION="tags/v2.14.0" # TF 2.14.0
220+
TENSORFLOW_REVISION="tags/v2.19.0" # TF 2.19.0
220221
TFLITE_ROOT_DIR=${WORKING_DIR}/tensorflow/tensorflow/lite
221222

222223
cd $WORKING_DIR
@@ -237,14 +238,29 @@ function GetAndBuildTFLite {
237238
cd $WORKING_DIR
238239
fi
239240

241+
# Ensure we use a known host protoc and headers to generate any protos
242+
HOST_PROTOC="$WORKING_DIR/protobuf-host/bin/protoc"
243+
PROTOBUF_HOST_INCLUDE="$WORKING_DIR/protobuf-host/include"
244+
if [[ ! -x "$HOST_PROTOC" ]]; then
245+
echo "Error: Host protoc not found at $HOST_PROTOC. Build Protobuf first." >&2
246+
exit 1
247+
fi
248+
240249
CMARGS="-DTFLITE_ENABLE_XNNPACK=OFF \
241250
-DFLATBUFFERS_BUILD_FLATC=OFF \
242251
-DBUILD_SHARED_LIBS=OFF \
243-
-DBUILD_TESTING=OFF"
252+
-DBUILD_TESTING=OFF \
253+
-DTFLITE_BUILD_EXAMPLES=OFF \
254+
-DTFLITE_ENABLE_PROFILING=OFF \
255+
-DProtobuf_PROTOC_EXECUTABLE=$HOST_PROTOC \
256+
-DProtobuf_INCLUDE_DIRS=$PROTOBUF_HOST_INCLUDE \
257+
-DTFLITE_HOST_TOOLS_DIR=$WORKING_DIR/flatbuffers-x86/bin "
244258

245259
# Two different naming conventions; one for build and the other for CC_OPT_FLAGS
246260
ANDROID_ARM_ARCH="arm64-v8a"
247261

262+
# Clean previous build to avoid stale generated sources from older protoc
263+
rm -rf tflite-out/android
248264
mkdir -p tflite-out/android
249265
cd tflite-out/android
250266

@@ -265,21 +281,48 @@ function GetAndBuildTFLite {
265281

266282
mkdir -p $WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema
267283

268-
SCHEMA_LOCATION=$WORKING_DIR/tensorflow/tensorflow/lite/schema/schema.fbs
284+
# TensorFlow >= 2.14 moved schema to compiler/mlir/lite/schema
285+
SCHEMA_LOCATION_NEW=$WORKING_DIR/tensorflow/tensorflow/compiler/mlir/lite/schema/schema.fbs
286+
SCHEMA_LOCATION_OLD=$WORKING_DIR/tensorflow/tensorflow/lite/schema/schema.fbs
287+
if [[ -f "$SCHEMA_LOCATION_NEW" ]]; then
288+
SCHEMA_LOCATION="$SCHEMA_LOCATION_NEW"
289+
elif [[ -f "$SCHEMA_LOCATION_OLD" ]]; then
290+
SCHEMA_LOCATION="$SCHEMA_LOCATION_OLD"
291+
else
292+
echo "TensorFlow schema.fbs not found in expected locations." >&2
293+
echo "Tried: $SCHEMA_LOCATION_NEW and $SCHEMA_LOCATION_OLD" >&2
294+
exit 1
295+
fi
269296

270-
cp $SCHEMA_LOCATION $WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema
297+
cp "$SCHEMA_LOCATION" $WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema
271298

272299
cd $WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema
273300
$WORKING_DIR/flatbuffers-x86/bin/flatc -c --gen-object-api --reflect-types --reflect-names schema.fbs
274301
AssertZeroExitCode "Failed to generate C++ schema from $SCHEMA_LOCATION"
275302
}
276303

304+
function GetPrebuiltProtoc {
305+
# Download a prebuilt protoc binary + headers to speed up iteration
306+
# Set PROTOC_VERSION to override; defaults to 21.9 to align with build-tool flow
307+
local ver=${PROTOC_VERSION:-21.9}
308+
local url="https://github.com/protocolbuffers/protobuf/releases/download/v${ver}/protoc-${ver}-linux-x86_64.zip"
309+
local outzip="$WORKING_DIR/protoc-${ver}-linux-x86_64.zip"
310+
local dest="$WORKING_DIR/protobuf-host"
311+
312+
echo "+++ Downloading prebuilt protoc ${ver}"
313+
mkdir -p "$dest"
314+
wget -O "$outzip" "$url"
315+
unzip -o "$outzip" -d "$dest"
316+
rm -f "$outzip"
317+
"$dest/bin/protoc" --version || true
318+
}
319+
277320
function BuildArmNN {
278321
echo "+++ Building Arm NN"
279322

280323
rm -rf $WORKING_DIR/armnn/build
281324

282-
mkdir $WORKING_DIR/armnn/build
325+
mkdir -p $WORKING_DIR/armnn/build
283326
cd $WORKING_DIR/armnn/build
284327

285328
CMARGS="-DCMAKE_BUILD_TYPE=Release \
@@ -424,7 +467,9 @@ if [[ $? != 0 ]] ; then
424467
echo "Downloading Android NDK failed"
425468
exit 1
426469
fi
470+
427471
GetAndBuildCmake
472+
428473
CMAKE=$WORKING_DIR/cmake/install/bin/cmake
429474
GetAndBuildFlatbuffers
430475
if [[ $? != 0 ]] ; then
@@ -436,10 +481,14 @@ if [[ $? != 0 ]] ; then
436481
echo "Cloning Arm NN failed"
437482
exit 1
438483
fi
484+
439485
# Build TFLite if the Delegate or Parser is required
440-
if [[ $DELEGATE == 1 || $TFLITE_PARSER ]]; then
486+
if [[ "$DELEGATE" -eq 1 || "$TFLITE_PARSER" -eq 1 ]]; then
487+
# Faster path: use prebuilt protoc instead of rebuilding
488+
GetPrebuiltProtoc
441489
GetAndBuildTFLite
442490
fi
491+
443492
if [[ $? != 0 ]] ; then
444493
echo "Building tflite failed"
445494
exit 1

0 commit comments

Comments
 (0)