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