xref: /aosp_15_r20/external/pytorch/scripts/build_mobile.sh (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker#!/bin/bash
2*da0073e9SAndroid Build Coastguard Worker##############################################################################
3*da0073e9SAndroid Build Coastguard Worker# Example command to build the mobile target.
4*da0073e9SAndroid Build Coastguard Worker##############################################################################
5*da0073e9SAndroid Build Coastguard Worker#
6*da0073e9SAndroid Build Coastguard Worker# This script shows how one can build a libtorch library optimized for mobile
7*da0073e9SAndroid Build Coastguard Worker# devices using host toolchain.
8*da0073e9SAndroid Build Coastguard Worker
9*da0073e9SAndroid Build Coastguard Workerset -e
10*da0073e9SAndroid Build Coastguard Worker
11*da0073e9SAndroid Build Coastguard Workerexport BUILD_PYTORCH_MOBILE_WITH_HOST_TOOLCHAIN=1
12*da0073e9SAndroid Build Coastguard WorkerCAFFE2_ROOT="$( cd "$(dirname "$0")"/.. ; pwd -P)"
13*da0073e9SAndroid Build Coastguard Worker
14*da0073e9SAndroid Build Coastguard Workerecho "Bash: $(/bin/bash --version | head -1)"
15*da0073e9SAndroid Build Coastguard Workerecho "Caffe2 path: $CAFFE2_ROOT"
16*da0073e9SAndroid Build Coastguard Worker
17*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS=()
18*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DCMAKE_PREFIX_PATH=$(python -c 'import sysconfig; print(sysconfig.get_path("purelib"))')")
19*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DPython_EXECUTABLE=$(python -c 'import sys; print(sys.executable)')")
20*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DBUILD_CUSTOM_PROTOBUF=OFF")
21*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DBUILD_SHARED_LIBS=OFF")
22*da0073e9SAndroid Build Coastguard Worker
23*da0073e9SAndroid Build Coastguard Worker# custom build with selected ops
24*da0073e9SAndroid Build Coastguard Workerif [ -n "${SELECTED_OP_LIST}" ]; then
25*da0073e9SAndroid Build Coastguard Worker  SELECTED_OP_LIST="$(cd $(dirname $SELECTED_OP_LIST); pwd -P)/$(basename $SELECTED_OP_LIST)"
26*da0073e9SAndroid Build Coastguard Worker  echo "Choose SELECTED_OP_LIST file: $SELECTED_OP_LIST"
27*da0073e9SAndroid Build Coastguard Worker  if [ ! -r ${SELECTED_OP_LIST} ]; then
28*da0073e9SAndroid Build Coastguard Worker    echo "Error: SELECTED_OP_LIST file ${SELECTED_OP_LIST} not found."
29*da0073e9SAndroid Build Coastguard Worker    exit 1
30*da0073e9SAndroid Build Coastguard Worker  fi
31*da0073e9SAndroid Build Coastguard Worker  CMAKE_ARGS+=("-DSELECTED_OP_LIST=${SELECTED_OP_LIST}")
32*da0073e9SAndroid Build Coastguard Workerfi
33*da0073e9SAndroid Build Coastguard Worker
34*da0073e9SAndroid Build Coastguard Worker# If Ninja is installed, prefer it to Make
35*da0073e9SAndroid Build Coastguard Workerif [ -x "$(command -v ninja)" ]; then
36*da0073e9SAndroid Build Coastguard Worker  CMAKE_ARGS+=("-GNinja")
37*da0073e9SAndroid Build Coastguard Workerfi
38*da0073e9SAndroid Build Coastguard Worker
39*da0073e9SAndroid Build Coastguard Worker# Don't build artifacts we don't need
40*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DBUILD_TEST=OFF")
41*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DBUILD_BINARY=OFF")
42*da0073e9SAndroid Build Coastguard Worker
43*da0073e9SAndroid Build Coastguard Worker# If there exists env variable and it equals to 1, build lite interpreter.
44*da0073e9SAndroid Build Coastguard Worker# Default behavior is to build full jit interpreter.
45*da0073e9SAndroid Build Coastguard Worker# cmd:  BUILD_LITE_INTERPRETER=1 ./scripts/build_mobile.sh
46*da0073e9SAndroid Build Coastguard Workerif [ "x${BUILD_LITE_INTERPRETER}" == "x1" ]; then
47*da0073e9SAndroid Build Coastguard Worker  CMAKE_ARGS+=("-DBUILD_LITE_INTERPRETER=ON")
48*da0073e9SAndroid Build Coastguard Workerelse
49*da0073e9SAndroid Build Coastguard Worker  CMAKE_ARGS+=("-DBUILD_LITE_INTERPRETER=OFF")
50*da0073e9SAndroid Build Coastguard Workerfi
51*da0073e9SAndroid Build Coastguard Workerif [ "x${TRACING_BASED}" == "x1" ]; then
52*da0073e9SAndroid Build Coastguard Worker  CMAKE_ARGS+=("-DTRACING_BASED=ON")
53*da0073e9SAndroid Build Coastguard Workerelse
54*da0073e9SAndroid Build Coastguard Worker  CMAKE_ARGS+=("-DTRACING_BASED=OFF")
55*da0073e9SAndroid Build Coastguard Workerfi
56*da0073e9SAndroid Build Coastguard Worker
57*da0073e9SAndroid Build Coastguard Worker# Lightweight dispatch bypasses the PyTorch Dispatcher.
58*da0073e9SAndroid Build Coastguard Workerif [ "${USE_LIGHTWEIGHT_DISPATCH}" == 1 ]; then
59*da0073e9SAndroid Build Coastguard Worker  CMAKE_ARGS+=("-DUSE_LIGHTWEIGHT_DISPATCH=ON")
60*da0073e9SAndroid Build Coastguard Worker  CMAKE_ARGS+=("-DSTATIC_DISPATCH_BACKEND=CPU")
61*da0073e9SAndroid Build Coastguard Workerelse
62*da0073e9SAndroid Build Coastguard Worker  CMAKE_ARGS+=("-DUSE_LIGHTWEIGHT_DISPATCH=OFF")
63*da0073e9SAndroid Build Coastguard Workerfi
64*da0073e9SAndroid Build Coastguard Worker
65*da0073e9SAndroid Build Coastguard Worker# Disable unused dependencies
66*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DUSE_ROCM=OFF")
67*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DUSE_CUDA=OFF")
68*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DUSE_ITT=OFF")
69*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DUSE_GFLAGS=OFF")
70*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DUSE_OPENCV=OFF")
71*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DUSE_MPI=OFF")
72*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DUSE_OPENMP=OFF")
73*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DUSE_MKLDNN=OFF")
74*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DUSE_NNPACK=OFF")
75*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DUSE_NUMPY=OFF")
76*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("-DUSE_BLAS=OFF")
77*da0073e9SAndroid Build Coastguard Worker
78*da0073e9SAndroid Build Coastguard Worker# Only toggle if VERBOSE=1
79*da0073e9SAndroid Build Coastguard Workerif [ "${VERBOSE:-}" == '1' ]; then
80*da0073e9SAndroid Build Coastguard Worker  CMAKE_ARGS+=("-DCMAKE_VERBOSE_MAKEFILE=1")
81*da0073e9SAndroid Build Coastguard Workerfi
82*da0073e9SAndroid Build Coastguard Worker
83*da0073e9SAndroid Build Coastguard Worker# Use-specified CMake arguments go last to allow overridding defaults
84*da0073e9SAndroid Build Coastguard WorkerCMAKE_ARGS+=("$@")
85*da0073e9SAndroid Build Coastguard Worker
86*da0073e9SAndroid Build Coastguard Worker# Now, actually build the Android target.
87*da0073e9SAndroid Build Coastguard WorkerBUILD_ROOT=${BUILD_ROOT:-"$CAFFE2_ROOT/build_mobile"}
88*da0073e9SAndroid Build Coastguard WorkerINSTALL_PREFIX=${BUILD_ROOT}/install
89*da0073e9SAndroid Build Coastguard Workermkdir -p $BUILD_ROOT
90*da0073e9SAndroid Build Coastguard Workercd $BUILD_ROOT
91*da0073e9SAndroid Build Coastguard Workercmake "$CAFFE2_ROOT" \
92*da0073e9SAndroid Build Coastguard Worker    -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \
93*da0073e9SAndroid Build Coastguard Worker    -DCMAKE_BUILD_TYPE=Release \
94*da0073e9SAndroid Build Coastguard Worker    "${CMAKE_ARGS[@]}"
95*da0073e9SAndroid Build Coastguard Worker
96*da0073e9SAndroid Build Coastguard Worker# Cross-platform parallel build
97*da0073e9SAndroid Build Coastguard Workerif [ -z "$MAX_JOBS" ]; then
98*da0073e9SAndroid Build Coastguard Worker  if [ "$(uname)" == 'Darwin' ]; then
99*da0073e9SAndroid Build Coastguard Worker    MAX_JOBS=$(sysctl -n hw.ncpu)
100*da0073e9SAndroid Build Coastguard Worker  else
101*da0073e9SAndroid Build Coastguard Worker    MAX_JOBS=$(nproc)
102*da0073e9SAndroid Build Coastguard Worker  fi
103*da0073e9SAndroid Build Coastguard Workerfi
104*da0073e9SAndroid Build Coastguard Worker
105*da0073e9SAndroid Build Coastguard Workerecho "Will install headers and libs to $INSTALL_PREFIX for further project usage."
106*da0073e9SAndroid Build Coastguard Workercmake --build . --target install -- "-j${MAX_JOBS}"
107*da0073e9SAndroid Build Coastguard Workerecho "Installation completed, now you can copy the headers/libs from $INSTALL_PREFIX to your project directory."
108