xref: /aosp_15_r20/external/executorch/backends/qualcomm/scripts/build.sh (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1# Copyright (c) Qualcomm Innovation Center, Inc.
2# All rights reserved
3#
4# This source code is licensed under the BSD-style license found in the
5# LICENSE file in the root directory of this source tree.
6set -e
7set -o xtrace
8
9if [[ -z ${QNN_SDK_ROOT} ]]; then
10    echo "Please export QNN_SDK_ROOT=/path/to/qnn_sdk"
11    exit -1
12fi
13
14
15
16usage() {
17  echo "Usage: Build the aarch64 version of executor runner or the python interface of Qnn Manager"
18  echo "First, you need to set the environment variable for QNN_SDK_ROOT"
19  echo ", and if you want to build the aarch64 version of executor runner"
20  echo ", you need to export ANDROID_NDK_ROOT=/path/to/android_ndkXX"
21  echo "e.g.: executorch$ ./backends/qualcomm/scripts/build.sh --skip_x86_64"
22  exit 1
23}
24
25
26[ "$1" = -h ] && usage
27
28BUILD_X86_64="true"
29CMAKE_X86_64="build-x86"
30BUILD_AARCH64="true"
31CMAKE_AARCH64="build-android"
32CLEAN="true"
33BUILD_TYPE="Debug"
34BUILD_JOB_NUMBER="16"
35
36if [ -z PYTHON_EXECUTABLE ]; then
37  PYTHON_EXECUTABLE="python3"
38fi
39
40if [ -z BUCK2 ]; then
41  BUCK2="buck2"
42fi
43
44long_options=skip_x86_64,skip_aarch64,no_clean,release,job_number:
45
46parsed_args=$(getopt -a --options '' --longoptions $long_options --name "$0" -- "$@")
47eval set -- "$parsed_args"
48
49
50while true ; do
51    case "$1" in
52        --skip_x86_64) BUILD_X86_64="false"; shift;;
53        --skip_aarch64) BUILD_AARCH64="false"; shift;;
54        --no_clean) CLEAN="false"; shift;;
55        --release) BUILD_TYPE="Release"; shift;;
56        --job_number) BUILD_JOB_NUMBER="$2"; shift 2;;
57        --) shift; break;;
58    esac
59done
60
61PRJ_ROOT="$( cd "$(dirname "$0")/../../.." ; pwd -P)"
62
63if [ "$BUILD_AARCH64" = true ]; then
64    if [[ -z ${ANDROID_NDK_ROOT} ]]; then
65        echo "Please export ANDROID_NDK_ROOT=/path/to/android_ndkXX"
66        exit -1
67    fi
68
69    BUILD_ROOT=$PRJ_ROOT/$CMAKE_AARCH64
70    if [ "$CLEAN" = true ]; then
71        rm -rf $BUILD_ROOT && mkdir $BUILD_ROOT
72    else
73        # Force rebuild flatccrt for the correct platform
74        cd $BUILD_ROOT/devtools && make clean
75    fi
76
77    cd $BUILD_ROOT
78    cmake .. \
79        -DCMAKE_INSTALL_PREFIX=$BUILD_ROOT \
80        -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
81        -DEXECUTORCH_BUILD_QNN=ON \
82        -DEXECUTORCH_BUILD_DEVTOOLS=ON \
83        -DEXECUTORCH_BUILD_EXTENSION_MODULE=ON \
84        -DEXECUTORCH_BUILD_EXTENSION_TENSOR=ON \
85        -DEXECUTORCH_ENABLE_EVENT_TRACER=ON \
86        -DQNN_SDK_ROOT=$QNN_SDK_ROOT \
87        -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_ROOT/build/cmake/android.toolchain.cmake \
88        -DANDROID_ABI='arm64-v8a' \
89        -DANDROID_NATIVE_API_LEVEL=23 \
90        -DPYTHON_EXECUTABLE=$PYTHON_EXECUTABLE \
91        -B$BUILD_ROOT
92
93    cmake --build $BUILD_ROOT -j$BUILD_JOB_NUMBER --target install
94
95    EXAMPLE_ROOT=examples/qualcomm
96    CMAKE_PREFIX_PATH="${BUILD_ROOT}/lib/cmake/ExecuTorch;${BUILD_ROOT}/third-party/gflags;"
97
98    cmake $PRJ_ROOT/$EXAMPLE_ROOT \
99        -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_ROOT/build/cmake/android.toolchain.cmake \
100        -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
101        -DANDROID_ABI='arm64-v8a' \
102        -DANDROID_NATIVE_API_LEVEL=23 \
103        -DCMAKE_PREFIX_PATH=$CMAKE_PREFIX_PATH \
104        -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=BOTH \
105        -DPYTHON_EXECUTABLE=$PYTHON_EXECUTABLE \
106        -B$EXAMPLE_ROOT
107
108    cmake --build $EXAMPLE_ROOT -j$BUILD_JOB_NUMBER
109fi
110
111if [ "$BUILD_X86_64" = true ]; then
112    BUILD_ROOT=$PRJ_ROOT/$CMAKE_X86_64
113    if [ "$CLEAN" = true ]; then
114        rm -rf $BUILD_ROOT && mkdir $BUILD_ROOT
115    else
116        # Force rebuild flatccrt for the correct platform
117        cd $BUILD_ROOT/devtools && make clean
118    fi
119
120    cd $BUILD_ROOT
121    cmake \
122        -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
123        -DCMAKE_INSTALL_PREFIX=$BUILD_ROOT \
124        -DQNN_SDK_ROOT=${QNN_SDK_ROOT} \
125        -DEXECUTORCH_BUILD_QNN=ON \
126        -DEXECUTORCH_BUILD_DEVTOOLS=ON \
127        -DEXECUTORCH_BUILD_EXTENSION_MODULE=ON \
128        -DEXECUTORCH_BUILD_EXTENSION_TENSOR=ON \
129        -DEXECUTORCH_ENABLE_EVENT_TRACER=ON \
130        -DPYTHON_EXECUTABLE=$PYTHON_EXECUTABLE \
131        -S $PRJ_ROOT \
132        -B $BUILD_ROOT \
133
134    cmake --build $BUILD_ROOT -j$BUILD_JOB_NUMBER --target install
135
136    rm -f $PRJ_ROOT/backends/qualcomm/python/*
137    cp -fv $BUILD_ROOT/backends/qualcomm/Py* "$PRJ_ROOT/backends/qualcomm/python"
138    cp -fv "$PRJ_ROOT/schema/program.fbs" "$PRJ_ROOT/exir/_serialize/program.fbs"
139    cp -fv "$PRJ_ROOT/schema/scalar_type.fbs" "$PRJ_ROOT/exir/_serialize/scalar_type.fbs"
140
141   EXAMPLE_ROOT=examples/qualcomm
142   CMAKE_PREFIX_PATH="${BUILD_ROOT}/lib/cmake/ExecuTorch;${BUILD_ROOT}/third-party/gflags;"
143
144   cmake $PRJ_ROOT/$EXAMPLE_ROOT \
145       -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
146       -DCMAKE_PREFIX_PATH=$CMAKE_PREFIX_PATH \
147       -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=BOTH \
148       -DPYTHON_EXECUTABLE=$PYTHON_EXECUTABLE \
149       -B$EXAMPLE_ROOT
150
151   cmake --build $EXAMPLE_ROOT -j$BUILD_JOB_NUMBER
152fi
153