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