xref: /aosp_15_r20/external/pytorch/setup.py (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker# Welcome to the PyTorch setup.py.
2*da0073e9SAndroid Build Coastguard Worker# Environment variables you are probably interested in:
3*da0073e9SAndroid Build Coastguard Worker#
4*da0073e9SAndroid Build Coastguard Worker#   DEBUG
5*da0073e9SAndroid Build Coastguard Worker#     build with -O0 and -g (debug symbols)
6*da0073e9SAndroid Build Coastguard Worker#
7*da0073e9SAndroid Build Coastguard Worker#   REL_WITH_DEB_INFO
8*da0073e9SAndroid Build Coastguard Worker#     build with optimizations and -g (debug symbols)
9*da0073e9SAndroid Build Coastguard Worker#
10*da0073e9SAndroid Build Coastguard Worker#   USE_CUSTOM_DEBINFO="path/to/file1.cpp;path/to/file2.cpp"
11*da0073e9SAndroid Build Coastguard Worker#     build with debug info only for specified files
12*da0073e9SAndroid Build Coastguard Worker#
13*da0073e9SAndroid Build Coastguard Worker#   MAX_JOBS
14*da0073e9SAndroid Build Coastguard Worker#     maximum number of compile jobs we should use to compile your code
15*da0073e9SAndroid Build Coastguard Worker#
16*da0073e9SAndroid Build Coastguard Worker#   USE_CUDA=0
17*da0073e9SAndroid Build Coastguard Worker#     disables CUDA build
18*da0073e9SAndroid Build Coastguard Worker#
19*da0073e9SAndroid Build Coastguard Worker#   CFLAGS
20*da0073e9SAndroid Build Coastguard Worker#     flags to apply to both C and C++ files to be compiled (a quirk of setup.py
21*da0073e9SAndroid Build Coastguard Worker#     which we have faithfully adhered to in our build system is that CFLAGS
22*da0073e9SAndroid Build Coastguard Worker#     also applies to C++ files (unless CXXFLAGS is set), in contrast to the
23*da0073e9SAndroid Build Coastguard Worker#     default behavior of autogoo and cmake build systems.)
24*da0073e9SAndroid Build Coastguard Worker#
25*da0073e9SAndroid Build Coastguard Worker#   CC
26*da0073e9SAndroid Build Coastguard Worker#     the C/C++ compiler to use
27*da0073e9SAndroid Build Coastguard Worker#
28*da0073e9SAndroid Build Coastguard Worker# Environment variables for feature toggles:
29*da0073e9SAndroid Build Coastguard Worker#
30*da0073e9SAndroid Build Coastguard Worker#   DEBUG_CUDA=1
31*da0073e9SAndroid Build Coastguard Worker#     if used in conjunction with DEBUG or REL_WITH_DEB_INFO, will also
32*da0073e9SAndroid Build Coastguard Worker#     build CUDA kernels with -lineinfo --source-in-ptx.  Note that
33*da0073e9SAndroid Build Coastguard Worker#     on CUDA 12 this may cause nvcc to OOM, so this is disabled by default.
34*da0073e9SAndroid Build Coastguard Worker
35*da0073e9SAndroid Build Coastguard Worker#   USE_CUDNN=0
36*da0073e9SAndroid Build Coastguard Worker#     disables the cuDNN build
37*da0073e9SAndroid Build Coastguard Worker#
38*da0073e9SAndroid Build Coastguard Worker#   USE_CUSPARSELT=0
39*da0073e9SAndroid Build Coastguard Worker#     disables the cuSPARSELt build
40*da0073e9SAndroid Build Coastguard Worker#
41*da0073e9SAndroid Build Coastguard Worker#   USE_CUDSS=0
42*da0073e9SAndroid Build Coastguard Worker#     disables the cuDSS build
43*da0073e9SAndroid Build Coastguard Worker#
44*da0073e9SAndroid Build Coastguard Worker#   USE_CUFILE=0
45*da0073e9SAndroid Build Coastguard Worker#     disables the cuFile build
46*da0073e9SAndroid Build Coastguard Worker#
47*da0073e9SAndroid Build Coastguard Worker#   USE_FBGEMM=0
48*da0073e9SAndroid Build Coastguard Worker#     disables the FBGEMM build
49*da0073e9SAndroid Build Coastguard Worker#
50*da0073e9SAndroid Build Coastguard Worker#   USE_KINETO=0
51*da0073e9SAndroid Build Coastguard Worker#     disables usage of libkineto library for profiling
52*da0073e9SAndroid Build Coastguard Worker#
53*da0073e9SAndroid Build Coastguard Worker#   USE_NUMPY=0
54*da0073e9SAndroid Build Coastguard Worker#     disables the NumPy build
55*da0073e9SAndroid Build Coastguard Worker#
56*da0073e9SAndroid Build Coastguard Worker#   BUILD_TEST=0
57*da0073e9SAndroid Build Coastguard Worker#     disables the test build
58*da0073e9SAndroid Build Coastguard Worker#
59*da0073e9SAndroid Build Coastguard Worker#   USE_MKLDNN=0
60*da0073e9SAndroid Build Coastguard Worker#     disables use of MKLDNN
61*da0073e9SAndroid Build Coastguard Worker#
62*da0073e9SAndroid Build Coastguard Worker#   USE_MKLDNN_ACL
63*da0073e9SAndroid Build Coastguard Worker#     enables use of Compute Library backend for MKLDNN on Arm;
64*da0073e9SAndroid Build Coastguard Worker#     USE_MKLDNN must be explicitly enabled.
65*da0073e9SAndroid Build Coastguard Worker#
66*da0073e9SAndroid Build Coastguard Worker#   MKLDNN_CPU_RUNTIME
67*da0073e9SAndroid Build Coastguard Worker#     MKL-DNN threading mode: TBB or OMP (default)
68*da0073e9SAndroid Build Coastguard Worker#
69*da0073e9SAndroid Build Coastguard Worker#   USE_STATIC_MKL
70*da0073e9SAndroid Build Coastguard Worker#     Prefer to link with MKL statically - Unix only
71*da0073e9SAndroid Build Coastguard Worker#   USE_ITT=0
72*da0073e9SAndroid Build Coastguard Worker#     disable use of Intel(R) VTune Profiler's ITT functionality
73*da0073e9SAndroid Build Coastguard Worker#
74*da0073e9SAndroid Build Coastguard Worker#   USE_NNPACK=0
75*da0073e9SAndroid Build Coastguard Worker#     disables NNPACK build
76*da0073e9SAndroid Build Coastguard Worker#
77*da0073e9SAndroid Build Coastguard Worker#   USE_DISTRIBUTED=0
78*da0073e9SAndroid Build Coastguard Worker#     disables distributed (c10d, gloo, mpi, etc.) build
79*da0073e9SAndroid Build Coastguard Worker#
80*da0073e9SAndroid Build Coastguard Worker#   USE_TENSORPIPE=0
81*da0073e9SAndroid Build Coastguard Worker#     disables distributed Tensorpipe backend build
82*da0073e9SAndroid Build Coastguard Worker#
83*da0073e9SAndroid Build Coastguard Worker#   USE_GLOO=0
84*da0073e9SAndroid Build Coastguard Worker#     disables distributed gloo backend build
85*da0073e9SAndroid Build Coastguard Worker#
86*da0073e9SAndroid Build Coastguard Worker#   USE_MPI=0
87*da0073e9SAndroid Build Coastguard Worker#     disables distributed MPI backend build
88*da0073e9SAndroid Build Coastguard Worker#
89*da0073e9SAndroid Build Coastguard Worker#   USE_SYSTEM_NCCL=0
90*da0073e9SAndroid Build Coastguard Worker#     disables use of system-wide nccl (we will use our submoduled
91*da0073e9SAndroid Build Coastguard Worker#     copy in third_party/nccl)
92*da0073e9SAndroid Build Coastguard Worker#
93*da0073e9SAndroid Build Coastguard Worker#   USE_OPENMP=0
94*da0073e9SAndroid Build Coastguard Worker#     disables use of OpenMP for parallelization
95*da0073e9SAndroid Build Coastguard Worker#
96*da0073e9SAndroid Build Coastguard Worker#   USE_FLASH_ATTENTION=0
97*da0073e9SAndroid Build Coastguard Worker#     disables building flash attention for scaled dot product attention
98*da0073e9SAndroid Build Coastguard Worker#
99*da0073e9SAndroid Build Coastguard Worker#   USE_MEM_EFF_ATTENTION=0
100*da0073e9SAndroid Build Coastguard Worker#    disables building memory efficient attention for scaled dot product attention
101*da0073e9SAndroid Build Coastguard Worker#
102*da0073e9SAndroid Build Coastguard Worker#   BUILD_BINARY
103*da0073e9SAndroid Build Coastguard Worker#     enables the additional binaries/ build
104*da0073e9SAndroid Build Coastguard Worker#
105*da0073e9SAndroid Build Coastguard Worker#   ATEN_AVX512_256=TRUE
106*da0073e9SAndroid Build Coastguard Worker#     ATen AVX2 kernels can use 32 ymm registers, instead of the default 16.
107*da0073e9SAndroid Build Coastguard Worker#     This option can be used if AVX512 doesn't perform well on a machine.
108*da0073e9SAndroid Build Coastguard Worker#     The FBGEMM library also uses AVX512_256 kernels on Xeon D processors,
109*da0073e9SAndroid Build Coastguard Worker#     but it also has some (optimized) assembly code.
110*da0073e9SAndroid Build Coastguard Worker#
111*da0073e9SAndroid Build Coastguard Worker#   PYTORCH_BUILD_VERSION
112*da0073e9SAndroid Build Coastguard Worker#   PYTORCH_BUILD_NUMBER
113*da0073e9SAndroid Build Coastguard Worker#     specify the version of PyTorch, rather than the hard-coded version
114*da0073e9SAndroid Build Coastguard Worker#     in this file; used when we're building binaries for distribution
115*da0073e9SAndroid Build Coastguard Worker#
116*da0073e9SAndroid Build Coastguard Worker#   TORCH_CUDA_ARCH_LIST
117*da0073e9SAndroid Build Coastguard Worker#     specify which CUDA architectures to build for.
118*da0073e9SAndroid Build Coastguard Worker#     ie `TORCH_CUDA_ARCH_LIST="6.0;7.0"`
119*da0073e9SAndroid Build Coastguard Worker#     These are not CUDA versions, instead, they specify what
120*da0073e9SAndroid Build Coastguard Worker#     classes of NVIDIA hardware we should generate PTX for.
121*da0073e9SAndroid Build Coastguard Worker#
122*da0073e9SAndroid Build Coastguard Worker#   PYTORCH_ROCM_ARCH
123*da0073e9SAndroid Build Coastguard Worker#     specify which AMD GPU targets to build for.
124*da0073e9SAndroid Build Coastguard Worker#     ie `PYTORCH_ROCM_ARCH="gfx900;gfx906"`
125*da0073e9SAndroid Build Coastguard Worker#
126*da0073e9SAndroid Build Coastguard Worker#   ONNX_NAMESPACE
127*da0073e9SAndroid Build Coastguard Worker#     specify a namespace for ONNX built here rather than the hard-coded
128*da0073e9SAndroid Build Coastguard Worker#     one in this file; needed to build with other frameworks that share ONNX.
129*da0073e9SAndroid Build Coastguard Worker#
130*da0073e9SAndroid Build Coastguard Worker#   BLAS
131*da0073e9SAndroid Build Coastguard Worker#     BLAS to be used by Caffe2. Can be MKL, Eigen, ATLAS, FlexiBLAS, or OpenBLAS. If set
132*da0073e9SAndroid Build Coastguard Worker#     then the build will fail if the requested BLAS is not found, otherwise
133*da0073e9SAndroid Build Coastguard Worker#     the BLAS will be chosen based on what is found on your system.
134*da0073e9SAndroid Build Coastguard Worker#
135*da0073e9SAndroid Build Coastguard Worker#   MKL_THREADING
136*da0073e9SAndroid Build Coastguard Worker#     MKL threading mode: SEQ, TBB or OMP (default)
137*da0073e9SAndroid Build Coastguard Worker#
138*da0073e9SAndroid Build Coastguard Worker#   USE_ROCM_KERNEL_ASSERT=1
139*da0073e9SAndroid Build Coastguard Worker#     Enable kernel assert in ROCm platform
140*da0073e9SAndroid Build Coastguard Worker#
141*da0073e9SAndroid Build Coastguard Worker# Environment variables we respect (these environment variables are
142*da0073e9SAndroid Build Coastguard Worker# conventional and are often understood/set by other software.)
143*da0073e9SAndroid Build Coastguard Worker#
144*da0073e9SAndroid Build Coastguard Worker#   CUDA_HOME (Linux/OS X)
145*da0073e9SAndroid Build Coastguard Worker#   CUDA_PATH (Windows)
146*da0073e9SAndroid Build Coastguard Worker#     specify where CUDA is installed; usually /usr/local/cuda or
147*da0073e9SAndroid Build Coastguard Worker#     /usr/local/cuda-x.y
148*da0073e9SAndroid Build Coastguard Worker#   CUDAHOSTCXX
149*da0073e9SAndroid Build Coastguard Worker#     specify a different compiler than the system one to use as the CUDA
150*da0073e9SAndroid Build Coastguard Worker#     host compiler for nvcc.
151*da0073e9SAndroid Build Coastguard Worker#
152*da0073e9SAndroid Build Coastguard Worker#   CUDA_NVCC_EXECUTABLE
153*da0073e9SAndroid Build Coastguard Worker#     Specify a NVCC to use. This is used in our CI to point to a cached nvcc
154*da0073e9SAndroid Build Coastguard Worker#
155*da0073e9SAndroid Build Coastguard Worker#   CUDNN_LIB_DIR
156*da0073e9SAndroid Build Coastguard Worker#   CUDNN_INCLUDE_DIR
157*da0073e9SAndroid Build Coastguard Worker#   CUDNN_LIBRARY
158*da0073e9SAndroid Build Coastguard Worker#     specify where cuDNN is installed
159*da0073e9SAndroid Build Coastguard Worker#
160*da0073e9SAndroid Build Coastguard Worker#   MIOPEN_LIB_DIR
161*da0073e9SAndroid Build Coastguard Worker#   MIOPEN_INCLUDE_DIR
162*da0073e9SAndroid Build Coastguard Worker#   MIOPEN_LIBRARY
163*da0073e9SAndroid Build Coastguard Worker#     specify where MIOpen is installed
164*da0073e9SAndroid Build Coastguard Worker#
165*da0073e9SAndroid Build Coastguard Worker#   NCCL_ROOT
166*da0073e9SAndroid Build Coastguard Worker#   NCCL_LIB_DIR
167*da0073e9SAndroid Build Coastguard Worker#   NCCL_INCLUDE_DIR
168*da0073e9SAndroid Build Coastguard Worker#     specify where nccl is installed
169*da0073e9SAndroid Build Coastguard Worker#
170*da0073e9SAndroid Build Coastguard Worker#   ACL_ROOT_DIR
171*da0073e9SAndroid Build Coastguard Worker#     specify where Compute Library is installed
172*da0073e9SAndroid Build Coastguard Worker#
173*da0073e9SAndroid Build Coastguard Worker#   LIBRARY_PATH
174*da0073e9SAndroid Build Coastguard Worker#   LD_LIBRARY_PATH
175*da0073e9SAndroid Build Coastguard Worker#     we will search for libraries in these paths
176*da0073e9SAndroid Build Coastguard Worker#
177*da0073e9SAndroid Build Coastguard Worker#   ATEN_THREADING
178*da0073e9SAndroid Build Coastguard Worker#     ATen parallel backend to use for intra- and inter-op parallelism
179*da0073e9SAndroid Build Coastguard Worker#     possible values:
180*da0073e9SAndroid Build Coastguard Worker#       OMP - use OpenMP for intra-op and native backend for inter-op tasks
181*da0073e9SAndroid Build Coastguard Worker#       NATIVE - use native thread pool for both intra- and inter-op tasks
182*da0073e9SAndroid Build Coastguard Worker#
183*da0073e9SAndroid Build Coastguard Worker#   USE_SYSTEM_LIBS (work in progress)
184*da0073e9SAndroid Build Coastguard Worker#      Use system-provided libraries to satisfy the build dependencies.
185*da0073e9SAndroid Build Coastguard Worker#      When turned on, the following cmake variables will be toggled as well:
186*da0073e9SAndroid Build Coastguard Worker#        USE_SYSTEM_CPUINFO=ON USE_SYSTEM_SLEEF=ON BUILD_CUSTOM_PROTOBUF=OFF
187*da0073e9SAndroid Build Coastguard Worker#
188*da0073e9SAndroid Build Coastguard Worker#   USE_MIMALLOC
189*da0073e9SAndroid Build Coastguard Worker#      Static link mimalloc into C10, and use mimalloc in alloc_cpu & alloc_free.
190*da0073e9SAndroid Build Coastguard Worker#      By default, It is only enabled on Windows.
191*da0073e9SAndroid Build Coastguard Worker#
192*da0073e9SAndroid Build Coastguard Worker#   USE_PRIORITIZED_TEXT_FOR_LD
193*da0073e9SAndroid Build Coastguard Worker#      Uses prioritized text form cmake/prioritized_text.txt for LD
194*da0073e9SAndroid Build Coastguard Worker#
195*da0073e9SAndroid Build Coastguard Worker#   BUILD_LIBTORCH_WHL
196*da0073e9SAndroid Build Coastguard Worker#      Builds libtorch.so and its dependencies as a wheel
197*da0073e9SAndroid Build Coastguard Worker#
198*da0073e9SAndroid Build Coastguard Worker#   BUILD_PYTHON_ONLY
199*da0073e9SAndroid Build Coastguard Worker#      Builds pytorch as a wheel using libtorch.so from a seperate wheel
200*da0073e9SAndroid Build Coastguard Worker
201*da0073e9SAndroid Build Coastguard Workerimport os
202*da0073e9SAndroid Build Coastguard Workerimport sys
203*da0073e9SAndroid Build Coastguard Worker
204*da0073e9SAndroid Build Coastguard Worker
205*da0073e9SAndroid Build Coastguard Workerif sys.platform == "win32" and sys.maxsize.bit_length() == 31:
206*da0073e9SAndroid Build Coastguard Worker    print(
207*da0073e9SAndroid Build Coastguard Worker        "32-bit Windows Python runtime is not supported. Please switch to 64-bit Python."
208*da0073e9SAndroid Build Coastguard Worker    )
209*da0073e9SAndroid Build Coastguard Worker    sys.exit(-1)
210*da0073e9SAndroid Build Coastguard Worker
211*da0073e9SAndroid Build Coastguard Workerimport platform
212*da0073e9SAndroid Build Coastguard Worker
213*da0073e9SAndroid Build Coastguard Worker
214*da0073e9SAndroid Build Coastguard WorkerBUILD_LIBTORCH_WHL = os.getenv("BUILD_LIBTORCH_WHL", "0") == "1"
215*da0073e9SAndroid Build Coastguard WorkerBUILD_PYTHON_ONLY = os.getenv("BUILD_PYTHON_ONLY", "0") == "1"
216*da0073e9SAndroid Build Coastguard Worker
217*da0073e9SAndroid Build Coastguard Workerpython_min_version = (3, 8, 0)
218*da0073e9SAndroid Build Coastguard Workerpython_min_version_str = ".".join(map(str, python_min_version))
219*da0073e9SAndroid Build Coastguard Workerif sys.version_info < python_min_version:
220*da0073e9SAndroid Build Coastguard Worker    print(
221*da0073e9SAndroid Build Coastguard Worker        f"You are using Python {platform.python_version()}. Python >={python_min_version_str} is required."
222*da0073e9SAndroid Build Coastguard Worker    )
223*da0073e9SAndroid Build Coastguard Worker    sys.exit(-1)
224*da0073e9SAndroid Build Coastguard Worker
225*da0073e9SAndroid Build Coastguard Workerimport filecmp
226*da0073e9SAndroid Build Coastguard Workerimport glob
227*da0073e9SAndroid Build Coastguard Workerimport importlib
228*da0073e9SAndroid Build Coastguard Workerimport importlib.util
229*da0073e9SAndroid Build Coastguard Workerimport json
230*da0073e9SAndroid Build Coastguard Workerimport shutil
231*da0073e9SAndroid Build Coastguard Workerimport subprocess
232*da0073e9SAndroid Build Coastguard Workerimport sysconfig
233*da0073e9SAndroid Build Coastguard Workerimport time
234*da0073e9SAndroid Build Coastguard Workerfrom collections import defaultdict
235*da0073e9SAndroid Build Coastguard Worker
236*da0073e9SAndroid Build Coastguard Workerimport setuptools.command.build_ext
237*da0073e9SAndroid Build Coastguard Workerimport setuptools.command.install
238*da0073e9SAndroid Build Coastguard Workerimport setuptools.command.sdist
239*da0073e9SAndroid Build Coastguard Workerfrom setuptools import Extension, find_packages, setup
240*da0073e9SAndroid Build Coastguard Workerfrom setuptools.dist import Distribution
241*da0073e9SAndroid Build Coastguard Workerfrom tools.build_pytorch_libs import build_caffe2
242*da0073e9SAndroid Build Coastguard Workerfrom tools.generate_torch_version import get_torch_version
243*da0073e9SAndroid Build Coastguard Workerfrom tools.setup_helpers.cmake import CMake
244*da0073e9SAndroid Build Coastguard Workerfrom tools.setup_helpers.env import build_type, IS_DARWIN, IS_LINUX, IS_WINDOWS
245*da0073e9SAndroid Build Coastguard Workerfrom tools.setup_helpers.generate_linker_script import gen_linker_script
246*da0073e9SAndroid Build Coastguard Worker
247*da0073e9SAndroid Build Coastguard Worker
248*da0073e9SAndroid Build Coastguard Workerdef _get_package_path(package_name):
249*da0073e9SAndroid Build Coastguard Worker    spec = importlib.util.find_spec(package_name)
250*da0073e9SAndroid Build Coastguard Worker    if spec:
251*da0073e9SAndroid Build Coastguard Worker        # The package might be a namespace package, so get_data may fail
252*da0073e9SAndroid Build Coastguard Worker        try:
253*da0073e9SAndroid Build Coastguard Worker            loader = spec.loader
254*da0073e9SAndroid Build Coastguard Worker            if loader is not None:
255*da0073e9SAndroid Build Coastguard Worker                file_path = loader.get_filename()  # type: ignore[attr-defined]
256*da0073e9SAndroid Build Coastguard Worker                return os.path.dirname(file_path)
257*da0073e9SAndroid Build Coastguard Worker        except AttributeError:
258*da0073e9SAndroid Build Coastguard Worker            pass
259*da0073e9SAndroid Build Coastguard Worker    return None
260*da0073e9SAndroid Build Coastguard Worker
261*da0073e9SAndroid Build Coastguard Worker
262*da0073e9SAndroid Build Coastguard Worker# set up appropriate env variables
263*da0073e9SAndroid Build Coastguard Workerif BUILD_LIBTORCH_WHL:
264*da0073e9SAndroid Build Coastguard Worker    # Set up environment variables for ONLY building libtorch.so and not libtorch_python.so
265*da0073e9SAndroid Build Coastguard Worker    # functorch is not supported without python
266*da0073e9SAndroid Build Coastguard Worker    os.environ["BUILD_FUNCTORCH"] = "OFF"
267*da0073e9SAndroid Build Coastguard Worker
268*da0073e9SAndroid Build Coastguard Worker
269*da0073e9SAndroid Build Coastguard Workerif BUILD_PYTHON_ONLY:
270*da0073e9SAndroid Build Coastguard Worker    os.environ["BUILD_LIBTORCHLESS"] = "ON"
271*da0073e9SAndroid Build Coastguard Worker    os.environ["LIBTORCH_LIB_PATH"] = f"{_get_package_path('torch')}/lib"
272*da0073e9SAndroid Build Coastguard Worker
273*da0073e9SAndroid Build Coastguard Worker################################################################################
274*da0073e9SAndroid Build Coastguard Worker# Parameters parsed from environment
275*da0073e9SAndroid Build Coastguard Worker################################################################################
276*da0073e9SAndroid Build Coastguard Worker
277*da0073e9SAndroid Build Coastguard WorkerVERBOSE_SCRIPT = True
278*da0073e9SAndroid Build Coastguard WorkerRUN_BUILD_DEPS = True
279*da0073e9SAndroid Build Coastguard Worker# see if the user passed a quiet flag to setup.py arguments and respect
280*da0073e9SAndroid Build Coastguard Worker# that in our parts of the build
281*da0073e9SAndroid Build Coastguard WorkerEMIT_BUILD_WARNING = False
282*da0073e9SAndroid Build Coastguard WorkerRERUN_CMAKE = False
283*da0073e9SAndroid Build Coastguard WorkerCMAKE_ONLY = False
284*da0073e9SAndroid Build Coastguard Workerfiltered_args = []
285*da0073e9SAndroid Build Coastguard Workerfor i, arg in enumerate(sys.argv):
286*da0073e9SAndroid Build Coastguard Worker    if arg == "--cmake":
287*da0073e9SAndroid Build Coastguard Worker        RERUN_CMAKE = True
288*da0073e9SAndroid Build Coastguard Worker        continue
289*da0073e9SAndroid Build Coastguard Worker    if arg == "--cmake-only":
290*da0073e9SAndroid Build Coastguard Worker        # Stop once cmake terminates. Leave users a chance to adjust build
291*da0073e9SAndroid Build Coastguard Worker        # options.
292*da0073e9SAndroid Build Coastguard Worker        CMAKE_ONLY = True
293*da0073e9SAndroid Build Coastguard Worker        continue
294*da0073e9SAndroid Build Coastguard Worker    if arg == "rebuild" or arg == "build":
295*da0073e9SAndroid Build Coastguard Worker        arg = "build"  # rebuild is gone, make it build
296*da0073e9SAndroid Build Coastguard Worker        EMIT_BUILD_WARNING = True
297*da0073e9SAndroid Build Coastguard Worker    if arg == "--":
298*da0073e9SAndroid Build Coastguard Worker        filtered_args += sys.argv[i:]
299*da0073e9SAndroid Build Coastguard Worker        break
300*da0073e9SAndroid Build Coastguard Worker    if arg == "-q" or arg == "--quiet":
301*da0073e9SAndroid Build Coastguard Worker        VERBOSE_SCRIPT = False
302*da0073e9SAndroid Build Coastguard Worker    if arg in ["clean", "egg_info", "sdist"]:
303*da0073e9SAndroid Build Coastguard Worker        RUN_BUILD_DEPS = False
304*da0073e9SAndroid Build Coastguard Worker    filtered_args.append(arg)
305*da0073e9SAndroid Build Coastguard Workersys.argv = filtered_args
306*da0073e9SAndroid Build Coastguard Worker
307*da0073e9SAndroid Build Coastguard Workerif VERBOSE_SCRIPT:
308*da0073e9SAndroid Build Coastguard Worker
309*da0073e9SAndroid Build Coastguard Worker    def report(*args):
310*da0073e9SAndroid Build Coastguard Worker        print(*args)
311*da0073e9SAndroid Build Coastguard Worker
312*da0073e9SAndroid Build Coastguard Workerelse:
313*da0073e9SAndroid Build Coastguard Worker
314*da0073e9SAndroid Build Coastguard Worker    def report(*args):
315*da0073e9SAndroid Build Coastguard Worker        pass
316*da0073e9SAndroid Build Coastguard Worker
317*da0073e9SAndroid Build Coastguard Worker    # Make distutils respect --quiet too
318*da0073e9SAndroid Build Coastguard Worker    setuptools.distutils.log.warn = report
319*da0073e9SAndroid Build Coastguard Worker
320*da0073e9SAndroid Build Coastguard Worker# Constant known variables used throughout this file
321*da0073e9SAndroid Build Coastguard Workercwd = os.path.dirname(os.path.abspath(__file__))
322*da0073e9SAndroid Build Coastguard Workerlib_path = os.path.join(cwd, "torch", "lib")
323*da0073e9SAndroid Build Coastguard Workerthird_party_path = os.path.join(cwd, "third_party")
324*da0073e9SAndroid Build Coastguard Workercaffe2_build_dir = os.path.join(cwd, "build")
325*da0073e9SAndroid Build Coastguard Worker
326*da0073e9SAndroid Build Coastguard Worker# CMAKE: full path to python library
327*da0073e9SAndroid Build Coastguard Workerif IS_WINDOWS:
328*da0073e9SAndroid Build Coastguard Worker    cmake_python_library = "{}/libs/python{}.lib".format(
329*da0073e9SAndroid Build Coastguard Worker        sysconfig.get_config_var("prefix"), sysconfig.get_config_var("VERSION")
330*da0073e9SAndroid Build Coastguard Worker    )
331*da0073e9SAndroid Build Coastguard Worker    # Fix virtualenv builds
332*da0073e9SAndroid Build Coastguard Worker    if not os.path.exists(cmake_python_library):
333*da0073e9SAndroid Build Coastguard Worker        cmake_python_library = "{}/libs/python{}.lib".format(
334*da0073e9SAndroid Build Coastguard Worker            sys.base_prefix, sysconfig.get_config_var("VERSION")
335*da0073e9SAndroid Build Coastguard Worker        )
336*da0073e9SAndroid Build Coastguard Workerelse:
337*da0073e9SAndroid Build Coastguard Worker    cmake_python_library = "{}/{}".format(
338*da0073e9SAndroid Build Coastguard Worker        sysconfig.get_config_var("LIBDIR"), sysconfig.get_config_var("INSTSONAME")
339*da0073e9SAndroid Build Coastguard Worker    )
340*da0073e9SAndroid Build Coastguard Workercmake_python_include_dir = sysconfig.get_path("include")
341*da0073e9SAndroid Build Coastguard Worker
342*da0073e9SAndroid Build Coastguard Worker
343*da0073e9SAndroid Build Coastguard Worker################################################################################
344*da0073e9SAndroid Build Coastguard Worker# Version, create_version_file, and package_name
345*da0073e9SAndroid Build Coastguard Worker################################################################################
346*da0073e9SAndroid Build Coastguard Worker
347*da0073e9SAndroid Build Coastguard Workerpackage_name = os.getenv("TORCH_PACKAGE_NAME", "torch")
348*da0073e9SAndroid Build Coastguard WorkerLIBTORCH_PKG_NAME = os.getenv("LIBTORCH_PACKAGE_NAME", "torch_no_python")
349*da0073e9SAndroid Build Coastguard Workerif BUILD_LIBTORCH_WHL:
350*da0073e9SAndroid Build Coastguard Worker    package_name = LIBTORCH_PKG_NAME
351*da0073e9SAndroid Build Coastguard Worker
352*da0073e9SAndroid Build Coastguard Worker
353*da0073e9SAndroid Build Coastguard Workerpackage_type = os.getenv("PACKAGE_TYPE", "wheel")
354*da0073e9SAndroid Build Coastguard Workerversion = get_torch_version()
355*da0073e9SAndroid Build Coastguard Workerreport(f"Building wheel {package_name}-{version}")
356*da0073e9SAndroid Build Coastguard Worker
357*da0073e9SAndroid Build Coastguard Workercmake = CMake()
358*da0073e9SAndroid Build Coastguard Worker
359*da0073e9SAndroid Build Coastguard Worker
360*da0073e9SAndroid Build Coastguard Workerdef get_submodule_folders():
361*da0073e9SAndroid Build Coastguard Worker    git_modules_path = os.path.join(cwd, ".gitmodules")
362*da0073e9SAndroid Build Coastguard Worker    default_modules_path = [
363*da0073e9SAndroid Build Coastguard Worker        os.path.join(third_party_path, name)
364*da0073e9SAndroid Build Coastguard Worker        for name in [
365*da0073e9SAndroid Build Coastguard Worker            "gloo",
366*da0073e9SAndroid Build Coastguard Worker            "cpuinfo",
367*da0073e9SAndroid Build Coastguard Worker            "onnx",
368*da0073e9SAndroid Build Coastguard Worker            "fbgemm",
369*da0073e9SAndroid Build Coastguard Worker            "cutlass",
370*da0073e9SAndroid Build Coastguard Worker        ]
371*da0073e9SAndroid Build Coastguard Worker    ]
372*da0073e9SAndroid Build Coastguard Worker    if not os.path.exists(git_modules_path):
373*da0073e9SAndroid Build Coastguard Worker        return default_modules_path
374*da0073e9SAndroid Build Coastguard Worker    with open(git_modules_path) as f:
375*da0073e9SAndroid Build Coastguard Worker        return [
376*da0073e9SAndroid Build Coastguard Worker            os.path.join(cwd, line.split("=", 1)[1].strip())
377*da0073e9SAndroid Build Coastguard Worker            for line in f
378*da0073e9SAndroid Build Coastguard Worker            if line.strip().startswith("path")
379*da0073e9SAndroid Build Coastguard Worker        ]
380*da0073e9SAndroid Build Coastguard Worker
381*da0073e9SAndroid Build Coastguard Worker
382*da0073e9SAndroid Build Coastguard Workerdef check_submodules():
383*da0073e9SAndroid Build Coastguard Worker    def check_for_files(folder, files):
384*da0073e9SAndroid Build Coastguard Worker        if not any(os.path.exists(os.path.join(folder, f)) for f in files):
385*da0073e9SAndroid Build Coastguard Worker            report("Could not find any of {} in {}".format(", ".join(files), folder))
386*da0073e9SAndroid Build Coastguard Worker            report("Did you run 'git submodule update --init --recursive'?")
387*da0073e9SAndroid Build Coastguard Worker            sys.exit(1)
388*da0073e9SAndroid Build Coastguard Worker
389*da0073e9SAndroid Build Coastguard Worker    def not_exists_or_empty(folder):
390*da0073e9SAndroid Build Coastguard Worker        return not os.path.exists(folder) or (
391*da0073e9SAndroid Build Coastguard Worker            os.path.isdir(folder) and len(os.listdir(folder)) == 0
392*da0073e9SAndroid Build Coastguard Worker        )
393*da0073e9SAndroid Build Coastguard Worker
394*da0073e9SAndroid Build Coastguard Worker    if bool(os.getenv("USE_SYSTEM_LIBS", False)):
395*da0073e9SAndroid Build Coastguard Worker        return
396*da0073e9SAndroid Build Coastguard Worker    folders = get_submodule_folders()
397*da0073e9SAndroid Build Coastguard Worker    # If none of the submodule folders exists, try to initialize them
398*da0073e9SAndroid Build Coastguard Worker    if all(not_exists_or_empty(folder) for folder in folders):
399*da0073e9SAndroid Build Coastguard Worker        try:
400*da0073e9SAndroid Build Coastguard Worker            print(" --- Trying to initialize submodules")
401*da0073e9SAndroid Build Coastguard Worker            start = time.time()
402*da0073e9SAndroid Build Coastguard Worker            subprocess.check_call(
403*da0073e9SAndroid Build Coastguard Worker                ["git", "submodule", "update", "--init", "--recursive"], cwd=cwd
404*da0073e9SAndroid Build Coastguard Worker            )
405*da0073e9SAndroid Build Coastguard Worker            end = time.time()
406*da0073e9SAndroid Build Coastguard Worker            print(f" --- Submodule initialization took {end - start:.2f} sec")
407*da0073e9SAndroid Build Coastguard Worker        except Exception:
408*da0073e9SAndroid Build Coastguard Worker            print(" --- Submodule initalization failed")
409*da0073e9SAndroid Build Coastguard Worker            print("Please run:\n\tgit submodule update --init --recursive")
410*da0073e9SAndroid Build Coastguard Worker            sys.exit(1)
411*da0073e9SAndroid Build Coastguard Worker    for folder in folders:
412*da0073e9SAndroid Build Coastguard Worker        check_for_files(
413*da0073e9SAndroid Build Coastguard Worker            folder,
414*da0073e9SAndroid Build Coastguard Worker            [
415*da0073e9SAndroid Build Coastguard Worker                "CMakeLists.txt",
416*da0073e9SAndroid Build Coastguard Worker                "Makefile",
417*da0073e9SAndroid Build Coastguard Worker                "setup.py",
418*da0073e9SAndroid Build Coastguard Worker                "LICENSE",
419*da0073e9SAndroid Build Coastguard Worker                "LICENSE.md",
420*da0073e9SAndroid Build Coastguard Worker                "LICENSE.txt",
421*da0073e9SAndroid Build Coastguard Worker            ],
422*da0073e9SAndroid Build Coastguard Worker        )
423*da0073e9SAndroid Build Coastguard Worker    check_for_files(
424*da0073e9SAndroid Build Coastguard Worker        os.path.join(third_party_path, "fbgemm", "third_party", "asmjit"),
425*da0073e9SAndroid Build Coastguard Worker        ["CMakeLists.txt"],
426*da0073e9SAndroid Build Coastguard Worker    )
427*da0073e9SAndroid Build Coastguard Worker    check_for_files(
428*da0073e9SAndroid Build Coastguard Worker        os.path.join(third_party_path, "onnx", "third_party", "benchmark"),
429*da0073e9SAndroid Build Coastguard Worker        ["CMakeLists.txt"],
430*da0073e9SAndroid Build Coastguard Worker    )
431*da0073e9SAndroid Build Coastguard Worker
432*da0073e9SAndroid Build Coastguard Worker
433*da0073e9SAndroid Build Coastguard Worker# Windows has very bad support for symbolic links.
434*da0073e9SAndroid Build Coastguard Worker# Instead of using symlinks, we're going to copy files over
435*da0073e9SAndroid Build Coastguard Workerdef mirror_files_into_torchgen():
436*da0073e9SAndroid Build Coastguard Worker    # (new_path, orig_path)
437*da0073e9SAndroid Build Coastguard Worker    # Directories are OK and are recursively mirrored.
438*da0073e9SAndroid Build Coastguard Worker    paths = [
439*da0073e9SAndroid Build Coastguard Worker        (
440*da0073e9SAndroid Build Coastguard Worker            "torchgen/packaged/ATen/native/native_functions.yaml",
441*da0073e9SAndroid Build Coastguard Worker            "aten/src/ATen/native/native_functions.yaml",
442*da0073e9SAndroid Build Coastguard Worker        ),
443*da0073e9SAndroid Build Coastguard Worker        ("torchgen/packaged/ATen/native/tags.yaml", "aten/src/ATen/native/tags.yaml"),
444*da0073e9SAndroid Build Coastguard Worker        ("torchgen/packaged/ATen/templates", "aten/src/ATen/templates"),
445*da0073e9SAndroid Build Coastguard Worker        ("torchgen/packaged/autograd", "tools/autograd"),
446*da0073e9SAndroid Build Coastguard Worker        ("torchgen/packaged/autograd/templates", "tools/autograd/templates"),
447*da0073e9SAndroid Build Coastguard Worker    ]
448*da0073e9SAndroid Build Coastguard Worker    for new_path, orig_path in paths:
449*da0073e9SAndroid Build Coastguard Worker        # Create the dirs involved in new_path if they don't exist
450*da0073e9SAndroid Build Coastguard Worker        if not os.path.exists(new_path):
451*da0073e9SAndroid Build Coastguard Worker            os.makedirs(os.path.dirname(new_path), exist_ok=True)
452*da0073e9SAndroid Build Coastguard Worker
453*da0073e9SAndroid Build Coastguard Worker        # Copy the files from the orig location to the new location
454*da0073e9SAndroid Build Coastguard Worker        if os.path.isfile(orig_path):
455*da0073e9SAndroid Build Coastguard Worker            shutil.copyfile(orig_path, new_path)
456*da0073e9SAndroid Build Coastguard Worker            continue
457*da0073e9SAndroid Build Coastguard Worker        if os.path.isdir(orig_path):
458*da0073e9SAndroid Build Coastguard Worker            if os.path.exists(new_path):
459*da0073e9SAndroid Build Coastguard Worker                # copytree fails if the tree exists already, so remove it.
460*da0073e9SAndroid Build Coastguard Worker                shutil.rmtree(new_path)
461*da0073e9SAndroid Build Coastguard Worker            shutil.copytree(orig_path, new_path)
462*da0073e9SAndroid Build Coastguard Worker            continue
463*da0073e9SAndroid Build Coastguard Worker        raise RuntimeError("Check the file paths in `mirror_files_into_torchgen()`")
464*da0073e9SAndroid Build Coastguard Worker
465*da0073e9SAndroid Build Coastguard Worker
466*da0073e9SAndroid Build Coastguard Worker# all the work we need to do _before_ setup runs
467*da0073e9SAndroid Build Coastguard Workerdef build_deps():
468*da0073e9SAndroid Build Coastguard Worker    report("-- Building version " + version)
469*da0073e9SAndroid Build Coastguard Worker
470*da0073e9SAndroid Build Coastguard Worker    check_submodules()
471*da0073e9SAndroid Build Coastguard Worker    check_pydep("yaml", "pyyaml")
472*da0073e9SAndroid Build Coastguard Worker    build_python = not BUILD_LIBTORCH_WHL
473*da0073e9SAndroid Build Coastguard Worker    build_caffe2(
474*da0073e9SAndroid Build Coastguard Worker        version=version,
475*da0073e9SAndroid Build Coastguard Worker        cmake_python_library=cmake_python_library,
476*da0073e9SAndroid Build Coastguard Worker        build_python=build_python,
477*da0073e9SAndroid Build Coastguard Worker        rerun_cmake=RERUN_CMAKE,
478*da0073e9SAndroid Build Coastguard Worker        cmake_only=CMAKE_ONLY,
479*da0073e9SAndroid Build Coastguard Worker        cmake=cmake,
480*da0073e9SAndroid Build Coastguard Worker    )
481*da0073e9SAndroid Build Coastguard Worker
482*da0073e9SAndroid Build Coastguard Worker    if CMAKE_ONLY:
483*da0073e9SAndroid Build Coastguard Worker        report(
484*da0073e9SAndroid Build Coastguard Worker            'Finished running cmake. Run "ccmake build" or '
485*da0073e9SAndroid Build Coastguard Worker            '"cmake-gui build" to adjust build options and '
486*da0073e9SAndroid Build Coastguard Worker            '"python setup.py install" to build.'
487*da0073e9SAndroid Build Coastguard Worker        )
488*da0073e9SAndroid Build Coastguard Worker        sys.exit()
489*da0073e9SAndroid Build Coastguard Worker
490*da0073e9SAndroid Build Coastguard Worker    # Use copies instead of symbolic files.
491*da0073e9SAndroid Build Coastguard Worker    # Windows has very poor support for them.
492*da0073e9SAndroid Build Coastguard Worker    sym_files = [
493*da0073e9SAndroid Build Coastguard Worker        "tools/shared/_utils_internal.py",
494*da0073e9SAndroid Build Coastguard Worker        "torch/utils/benchmark/utils/valgrind_wrapper/callgrind.h",
495*da0073e9SAndroid Build Coastguard Worker        "torch/utils/benchmark/utils/valgrind_wrapper/valgrind.h",
496*da0073e9SAndroid Build Coastguard Worker    ]
497*da0073e9SAndroid Build Coastguard Worker    orig_files = [
498*da0073e9SAndroid Build Coastguard Worker        "torch/_utils_internal.py",
499*da0073e9SAndroid Build Coastguard Worker        "third_party/valgrind-headers/callgrind.h",
500*da0073e9SAndroid Build Coastguard Worker        "third_party/valgrind-headers/valgrind.h",
501*da0073e9SAndroid Build Coastguard Worker    ]
502*da0073e9SAndroid Build Coastguard Worker    for sym_file, orig_file in zip(sym_files, orig_files):
503*da0073e9SAndroid Build Coastguard Worker        same = False
504*da0073e9SAndroid Build Coastguard Worker        if os.path.exists(sym_file):
505*da0073e9SAndroid Build Coastguard Worker            if filecmp.cmp(sym_file, orig_file):
506*da0073e9SAndroid Build Coastguard Worker                same = True
507*da0073e9SAndroid Build Coastguard Worker            else:
508*da0073e9SAndroid Build Coastguard Worker                os.remove(sym_file)
509*da0073e9SAndroid Build Coastguard Worker        if not same:
510*da0073e9SAndroid Build Coastguard Worker            shutil.copyfile(orig_file, sym_file)
511*da0073e9SAndroid Build Coastguard Worker
512*da0073e9SAndroid Build Coastguard Worker
513*da0073e9SAndroid Build Coastguard Worker################################################################################
514*da0073e9SAndroid Build Coastguard Worker# Building dependent libraries
515*da0073e9SAndroid Build Coastguard Worker################################################################################
516*da0073e9SAndroid Build Coastguard Worker
517*da0073e9SAndroid Build Coastguard Workermissing_pydep = """
518*da0073e9SAndroid Build Coastguard WorkerMissing build dependency: Unable to `import {importname}`.
519*da0073e9SAndroid Build Coastguard WorkerPlease install it via `conda install {module}` or `pip install {module}`
520*da0073e9SAndroid Build Coastguard Worker""".strip()
521*da0073e9SAndroid Build Coastguard Worker
522*da0073e9SAndroid Build Coastguard Worker
523*da0073e9SAndroid Build Coastguard Workerdef check_pydep(importname, module):
524*da0073e9SAndroid Build Coastguard Worker    try:
525*da0073e9SAndroid Build Coastguard Worker        importlib.import_module(importname)
526*da0073e9SAndroid Build Coastguard Worker    except ImportError as e:
527*da0073e9SAndroid Build Coastguard Worker        raise RuntimeError(
528*da0073e9SAndroid Build Coastguard Worker            missing_pydep.format(importname=importname, module=module)
529*da0073e9SAndroid Build Coastguard Worker        ) from e
530*da0073e9SAndroid Build Coastguard Worker
531*da0073e9SAndroid Build Coastguard Worker
532*da0073e9SAndroid Build Coastguard Workerclass build_ext(setuptools.command.build_ext.build_ext):
533*da0073e9SAndroid Build Coastguard Worker    def _embed_libomp(self):
534*da0073e9SAndroid Build Coastguard Worker        # Copy libiomp5.dylib/libomp.dylib inside the wheel package on MacOS
535*da0073e9SAndroid Build Coastguard Worker        lib_dir = os.path.join(self.build_lib, "torch", "lib")
536*da0073e9SAndroid Build Coastguard Worker        libtorch_cpu_path = os.path.join(lib_dir, "libtorch_cpu.dylib")
537*da0073e9SAndroid Build Coastguard Worker        if not os.path.exists(libtorch_cpu_path):
538*da0073e9SAndroid Build Coastguard Worker            return
539*da0073e9SAndroid Build Coastguard Worker        # Parse libtorch_cpu load commands
540*da0073e9SAndroid Build Coastguard Worker        otool_cmds = (
541*da0073e9SAndroid Build Coastguard Worker            subprocess.check_output(["otool", "-l", libtorch_cpu_path])
542*da0073e9SAndroid Build Coastguard Worker            .decode("utf-8")
543*da0073e9SAndroid Build Coastguard Worker            .split("\n")
544*da0073e9SAndroid Build Coastguard Worker        )
545*da0073e9SAndroid Build Coastguard Worker        rpaths, libs = [], []
546*da0073e9SAndroid Build Coastguard Worker        for idx, line in enumerate(otool_cmds):
547*da0073e9SAndroid Build Coastguard Worker            if line.strip() == "cmd LC_LOAD_DYLIB":
548*da0073e9SAndroid Build Coastguard Worker                lib_name = otool_cmds[idx + 2].strip()
549*da0073e9SAndroid Build Coastguard Worker                assert lib_name.startswith("name ")
550*da0073e9SAndroid Build Coastguard Worker                libs.append(lib_name.split(" ", 1)[1].rsplit("(", 1)[0][:-1])
551*da0073e9SAndroid Build Coastguard Worker
552*da0073e9SAndroid Build Coastguard Worker            if line.strip() == "cmd LC_RPATH":
553*da0073e9SAndroid Build Coastguard Worker                rpath = otool_cmds[idx + 2].strip()
554*da0073e9SAndroid Build Coastguard Worker                assert rpath.startswith("path ")
555*da0073e9SAndroid Build Coastguard Worker                rpaths.append(rpath.split(" ", 1)[1].rsplit("(", 1)[0][:-1])
556*da0073e9SAndroid Build Coastguard Worker
557*da0073e9SAndroid Build Coastguard Worker        omp_lib_name = (
558*da0073e9SAndroid Build Coastguard Worker            "libomp.dylib" if os.uname().machine == "arm64" else "libiomp5.dylib"
559*da0073e9SAndroid Build Coastguard Worker        )
560*da0073e9SAndroid Build Coastguard Worker        omp_rpath_lib_path = os.path.join("@rpath", omp_lib_name)
561*da0073e9SAndroid Build Coastguard Worker        if omp_rpath_lib_path not in libs:
562*da0073e9SAndroid Build Coastguard Worker            return
563*da0073e9SAndroid Build Coastguard Worker
564*da0073e9SAndroid Build Coastguard Worker        # Copy libomp/libiomp5 from rpath locations
565*da0073e9SAndroid Build Coastguard Worker        for rpath in rpaths:
566*da0073e9SAndroid Build Coastguard Worker            source_lib = os.path.join(rpath, omp_lib_name)
567*da0073e9SAndroid Build Coastguard Worker            if not os.path.exists(source_lib):
568*da0073e9SAndroid Build Coastguard Worker                continue
569*da0073e9SAndroid Build Coastguard Worker            target_lib = os.path.join(self.build_lib, "torch", "lib", omp_lib_name)
570*da0073e9SAndroid Build Coastguard Worker            self.copy_file(source_lib, target_lib)
571*da0073e9SAndroid Build Coastguard Worker            # Delete old rpath and add @loader_lib to the rpath
572*da0073e9SAndroid Build Coastguard Worker            # This should prevent delocate from attempting to package another instance
573*da0073e9SAndroid Build Coastguard Worker            # of OpenMP library in torch wheel as well as loading two libomp.dylib into
574*da0073e9SAndroid Build Coastguard Worker            # the address space, as libraries are cached by their unresolved names
575*da0073e9SAndroid Build Coastguard Worker            subprocess.check_call(
576*da0073e9SAndroid Build Coastguard Worker                [
577*da0073e9SAndroid Build Coastguard Worker                    "install_name_tool",
578*da0073e9SAndroid Build Coastguard Worker                    "-rpath",
579*da0073e9SAndroid Build Coastguard Worker                    rpath,
580*da0073e9SAndroid Build Coastguard Worker                    "@loader_path",
581*da0073e9SAndroid Build Coastguard Worker                    libtorch_cpu_path,
582*da0073e9SAndroid Build Coastguard Worker                ]
583*da0073e9SAndroid Build Coastguard Worker            )
584*da0073e9SAndroid Build Coastguard Worker            break
585*da0073e9SAndroid Build Coastguard Worker
586*da0073e9SAndroid Build Coastguard Worker        # Copy omp.h from OpenMP_C_FLAGS and copy it into include folder
587*da0073e9SAndroid Build Coastguard Worker        omp_cflags = get_cmake_cache_vars()["OpenMP_C_FLAGS"]
588*da0073e9SAndroid Build Coastguard Worker        if not omp_cflags:
589*da0073e9SAndroid Build Coastguard Worker            return
590*da0073e9SAndroid Build Coastguard Worker        for include_dir in [f[2:] for f in omp_cflags.split(" ") if f.startswith("-I")]:
591*da0073e9SAndroid Build Coastguard Worker            omp_h = os.path.join(include_dir, "omp.h")
592*da0073e9SAndroid Build Coastguard Worker            if not os.path.exists(omp_h):
593*da0073e9SAndroid Build Coastguard Worker                continue
594*da0073e9SAndroid Build Coastguard Worker            target_omp_h = os.path.join(self.build_lib, "torch", "include", "omp.h")
595*da0073e9SAndroid Build Coastguard Worker            self.copy_file(omp_h, target_omp_h)
596*da0073e9SAndroid Build Coastguard Worker            break
597*da0073e9SAndroid Build Coastguard Worker
598*da0073e9SAndroid Build Coastguard Worker    def run(self):
599*da0073e9SAndroid Build Coastguard Worker        # Report build options. This is run after the build completes so # `CMakeCache.txt` exists and we can get an
600*da0073e9SAndroid Build Coastguard Worker        # accurate report on what is used and what is not.
601*da0073e9SAndroid Build Coastguard Worker        cmake_cache_vars = defaultdict(lambda: False, cmake.get_cmake_cache_variables())
602*da0073e9SAndroid Build Coastguard Worker        if cmake_cache_vars["USE_NUMPY"]:
603*da0073e9SAndroid Build Coastguard Worker            report("-- Building with NumPy bindings")
604*da0073e9SAndroid Build Coastguard Worker        else:
605*da0073e9SAndroid Build Coastguard Worker            report("-- NumPy not found")
606*da0073e9SAndroid Build Coastguard Worker        if cmake_cache_vars["USE_CUDNN"]:
607*da0073e9SAndroid Build Coastguard Worker            report(
608*da0073e9SAndroid Build Coastguard Worker                "-- Detected cuDNN at "
609*da0073e9SAndroid Build Coastguard Worker                + cmake_cache_vars["CUDNN_LIBRARY"]
610*da0073e9SAndroid Build Coastguard Worker                + ", "
611*da0073e9SAndroid Build Coastguard Worker                + cmake_cache_vars["CUDNN_INCLUDE_DIR"]
612*da0073e9SAndroid Build Coastguard Worker            )
613*da0073e9SAndroid Build Coastguard Worker        else:
614*da0073e9SAndroid Build Coastguard Worker            report("-- Not using cuDNN")
615*da0073e9SAndroid Build Coastguard Worker        if cmake_cache_vars["USE_CUDA"]:
616*da0073e9SAndroid Build Coastguard Worker            report("-- Detected CUDA at " + cmake_cache_vars["CUDA_TOOLKIT_ROOT_DIR"])
617*da0073e9SAndroid Build Coastguard Worker        else:
618*da0073e9SAndroid Build Coastguard Worker            report("-- Not using CUDA")
619*da0073e9SAndroid Build Coastguard Worker        if cmake_cache_vars["USE_XPU"]:
620*da0073e9SAndroid Build Coastguard Worker            report("-- Detected XPU runtime at " + cmake_cache_vars["SYCL_LIBRARY_DIR"])
621*da0073e9SAndroid Build Coastguard Worker        else:
622*da0073e9SAndroid Build Coastguard Worker            report("-- Not using XPU")
623*da0073e9SAndroid Build Coastguard Worker        if cmake_cache_vars["USE_MKLDNN"]:
624*da0073e9SAndroid Build Coastguard Worker            report("-- Using MKLDNN")
625*da0073e9SAndroid Build Coastguard Worker            if cmake_cache_vars["USE_MKLDNN_ACL"]:
626*da0073e9SAndroid Build Coastguard Worker                report("-- Using Compute Library for the Arm architecture with MKLDNN")
627*da0073e9SAndroid Build Coastguard Worker            else:
628*da0073e9SAndroid Build Coastguard Worker                report(
629*da0073e9SAndroid Build Coastguard Worker                    "-- Not using Compute Library for the Arm architecture with MKLDNN"
630*da0073e9SAndroid Build Coastguard Worker                )
631*da0073e9SAndroid Build Coastguard Worker            if cmake_cache_vars["USE_MKLDNN_CBLAS"]:
632*da0073e9SAndroid Build Coastguard Worker                report("-- Using CBLAS in MKLDNN")
633*da0073e9SAndroid Build Coastguard Worker            else:
634*da0073e9SAndroid Build Coastguard Worker                report("-- Not using CBLAS in MKLDNN")
635*da0073e9SAndroid Build Coastguard Worker        else:
636*da0073e9SAndroid Build Coastguard Worker            report("-- Not using MKLDNN")
637*da0073e9SAndroid Build Coastguard Worker        if cmake_cache_vars["USE_NCCL"] and cmake_cache_vars["USE_SYSTEM_NCCL"]:
638*da0073e9SAndroid Build Coastguard Worker            report(
639*da0073e9SAndroid Build Coastguard Worker                "-- Using system provided NCCL library at {}, {}".format(
640*da0073e9SAndroid Build Coastguard Worker                    cmake_cache_vars["NCCL_LIBRARIES"],
641*da0073e9SAndroid Build Coastguard Worker                    cmake_cache_vars["NCCL_INCLUDE_DIRS"],
642*da0073e9SAndroid Build Coastguard Worker                )
643*da0073e9SAndroid Build Coastguard Worker            )
644*da0073e9SAndroid Build Coastguard Worker        elif cmake_cache_vars["USE_NCCL"]:
645*da0073e9SAndroid Build Coastguard Worker            report("-- Building NCCL library")
646*da0073e9SAndroid Build Coastguard Worker        else:
647*da0073e9SAndroid Build Coastguard Worker            report("-- Not using NCCL")
648*da0073e9SAndroid Build Coastguard Worker        if cmake_cache_vars["USE_DISTRIBUTED"]:
649*da0073e9SAndroid Build Coastguard Worker            if IS_WINDOWS:
650*da0073e9SAndroid Build Coastguard Worker                report("-- Building without distributed package")
651*da0073e9SAndroid Build Coastguard Worker            else:
652*da0073e9SAndroid Build Coastguard Worker                report("-- Building with distributed package: ")
653*da0073e9SAndroid Build Coastguard Worker                report(
654*da0073e9SAndroid Build Coastguard Worker                    "  -- USE_TENSORPIPE={}".format(cmake_cache_vars["USE_TENSORPIPE"])
655*da0073e9SAndroid Build Coastguard Worker                )
656*da0073e9SAndroid Build Coastguard Worker                report("  -- USE_GLOO={}".format(cmake_cache_vars["USE_GLOO"]))
657*da0073e9SAndroid Build Coastguard Worker                report("  -- USE_MPI={}".format(cmake_cache_vars["USE_OPENMPI"]))
658*da0073e9SAndroid Build Coastguard Worker        else:
659*da0073e9SAndroid Build Coastguard Worker            report("-- Building without distributed package")
660*da0073e9SAndroid Build Coastguard Worker        if cmake_cache_vars["STATIC_DISPATCH_BACKEND"]:
661*da0073e9SAndroid Build Coastguard Worker            report(
662*da0073e9SAndroid Build Coastguard Worker                "-- Using static dispatch with backend {}".format(
663*da0073e9SAndroid Build Coastguard Worker                    cmake_cache_vars["STATIC_DISPATCH_BACKEND"]
664*da0073e9SAndroid Build Coastguard Worker                )
665*da0073e9SAndroid Build Coastguard Worker            )
666*da0073e9SAndroid Build Coastguard Worker        if cmake_cache_vars["USE_LIGHTWEIGHT_DISPATCH"]:
667*da0073e9SAndroid Build Coastguard Worker            report("-- Using lightweight dispatch")
668*da0073e9SAndroid Build Coastguard Worker        if cmake_cache_vars["BUILD_EXECUTORCH"]:
669*da0073e9SAndroid Build Coastguard Worker            report("-- Building Executorch")
670*da0073e9SAndroid Build Coastguard Worker
671*da0073e9SAndroid Build Coastguard Worker        if cmake_cache_vars["USE_ITT"]:
672*da0073e9SAndroid Build Coastguard Worker            report("-- Using ITT")
673*da0073e9SAndroid Build Coastguard Worker        else:
674*da0073e9SAndroid Build Coastguard Worker            report("-- Not using ITT")
675*da0073e9SAndroid Build Coastguard Worker
676*da0073e9SAndroid Build Coastguard Worker        # Do not use clang to compile extensions if `-fstack-clash-protection` is defined
677*da0073e9SAndroid Build Coastguard Worker        # in system CFLAGS
678*da0073e9SAndroid Build Coastguard Worker        c_flags = str(os.getenv("CFLAGS", ""))
679*da0073e9SAndroid Build Coastguard Worker        if (
680*da0073e9SAndroid Build Coastguard Worker            IS_LINUX
681*da0073e9SAndroid Build Coastguard Worker            and "-fstack-clash-protection" in c_flags
682*da0073e9SAndroid Build Coastguard Worker            and "clang" in os.environ.get("CC", "")
683*da0073e9SAndroid Build Coastguard Worker        ):
684*da0073e9SAndroid Build Coastguard Worker            os.environ["CC"] = str(os.environ["CC"])
685*da0073e9SAndroid Build Coastguard Worker
686*da0073e9SAndroid Build Coastguard Worker        # It's an old-style class in Python 2.7...
687*da0073e9SAndroid Build Coastguard Worker        setuptools.command.build_ext.build_ext.run(self)
688*da0073e9SAndroid Build Coastguard Worker
689*da0073e9SAndroid Build Coastguard Worker        if IS_DARWIN and package_type != "conda":
690*da0073e9SAndroid Build Coastguard Worker            self._embed_libomp()
691*da0073e9SAndroid Build Coastguard Worker
692*da0073e9SAndroid Build Coastguard Worker        # Copy the essential export library to compile C++ extensions.
693*da0073e9SAndroid Build Coastguard Worker        if IS_WINDOWS:
694*da0073e9SAndroid Build Coastguard Worker            build_temp = self.build_temp
695*da0073e9SAndroid Build Coastguard Worker
696*da0073e9SAndroid Build Coastguard Worker            ext_filename = self.get_ext_filename("_C")
697*da0073e9SAndroid Build Coastguard Worker            lib_filename = ".".join(ext_filename.split(".")[:-1]) + ".lib"
698*da0073e9SAndroid Build Coastguard Worker
699*da0073e9SAndroid Build Coastguard Worker            export_lib = os.path.join(
700*da0073e9SAndroid Build Coastguard Worker                build_temp, "torch", "csrc", lib_filename
701*da0073e9SAndroid Build Coastguard Worker            ).replace("\\", "/")
702*da0073e9SAndroid Build Coastguard Worker
703*da0073e9SAndroid Build Coastguard Worker            build_lib = self.build_lib
704*da0073e9SAndroid Build Coastguard Worker
705*da0073e9SAndroid Build Coastguard Worker            target_lib = os.path.join(build_lib, "torch", "lib", "_C.lib").replace(
706*da0073e9SAndroid Build Coastguard Worker                "\\", "/"
707*da0073e9SAndroid Build Coastguard Worker            )
708*da0073e9SAndroid Build Coastguard Worker
709*da0073e9SAndroid Build Coastguard Worker            # Create "torch/lib" directory if not exists.
710*da0073e9SAndroid Build Coastguard Worker            # (It is not created yet in "develop" mode.)
711*da0073e9SAndroid Build Coastguard Worker            target_dir = os.path.dirname(target_lib)
712*da0073e9SAndroid Build Coastguard Worker            if not os.path.exists(target_dir):
713*da0073e9SAndroid Build Coastguard Worker                os.makedirs(target_dir)
714*da0073e9SAndroid Build Coastguard Worker
715*da0073e9SAndroid Build Coastguard Worker            self.copy_file(export_lib, target_lib)
716*da0073e9SAndroid Build Coastguard Worker
717*da0073e9SAndroid Build Coastguard Worker    def build_extensions(self):
718*da0073e9SAndroid Build Coastguard Worker        self.create_compile_commands()
719*da0073e9SAndroid Build Coastguard Worker        # The caffe2 extensions are created in
720*da0073e9SAndroid Build Coastguard Worker        # tmp_install/lib/pythonM.m/site-packages/caffe2/python/
721*da0073e9SAndroid Build Coastguard Worker        # and need to be copied to build/lib.linux.... , which will be a
722*da0073e9SAndroid Build Coastguard Worker        # platform dependent build folder created by the "build" command of
723*da0073e9SAndroid Build Coastguard Worker        # setuptools. Only the contents of this folder are installed in the
724*da0073e9SAndroid Build Coastguard Worker        # "install" command by default.
725*da0073e9SAndroid Build Coastguard Worker        # We only make this copy for Caffe2's pybind extensions
726*da0073e9SAndroid Build Coastguard Worker        caffe2_pybind_exts = [
727*da0073e9SAndroid Build Coastguard Worker            "caffe2.python.caffe2_pybind11_state",
728*da0073e9SAndroid Build Coastguard Worker            "caffe2.python.caffe2_pybind11_state_gpu",
729*da0073e9SAndroid Build Coastguard Worker            "caffe2.python.caffe2_pybind11_state_hip",
730*da0073e9SAndroid Build Coastguard Worker        ]
731*da0073e9SAndroid Build Coastguard Worker        if BUILD_LIBTORCH_WHL:
732*da0073e9SAndroid Build Coastguard Worker            caffe2_pybind_exts = []
733*da0073e9SAndroid Build Coastguard Worker        i = 0
734*da0073e9SAndroid Build Coastguard Worker        while i < len(self.extensions):
735*da0073e9SAndroid Build Coastguard Worker            ext = self.extensions[i]
736*da0073e9SAndroid Build Coastguard Worker            if ext.name not in caffe2_pybind_exts:
737*da0073e9SAndroid Build Coastguard Worker                i += 1
738*da0073e9SAndroid Build Coastguard Worker                continue
739*da0073e9SAndroid Build Coastguard Worker            fullname = self.get_ext_fullname(ext.name)
740*da0073e9SAndroid Build Coastguard Worker            filename = self.get_ext_filename(fullname)
741*da0073e9SAndroid Build Coastguard Worker            report(f"\nCopying extension {ext.name}")
742*da0073e9SAndroid Build Coastguard Worker
743*da0073e9SAndroid Build Coastguard Worker            relative_site_packages = (
744*da0073e9SAndroid Build Coastguard Worker                sysconfig.get_path("purelib")
745*da0073e9SAndroid Build Coastguard Worker                .replace(sysconfig.get_path("data"), "")
746*da0073e9SAndroid Build Coastguard Worker                .lstrip(os.path.sep)
747*da0073e9SAndroid Build Coastguard Worker            )
748*da0073e9SAndroid Build Coastguard Worker            src = os.path.join("torch", relative_site_packages, filename)
749*da0073e9SAndroid Build Coastguard Worker            if not os.path.exists(src):
750*da0073e9SAndroid Build Coastguard Worker                report(f"{src} does not exist")
751*da0073e9SAndroid Build Coastguard Worker                del self.extensions[i]
752*da0073e9SAndroid Build Coastguard Worker            else:
753*da0073e9SAndroid Build Coastguard Worker                dst = os.path.join(os.path.realpath(self.build_lib), filename)
754*da0073e9SAndroid Build Coastguard Worker                report(f"Copying {ext.name} from {src} to {dst}")
755*da0073e9SAndroid Build Coastguard Worker                dst_dir = os.path.dirname(dst)
756*da0073e9SAndroid Build Coastguard Worker                if not os.path.exists(dst_dir):
757*da0073e9SAndroid Build Coastguard Worker                    os.makedirs(dst_dir)
758*da0073e9SAndroid Build Coastguard Worker                self.copy_file(src, dst)
759*da0073e9SAndroid Build Coastguard Worker                i += 1
760*da0073e9SAndroid Build Coastguard Worker
761*da0073e9SAndroid Build Coastguard Worker        # Copy functorch extension
762*da0073e9SAndroid Build Coastguard Worker        for i, ext in enumerate(self.extensions):
763*da0073e9SAndroid Build Coastguard Worker            if ext.name != "functorch._C":
764*da0073e9SAndroid Build Coastguard Worker                continue
765*da0073e9SAndroid Build Coastguard Worker            fullname = self.get_ext_fullname(ext.name)
766*da0073e9SAndroid Build Coastguard Worker            filename = self.get_ext_filename(fullname)
767*da0073e9SAndroid Build Coastguard Worker            fileext = os.path.splitext(filename)[1]
768*da0073e9SAndroid Build Coastguard Worker            src = os.path.join(os.path.dirname(filename), "functorch" + fileext)
769*da0073e9SAndroid Build Coastguard Worker            dst = os.path.join(os.path.realpath(self.build_lib), filename)
770*da0073e9SAndroid Build Coastguard Worker            if os.path.exists(src):
771*da0073e9SAndroid Build Coastguard Worker                report(f"Copying {ext.name} from {src} to {dst}")
772*da0073e9SAndroid Build Coastguard Worker                dst_dir = os.path.dirname(dst)
773*da0073e9SAndroid Build Coastguard Worker                if not os.path.exists(dst_dir):
774*da0073e9SAndroid Build Coastguard Worker                    os.makedirs(dst_dir)
775*da0073e9SAndroid Build Coastguard Worker                self.copy_file(src, dst)
776*da0073e9SAndroid Build Coastguard Worker
777*da0073e9SAndroid Build Coastguard Worker        setuptools.command.build_ext.build_ext.build_extensions(self)
778*da0073e9SAndroid Build Coastguard Worker
779*da0073e9SAndroid Build Coastguard Worker    def get_outputs(self):
780*da0073e9SAndroid Build Coastguard Worker        outputs = setuptools.command.build_ext.build_ext.get_outputs(self)
781*da0073e9SAndroid Build Coastguard Worker        outputs.append(os.path.join(self.build_lib, "caffe2"))
782*da0073e9SAndroid Build Coastguard Worker        report(f"setup.py::get_outputs returning {outputs}")
783*da0073e9SAndroid Build Coastguard Worker        return outputs
784*da0073e9SAndroid Build Coastguard Worker
785*da0073e9SAndroid Build Coastguard Worker    def create_compile_commands(self):
786*da0073e9SAndroid Build Coastguard Worker        def load(filename):
787*da0073e9SAndroid Build Coastguard Worker            with open(filename) as f:
788*da0073e9SAndroid Build Coastguard Worker                return json.load(f)
789*da0073e9SAndroid Build Coastguard Worker
790*da0073e9SAndroid Build Coastguard Worker        ninja_files = glob.glob("build/*compile_commands.json")
791*da0073e9SAndroid Build Coastguard Worker        cmake_files = glob.glob("torch/lib/build/*/compile_commands.json")
792*da0073e9SAndroid Build Coastguard Worker        all_commands = [entry for f in ninja_files + cmake_files for entry in load(f)]
793*da0073e9SAndroid Build Coastguard Worker
794*da0073e9SAndroid Build Coastguard Worker        # cquery does not like c++ compiles that start with gcc.
795*da0073e9SAndroid Build Coastguard Worker        # It forgets to include the c++ header directories.
796*da0073e9SAndroid Build Coastguard Worker        # We can work around this by replacing the gcc calls that python
797*da0073e9SAndroid Build Coastguard Worker        # setup.py generates with g++ calls instead
798*da0073e9SAndroid Build Coastguard Worker        for command in all_commands:
799*da0073e9SAndroid Build Coastguard Worker            if command["command"].startswith("gcc "):
800*da0073e9SAndroid Build Coastguard Worker                command["command"] = "g++ " + command["command"][4:]
801*da0073e9SAndroid Build Coastguard Worker
802*da0073e9SAndroid Build Coastguard Worker        new_contents = json.dumps(all_commands, indent=2)
803*da0073e9SAndroid Build Coastguard Worker        contents = ""
804*da0073e9SAndroid Build Coastguard Worker        if os.path.exists("compile_commands.json"):
805*da0073e9SAndroid Build Coastguard Worker            with open("compile_commands.json") as f:
806*da0073e9SAndroid Build Coastguard Worker                contents = f.read()
807*da0073e9SAndroid Build Coastguard Worker        if contents != new_contents:
808*da0073e9SAndroid Build Coastguard Worker            with open("compile_commands.json", "w") as f:
809*da0073e9SAndroid Build Coastguard Worker                f.write(new_contents)
810*da0073e9SAndroid Build Coastguard Worker
811*da0073e9SAndroid Build Coastguard Worker
812*da0073e9SAndroid Build Coastguard Workerclass concat_license_files:
813*da0073e9SAndroid Build Coastguard Worker    """Merge LICENSE and LICENSES_BUNDLED.txt as a context manager
814*da0073e9SAndroid Build Coastguard Worker
815*da0073e9SAndroid Build Coastguard Worker    LICENSE is the main PyTorch license, LICENSES_BUNDLED.txt is auto-generated
816*da0073e9SAndroid Build Coastguard Worker    from all the licenses found in ./third_party/. We concatenate them so there
817*da0073e9SAndroid Build Coastguard Worker    is a single license file in the sdist and wheels with all of the necessary
818*da0073e9SAndroid Build Coastguard Worker    licensing info.
819*da0073e9SAndroid Build Coastguard Worker    """
820*da0073e9SAndroid Build Coastguard Worker
821*da0073e9SAndroid Build Coastguard Worker    def __init__(self, include_files=False):
822*da0073e9SAndroid Build Coastguard Worker        self.f1 = "LICENSE"
823*da0073e9SAndroid Build Coastguard Worker        self.f2 = "third_party/LICENSES_BUNDLED.txt"
824*da0073e9SAndroid Build Coastguard Worker        self.include_files = include_files
825*da0073e9SAndroid Build Coastguard Worker
826*da0073e9SAndroid Build Coastguard Worker    def __enter__(self):
827*da0073e9SAndroid Build Coastguard Worker        """Concatenate files"""
828*da0073e9SAndroid Build Coastguard Worker
829*da0073e9SAndroid Build Coastguard Worker        old_path = sys.path
830*da0073e9SAndroid Build Coastguard Worker        sys.path.append(third_party_path)
831*da0073e9SAndroid Build Coastguard Worker        try:
832*da0073e9SAndroid Build Coastguard Worker            from build_bundled import create_bundled
833*da0073e9SAndroid Build Coastguard Worker        finally:
834*da0073e9SAndroid Build Coastguard Worker            sys.path = old_path
835*da0073e9SAndroid Build Coastguard Worker
836*da0073e9SAndroid Build Coastguard Worker        with open(self.f1) as f1:
837*da0073e9SAndroid Build Coastguard Worker            self.bsd_text = f1.read()
838*da0073e9SAndroid Build Coastguard Worker
839*da0073e9SAndroid Build Coastguard Worker        with open(self.f1, "a") as f1:
840*da0073e9SAndroid Build Coastguard Worker            f1.write("\n\n")
841*da0073e9SAndroid Build Coastguard Worker            create_bundled(
842*da0073e9SAndroid Build Coastguard Worker                os.path.relpath(third_party_path), f1, include_files=self.include_files
843*da0073e9SAndroid Build Coastguard Worker            )
844*da0073e9SAndroid Build Coastguard Worker
845*da0073e9SAndroid Build Coastguard Worker    def __exit__(self, exception_type, exception_value, traceback):
846*da0073e9SAndroid Build Coastguard Worker        """Restore content of f1"""
847*da0073e9SAndroid Build Coastguard Worker        with open(self.f1, "w") as f:
848*da0073e9SAndroid Build Coastguard Worker            f.write(self.bsd_text)
849*da0073e9SAndroid Build Coastguard Worker
850*da0073e9SAndroid Build Coastguard Worker
851*da0073e9SAndroid Build Coastguard Workertry:
852*da0073e9SAndroid Build Coastguard Worker    from wheel.bdist_wheel import bdist_wheel
853*da0073e9SAndroid Build Coastguard Workerexcept ImportError:
854*da0073e9SAndroid Build Coastguard Worker    # This is useful when wheel is not installed and bdist_wheel is not
855*da0073e9SAndroid Build Coastguard Worker    # specified on the command line. If it _is_ specified, parsing the command
856*da0073e9SAndroid Build Coastguard Worker    # line will fail before wheel_concatenate is needed
857*da0073e9SAndroid Build Coastguard Worker    wheel_concatenate = None
858*da0073e9SAndroid Build Coastguard Workerelse:
859*da0073e9SAndroid Build Coastguard Worker    # Need to create the proper LICENSE.txt for the wheel
860*da0073e9SAndroid Build Coastguard Worker    class wheel_concatenate(bdist_wheel):
861*da0073e9SAndroid Build Coastguard Worker        """check submodules on sdist to prevent incomplete tarballs"""
862*da0073e9SAndroid Build Coastguard Worker
863*da0073e9SAndroid Build Coastguard Worker        def run(self):
864*da0073e9SAndroid Build Coastguard Worker            with concat_license_files(include_files=True):
865*da0073e9SAndroid Build Coastguard Worker                super().run()
866*da0073e9SAndroid Build Coastguard Worker
867*da0073e9SAndroid Build Coastguard Worker        def write_wheelfile(self, *args, **kwargs):
868*da0073e9SAndroid Build Coastguard Worker            super().write_wheelfile(*args, **kwargs)
869*da0073e9SAndroid Build Coastguard Worker
870*da0073e9SAndroid Build Coastguard Worker            if BUILD_LIBTORCH_WHL:
871*da0073e9SAndroid Build Coastguard Worker                # Remove extraneneous files in the libtorch wheel
872*da0073e9SAndroid Build Coastguard Worker                for root, dirs, files in os.walk(self.bdist_dir):
873*da0073e9SAndroid Build Coastguard Worker                    for file in files:
874*da0073e9SAndroid Build Coastguard Worker                        if file.endswith((".a", ".so")) and os.path.isfile(
875*da0073e9SAndroid Build Coastguard Worker                            os.path.join(self.bdist_dir, file)
876*da0073e9SAndroid Build Coastguard Worker                        ):
877*da0073e9SAndroid Build Coastguard Worker                            os.remove(os.path.join(root, file))
878*da0073e9SAndroid Build Coastguard Worker                        elif file.endswith(".py"):
879*da0073e9SAndroid Build Coastguard Worker                            os.remove(os.path.join(root, file))
880*da0073e9SAndroid Build Coastguard Worker                # need an __init__.py file otherwise we wouldn't have a package
881*da0073e9SAndroid Build Coastguard Worker                open(os.path.join(self.bdist_dir, "torch", "__init__.py"), "w").close()
882*da0073e9SAndroid Build Coastguard Worker
883*da0073e9SAndroid Build Coastguard Worker
884*da0073e9SAndroid Build Coastguard Workerclass install(setuptools.command.install.install):
885*da0073e9SAndroid Build Coastguard Worker    def run(self):
886*da0073e9SAndroid Build Coastguard Worker        super().run()
887*da0073e9SAndroid Build Coastguard Worker
888*da0073e9SAndroid Build Coastguard Worker
889*da0073e9SAndroid Build Coastguard Workerclass clean(setuptools.Command):
890*da0073e9SAndroid Build Coastguard Worker    user_options = []
891*da0073e9SAndroid Build Coastguard Worker
892*da0073e9SAndroid Build Coastguard Worker    def initialize_options(self):
893*da0073e9SAndroid Build Coastguard Worker        pass
894*da0073e9SAndroid Build Coastguard Worker
895*da0073e9SAndroid Build Coastguard Worker    def finalize_options(self):
896*da0073e9SAndroid Build Coastguard Worker        pass
897*da0073e9SAndroid Build Coastguard Worker
898*da0073e9SAndroid Build Coastguard Worker    def run(self):
899*da0073e9SAndroid Build Coastguard Worker        import glob
900*da0073e9SAndroid Build Coastguard Worker        import re
901*da0073e9SAndroid Build Coastguard Worker
902*da0073e9SAndroid Build Coastguard Worker        with open(".gitignore") as f:
903*da0073e9SAndroid Build Coastguard Worker            ignores = f.read()
904*da0073e9SAndroid Build Coastguard Worker            pat = re.compile(r"^#( BEGIN NOT-CLEAN-FILES )?")
905*da0073e9SAndroid Build Coastguard Worker            for wildcard in filter(None, ignores.split("\n")):
906*da0073e9SAndroid Build Coastguard Worker                match = pat.match(wildcard)
907*da0073e9SAndroid Build Coastguard Worker                if match:
908*da0073e9SAndroid Build Coastguard Worker                    if match.group(1):
909*da0073e9SAndroid Build Coastguard Worker                        # Marker is found and stop reading .gitignore.
910*da0073e9SAndroid Build Coastguard Worker                        break
911*da0073e9SAndroid Build Coastguard Worker                    # Ignore lines which begin with '#'.
912*da0073e9SAndroid Build Coastguard Worker                else:
913*da0073e9SAndroid Build Coastguard Worker                    # Don't remove absolute paths from the system
914*da0073e9SAndroid Build Coastguard Worker                    wildcard = wildcard.lstrip("./")
915*da0073e9SAndroid Build Coastguard Worker
916*da0073e9SAndroid Build Coastguard Worker                    for filename in glob.glob(wildcard):
917*da0073e9SAndroid Build Coastguard Worker                        try:
918*da0073e9SAndroid Build Coastguard Worker                            os.remove(filename)
919*da0073e9SAndroid Build Coastguard Worker                        except OSError:
920*da0073e9SAndroid Build Coastguard Worker                            shutil.rmtree(filename, ignore_errors=True)
921*da0073e9SAndroid Build Coastguard Worker
922*da0073e9SAndroid Build Coastguard Worker
923*da0073e9SAndroid Build Coastguard Workerclass sdist(setuptools.command.sdist.sdist):
924*da0073e9SAndroid Build Coastguard Worker    def run(self):
925*da0073e9SAndroid Build Coastguard Worker        with concat_license_files():
926*da0073e9SAndroid Build Coastguard Worker            super().run()
927*da0073e9SAndroid Build Coastguard Worker
928*da0073e9SAndroid Build Coastguard Worker
929*da0073e9SAndroid Build Coastguard Workerdef get_cmake_cache_vars():
930*da0073e9SAndroid Build Coastguard Worker    try:
931*da0073e9SAndroid Build Coastguard Worker        return defaultdict(lambda: False, cmake.get_cmake_cache_variables())
932*da0073e9SAndroid Build Coastguard Worker    except FileNotFoundError:
933*da0073e9SAndroid Build Coastguard Worker        # CMakeCache.txt does not exist. Probably running "python setup.py clean" over a clean directory.
934*da0073e9SAndroid Build Coastguard Worker        return defaultdict(lambda: False)
935*da0073e9SAndroid Build Coastguard Worker
936*da0073e9SAndroid Build Coastguard Worker
937*da0073e9SAndroid Build Coastguard Workerdef configure_extension_build():
938*da0073e9SAndroid Build Coastguard Worker    r"""Configures extension build options according to system environment and user's choice.
939*da0073e9SAndroid Build Coastguard Worker
940*da0073e9SAndroid Build Coastguard Worker    Returns:
941*da0073e9SAndroid Build Coastguard Worker      The input to parameters ext_modules, cmdclass, packages, and entry_points as required in setuptools.setup.
942*da0073e9SAndroid Build Coastguard Worker    """
943*da0073e9SAndroid Build Coastguard Worker
944*da0073e9SAndroid Build Coastguard Worker    cmake_cache_vars = get_cmake_cache_vars()
945*da0073e9SAndroid Build Coastguard Worker
946*da0073e9SAndroid Build Coastguard Worker    ################################################################################
947*da0073e9SAndroid Build Coastguard Worker    # Configure compile flags
948*da0073e9SAndroid Build Coastguard Worker    ################################################################################
949*da0073e9SAndroid Build Coastguard Worker
950*da0073e9SAndroid Build Coastguard Worker    library_dirs = []
951*da0073e9SAndroid Build Coastguard Worker    extra_install_requires = []
952*da0073e9SAndroid Build Coastguard Worker
953*da0073e9SAndroid Build Coastguard Worker    if IS_WINDOWS:
954*da0073e9SAndroid Build Coastguard Worker        # /NODEFAULTLIB makes sure we only link to DLL runtime
955*da0073e9SAndroid Build Coastguard Worker        # and matches the flags set for protobuf and ONNX
956*da0073e9SAndroid Build Coastguard Worker        extra_link_args = ["/NODEFAULTLIB:LIBCMT.LIB"]
957*da0073e9SAndroid Build Coastguard Worker        # /MD links against DLL runtime
958*da0073e9SAndroid Build Coastguard Worker        # and matches the flags set for protobuf and ONNX
959*da0073e9SAndroid Build Coastguard Worker        # /EHsc is about standard C++ exception handling
960*da0073e9SAndroid Build Coastguard Worker        extra_compile_args = ["/MD", "/FS", "/EHsc"]
961*da0073e9SAndroid Build Coastguard Worker    else:
962*da0073e9SAndroid Build Coastguard Worker        extra_link_args = []
963*da0073e9SAndroid Build Coastguard Worker        extra_compile_args = [
964*da0073e9SAndroid Build Coastguard Worker            "-Wall",
965*da0073e9SAndroid Build Coastguard Worker            "-Wextra",
966*da0073e9SAndroid Build Coastguard Worker            "-Wno-strict-overflow",
967*da0073e9SAndroid Build Coastguard Worker            "-Wno-unused-parameter",
968*da0073e9SAndroid Build Coastguard Worker            "-Wno-missing-field-initializers",
969*da0073e9SAndroid Build Coastguard Worker            "-Wno-unknown-pragmas",
970*da0073e9SAndroid Build Coastguard Worker            # Python 2.6 requires -fno-strict-aliasing, see
971*da0073e9SAndroid Build Coastguard Worker            # http://legacy.python.org/dev/peps/pep-3123/
972*da0073e9SAndroid Build Coastguard Worker            # We also depend on it in our code (even Python 3).
973*da0073e9SAndroid Build Coastguard Worker            "-fno-strict-aliasing",
974*da0073e9SAndroid Build Coastguard Worker        ]
975*da0073e9SAndroid Build Coastguard Worker
976*da0073e9SAndroid Build Coastguard Worker    library_dirs.append(lib_path)
977*da0073e9SAndroid Build Coastguard Worker
978*da0073e9SAndroid Build Coastguard Worker    main_compile_args = []
979*da0073e9SAndroid Build Coastguard Worker    main_libraries = ["torch_python"]
980*da0073e9SAndroid Build Coastguard Worker
981*da0073e9SAndroid Build Coastguard Worker    main_link_args = []
982*da0073e9SAndroid Build Coastguard Worker    main_sources = ["torch/csrc/stub.c"]
983*da0073e9SAndroid Build Coastguard Worker
984*da0073e9SAndroid Build Coastguard Worker    if BUILD_LIBTORCH_WHL:
985*da0073e9SAndroid Build Coastguard Worker        main_libraries = ["torch"]
986*da0073e9SAndroid Build Coastguard Worker        main_sources = []
987*da0073e9SAndroid Build Coastguard Worker
988*da0073e9SAndroid Build Coastguard Worker    if build_type.is_debug():
989*da0073e9SAndroid Build Coastguard Worker        if IS_WINDOWS:
990*da0073e9SAndroid Build Coastguard Worker            extra_compile_args.append("/Z7")
991*da0073e9SAndroid Build Coastguard Worker            extra_link_args.append("/DEBUG:FULL")
992*da0073e9SAndroid Build Coastguard Worker        else:
993*da0073e9SAndroid Build Coastguard Worker            extra_compile_args += ["-O0", "-g"]
994*da0073e9SAndroid Build Coastguard Worker            extra_link_args += ["-O0", "-g"]
995*da0073e9SAndroid Build Coastguard Worker
996*da0073e9SAndroid Build Coastguard Worker    if build_type.is_rel_with_deb_info():
997*da0073e9SAndroid Build Coastguard Worker        if IS_WINDOWS:
998*da0073e9SAndroid Build Coastguard Worker            extra_compile_args.append("/Z7")
999*da0073e9SAndroid Build Coastguard Worker            extra_link_args.append("/DEBUG:FULL")
1000*da0073e9SAndroid Build Coastguard Worker        else:
1001*da0073e9SAndroid Build Coastguard Worker            extra_compile_args += ["-g"]
1002*da0073e9SAndroid Build Coastguard Worker            extra_link_args += ["-g"]
1003*da0073e9SAndroid Build Coastguard Worker
1004*da0073e9SAndroid Build Coastguard Worker    # pypi cuda package that requires installation of cuda runtime, cudnn and cublas
1005*da0073e9SAndroid Build Coastguard Worker    # should be included in all wheels uploaded to pypi
1006*da0073e9SAndroid Build Coastguard Worker    pytorch_extra_install_requirements = os.getenv(
1007*da0073e9SAndroid Build Coastguard Worker        "PYTORCH_EXTRA_INSTALL_REQUIREMENTS", ""
1008*da0073e9SAndroid Build Coastguard Worker    )
1009*da0073e9SAndroid Build Coastguard Worker    if pytorch_extra_install_requirements:
1010*da0073e9SAndroid Build Coastguard Worker        report(
1011*da0073e9SAndroid Build Coastguard Worker            f"pytorch_extra_install_requirements: {pytorch_extra_install_requirements}"
1012*da0073e9SAndroid Build Coastguard Worker        )
1013*da0073e9SAndroid Build Coastguard Worker        extra_install_requires += pytorch_extra_install_requirements.split("|")
1014*da0073e9SAndroid Build Coastguard Worker
1015*da0073e9SAndroid Build Coastguard Worker    # Cross-compile for M1
1016*da0073e9SAndroid Build Coastguard Worker    if IS_DARWIN:
1017*da0073e9SAndroid Build Coastguard Worker        macos_target_arch = os.getenv("CMAKE_OSX_ARCHITECTURES", "")
1018*da0073e9SAndroid Build Coastguard Worker        if macos_target_arch in ["arm64", "x86_64"]:
1019*da0073e9SAndroid Build Coastguard Worker            macos_sysroot_path = os.getenv("CMAKE_OSX_SYSROOT")
1020*da0073e9SAndroid Build Coastguard Worker            if macos_sysroot_path is None:
1021*da0073e9SAndroid Build Coastguard Worker                macos_sysroot_path = (
1022*da0073e9SAndroid Build Coastguard Worker                    subprocess.check_output(
1023*da0073e9SAndroid Build Coastguard Worker                        ["xcrun", "--show-sdk-path", "--sdk", "macosx"]
1024*da0073e9SAndroid Build Coastguard Worker                    )
1025*da0073e9SAndroid Build Coastguard Worker                    .decode("utf-8")
1026*da0073e9SAndroid Build Coastguard Worker                    .strip()
1027*da0073e9SAndroid Build Coastguard Worker                )
1028*da0073e9SAndroid Build Coastguard Worker            extra_compile_args += [
1029*da0073e9SAndroid Build Coastguard Worker                "-arch",
1030*da0073e9SAndroid Build Coastguard Worker                macos_target_arch,
1031*da0073e9SAndroid Build Coastguard Worker                "-isysroot",
1032*da0073e9SAndroid Build Coastguard Worker                macos_sysroot_path,
1033*da0073e9SAndroid Build Coastguard Worker            ]
1034*da0073e9SAndroid Build Coastguard Worker            extra_link_args += ["-arch", macos_target_arch]
1035*da0073e9SAndroid Build Coastguard Worker
1036*da0073e9SAndroid Build Coastguard Worker    def make_relative_rpath_args(path):
1037*da0073e9SAndroid Build Coastguard Worker        if IS_DARWIN:
1038*da0073e9SAndroid Build Coastguard Worker            return ["-Wl,-rpath,@loader_path/" + path]
1039*da0073e9SAndroid Build Coastguard Worker        elif IS_WINDOWS:
1040*da0073e9SAndroid Build Coastguard Worker            return []
1041*da0073e9SAndroid Build Coastguard Worker        else:
1042*da0073e9SAndroid Build Coastguard Worker            return ["-Wl,-rpath,$ORIGIN/" + path]
1043*da0073e9SAndroid Build Coastguard Worker
1044*da0073e9SAndroid Build Coastguard Worker    ################################################################################
1045*da0073e9SAndroid Build Coastguard Worker    # Declare extensions and package
1046*da0073e9SAndroid Build Coastguard Worker    ################################################################################
1047*da0073e9SAndroid Build Coastguard Worker
1048*da0073e9SAndroid Build Coastguard Worker    extensions = []
1049*da0073e9SAndroid Build Coastguard Worker    excludes = ["tools", "tools.*"]
1050*da0073e9SAndroid Build Coastguard Worker    if not cmake_cache_vars["BUILD_CAFFE2"]:
1051*da0073e9SAndroid Build Coastguard Worker        excludes.extend(["caffe2", "caffe2.*"])
1052*da0073e9SAndroid Build Coastguard Worker    if not cmake_cache_vars["BUILD_FUNCTORCH"]:
1053*da0073e9SAndroid Build Coastguard Worker        excludes.extend(["functorch", "functorch.*"])
1054*da0073e9SAndroid Build Coastguard Worker    packages = find_packages(exclude=excludes)
1055*da0073e9SAndroid Build Coastguard Worker    C = Extension(
1056*da0073e9SAndroid Build Coastguard Worker        "torch._C",
1057*da0073e9SAndroid Build Coastguard Worker        libraries=main_libraries,
1058*da0073e9SAndroid Build Coastguard Worker        sources=main_sources,
1059*da0073e9SAndroid Build Coastguard Worker        language="c",
1060*da0073e9SAndroid Build Coastguard Worker        extra_compile_args=main_compile_args + extra_compile_args,
1061*da0073e9SAndroid Build Coastguard Worker        include_dirs=[],
1062*da0073e9SAndroid Build Coastguard Worker        library_dirs=library_dirs,
1063*da0073e9SAndroid Build Coastguard Worker        extra_link_args=extra_link_args
1064*da0073e9SAndroid Build Coastguard Worker        + main_link_args
1065*da0073e9SAndroid Build Coastguard Worker        + make_relative_rpath_args("lib"),
1066*da0073e9SAndroid Build Coastguard Worker    )
1067*da0073e9SAndroid Build Coastguard Worker    extensions.append(C)
1068*da0073e9SAndroid Build Coastguard Worker
1069*da0073e9SAndroid Build Coastguard Worker    # These extensions are built by cmake and copied manually in build_extensions()
1070*da0073e9SAndroid Build Coastguard Worker    # inside the build_ext implementation
1071*da0073e9SAndroid Build Coastguard Worker    if cmake_cache_vars["BUILD_CAFFE2"]:
1072*da0073e9SAndroid Build Coastguard Worker        extensions.append(
1073*da0073e9SAndroid Build Coastguard Worker            Extension(name="caffe2.python.caffe2_pybind11_state", sources=[]),
1074*da0073e9SAndroid Build Coastguard Worker        )
1075*da0073e9SAndroid Build Coastguard Worker        if cmake_cache_vars["USE_CUDA"]:
1076*da0073e9SAndroid Build Coastguard Worker            extensions.append(
1077*da0073e9SAndroid Build Coastguard Worker                Extension(name="caffe2.python.caffe2_pybind11_state_gpu", sources=[]),
1078*da0073e9SAndroid Build Coastguard Worker            )
1079*da0073e9SAndroid Build Coastguard Worker        if cmake_cache_vars["USE_ROCM"]:
1080*da0073e9SAndroid Build Coastguard Worker            extensions.append(
1081*da0073e9SAndroid Build Coastguard Worker                Extension(name="caffe2.python.caffe2_pybind11_state_hip", sources=[]),
1082*da0073e9SAndroid Build Coastguard Worker            )
1083*da0073e9SAndroid Build Coastguard Worker    if cmake_cache_vars["BUILD_FUNCTORCH"]:
1084*da0073e9SAndroid Build Coastguard Worker        extensions.append(
1085*da0073e9SAndroid Build Coastguard Worker            Extension(name="functorch._C", sources=[]),
1086*da0073e9SAndroid Build Coastguard Worker        )
1087*da0073e9SAndroid Build Coastguard Worker
1088*da0073e9SAndroid Build Coastguard Worker    cmdclass = {
1089*da0073e9SAndroid Build Coastguard Worker        "bdist_wheel": wheel_concatenate,
1090*da0073e9SAndroid Build Coastguard Worker        "build_ext": build_ext,
1091*da0073e9SAndroid Build Coastguard Worker        "clean": clean,
1092*da0073e9SAndroid Build Coastguard Worker        "install": install,
1093*da0073e9SAndroid Build Coastguard Worker        "sdist": sdist,
1094*da0073e9SAndroid Build Coastguard Worker    }
1095*da0073e9SAndroid Build Coastguard Worker
1096*da0073e9SAndroid Build Coastguard Worker    entry_points = {
1097*da0073e9SAndroid Build Coastguard Worker        "console_scripts": [
1098*da0073e9SAndroid Build Coastguard Worker            "convert-caffe2-to-onnx = caffe2.python.onnx.bin.conversion:caffe2_to_onnx",
1099*da0073e9SAndroid Build Coastguard Worker            "convert-onnx-to-caffe2 = caffe2.python.onnx.bin.conversion:onnx_to_caffe2",
1100*da0073e9SAndroid Build Coastguard Worker            "torchrun = torch.distributed.run:main",
1101*da0073e9SAndroid Build Coastguard Worker        ],
1102*da0073e9SAndroid Build Coastguard Worker        "torchrun.logs_specs": [
1103*da0073e9SAndroid Build Coastguard Worker            "default = torch.distributed.elastic.multiprocessing:DefaultLogsSpecs",
1104*da0073e9SAndroid Build Coastguard Worker        ],
1105*da0073e9SAndroid Build Coastguard Worker    }
1106*da0073e9SAndroid Build Coastguard Worker
1107*da0073e9SAndroid Build Coastguard Worker    if cmake_cache_vars["USE_DISTRIBUTED"]:
1108*da0073e9SAndroid Build Coastguard Worker        # Only enable fr_trace command if distributed is enabled
1109*da0073e9SAndroid Build Coastguard Worker        entry_points["console_scripts"].append(
1110*da0073e9SAndroid Build Coastguard Worker            "torchfrtrace = tools.flight_recorder.fr_trace:main",
1111*da0073e9SAndroid Build Coastguard Worker        )
1112*da0073e9SAndroid Build Coastguard Worker    return extensions, cmdclass, packages, entry_points, extra_install_requires
1113*da0073e9SAndroid Build Coastguard Worker
1114*da0073e9SAndroid Build Coastguard Worker
1115*da0073e9SAndroid Build Coastguard Worker# post run, warnings, printed at the end to make them more visible
1116*da0073e9SAndroid Build Coastguard Workerbuild_update_message = """
1117*da0073e9SAndroid Build Coastguard Worker    It is no longer necessary to use the 'build' or 'rebuild' targets
1118*da0073e9SAndroid Build Coastguard Worker
1119*da0073e9SAndroid Build Coastguard Worker    To install:
1120*da0073e9SAndroid Build Coastguard Worker      $ python setup.py install
1121*da0073e9SAndroid Build Coastguard Worker    To develop locally:
1122*da0073e9SAndroid Build Coastguard Worker      $ python setup.py develop
1123*da0073e9SAndroid Build Coastguard Worker    To force cmake to re-generate native build files (off by default):
1124*da0073e9SAndroid Build Coastguard Worker      $ python setup.py develop --cmake
1125*da0073e9SAndroid Build Coastguard Worker"""
1126*da0073e9SAndroid Build Coastguard Worker
1127*da0073e9SAndroid Build Coastguard Worker
1128*da0073e9SAndroid Build Coastguard Workerdef print_box(msg):
1129*da0073e9SAndroid Build Coastguard Worker    lines = msg.split("\n")
1130*da0073e9SAndroid Build Coastguard Worker    size = max(len(l) + 1 for l in lines)
1131*da0073e9SAndroid Build Coastguard Worker    print("-" * (size + 2))
1132*da0073e9SAndroid Build Coastguard Worker    for l in lines:
1133*da0073e9SAndroid Build Coastguard Worker        print("|{}{}|".format(l, " " * (size - len(l))))
1134*da0073e9SAndroid Build Coastguard Worker    print("-" * (size + 2))
1135*da0073e9SAndroid Build Coastguard Worker
1136*da0073e9SAndroid Build Coastguard Worker
1137*da0073e9SAndroid Build Coastguard Workerdef main():
1138*da0073e9SAndroid Build Coastguard Worker    if BUILD_LIBTORCH_WHL and BUILD_PYTHON_ONLY:
1139*da0073e9SAndroid Build Coastguard Worker        raise RuntimeError(
1140*da0073e9SAndroid Build Coastguard Worker            "Conflict: 'BUILD_LIBTORCH_WHL' and 'BUILD_PYTHON_ONLY' can't both be 1. Set one to 0 and rerun."
1141*da0073e9SAndroid Build Coastguard Worker        )
1142*da0073e9SAndroid Build Coastguard Worker    install_requires = [
1143*da0073e9SAndroid Build Coastguard Worker        "filelock",
1144*da0073e9SAndroid Build Coastguard Worker        "typing-extensions>=4.8.0",
1145*da0073e9SAndroid Build Coastguard Worker        'setuptools ; python_version >= "3.12"',
1146*da0073e9SAndroid Build Coastguard Worker        'sympy==1.12.1 ; python_version == "3.8"',
1147*da0073e9SAndroid Build Coastguard Worker        'sympy==1.13.1 ; python_version >= "3.9"',
1148*da0073e9SAndroid Build Coastguard Worker        "networkx",
1149*da0073e9SAndroid Build Coastguard Worker        "jinja2",
1150*da0073e9SAndroid Build Coastguard Worker        "fsspec",
1151*da0073e9SAndroid Build Coastguard Worker    ]
1152*da0073e9SAndroid Build Coastguard Worker
1153*da0073e9SAndroid Build Coastguard Worker    if BUILD_PYTHON_ONLY:
1154*da0073e9SAndroid Build Coastguard Worker        install_requires.append(f"{LIBTORCH_PKG_NAME}=={get_torch_version()}")
1155*da0073e9SAndroid Build Coastguard Worker
1156*da0073e9SAndroid Build Coastguard Worker    use_prioritized_text = str(os.getenv("USE_PRIORITIZED_TEXT_FOR_LD", ""))
1157*da0073e9SAndroid Build Coastguard Worker    if (
1158*da0073e9SAndroid Build Coastguard Worker        use_prioritized_text == ""
1159*da0073e9SAndroid Build Coastguard Worker        and platform.system() == "Linux"
1160*da0073e9SAndroid Build Coastguard Worker        and platform.processor() == "aarch64"
1161*da0073e9SAndroid Build Coastguard Worker    ):
1162*da0073e9SAndroid Build Coastguard Worker        print_box(
1163*da0073e9SAndroid Build Coastguard Worker            """
1164*da0073e9SAndroid Build Coastguard Worker            WARNING: we strongly recommend enabling linker script optimization for ARM + CUDA.
1165*da0073e9SAndroid Build Coastguard Worker            To do so please export USE_PRIORITIZED_TEXT_FOR_LD=1
1166*da0073e9SAndroid Build Coastguard Worker            """
1167*da0073e9SAndroid Build Coastguard Worker        )
1168*da0073e9SAndroid Build Coastguard Worker    if use_prioritized_text == "1" or use_prioritized_text == "True":
1169*da0073e9SAndroid Build Coastguard Worker        gen_linker_script(
1170*da0073e9SAndroid Build Coastguard Worker            filein="cmake/prioritized_text.txt", fout="cmake/linker_script.ld"
1171*da0073e9SAndroid Build Coastguard Worker        )
1172*da0073e9SAndroid Build Coastguard Worker        linker_script_path = os.path.abspath("cmake/linker_script.ld")
1173*da0073e9SAndroid Build Coastguard Worker        os.environ["LDFLAGS"] = os.getenv("LDFLAGS", "") + f" -T{linker_script_path}"
1174*da0073e9SAndroid Build Coastguard Worker        os.environ["CFLAGS"] = (
1175*da0073e9SAndroid Build Coastguard Worker            os.getenv("CFLAGS", "") + " -ffunction-sections -fdata-sections"
1176*da0073e9SAndroid Build Coastguard Worker        )
1177*da0073e9SAndroid Build Coastguard Worker        os.environ["CXXFLAGS"] = (
1178*da0073e9SAndroid Build Coastguard Worker            os.getenv("CXXFLAGS", "") + " -ffunction-sections -fdata-sections"
1179*da0073e9SAndroid Build Coastguard Worker        )
1180*da0073e9SAndroid Build Coastguard Worker
1181*da0073e9SAndroid Build Coastguard Worker    # Parse the command line and check the arguments before we proceed with
1182*da0073e9SAndroid Build Coastguard Worker    # building deps and setup. We need to set values so `--help` works.
1183*da0073e9SAndroid Build Coastguard Worker    dist = Distribution()
1184*da0073e9SAndroid Build Coastguard Worker    dist.script_name = os.path.basename(sys.argv[0])
1185*da0073e9SAndroid Build Coastguard Worker    dist.script_args = sys.argv[1:]
1186*da0073e9SAndroid Build Coastguard Worker    try:
1187*da0073e9SAndroid Build Coastguard Worker        dist.parse_command_line()
1188*da0073e9SAndroid Build Coastguard Worker    except setuptools.distutils.errors.DistutilsArgError as e:
1189*da0073e9SAndroid Build Coastguard Worker        print(e)
1190*da0073e9SAndroid Build Coastguard Worker        sys.exit(1)
1191*da0073e9SAndroid Build Coastguard Worker
1192*da0073e9SAndroid Build Coastguard Worker    mirror_files_into_torchgen()
1193*da0073e9SAndroid Build Coastguard Worker    if RUN_BUILD_DEPS:
1194*da0073e9SAndroid Build Coastguard Worker        build_deps()
1195*da0073e9SAndroid Build Coastguard Worker
1196*da0073e9SAndroid Build Coastguard Worker    (
1197*da0073e9SAndroid Build Coastguard Worker        extensions,
1198*da0073e9SAndroid Build Coastguard Worker        cmdclass,
1199*da0073e9SAndroid Build Coastguard Worker        packages,
1200*da0073e9SAndroid Build Coastguard Worker        entry_points,
1201*da0073e9SAndroid Build Coastguard Worker        extra_install_requires,
1202*da0073e9SAndroid Build Coastguard Worker    ) = configure_extension_build()
1203*da0073e9SAndroid Build Coastguard Worker    install_requires += extra_install_requires
1204*da0073e9SAndroid Build Coastguard Worker
1205*da0073e9SAndroid Build Coastguard Worker    extras_require = {
1206*da0073e9SAndroid Build Coastguard Worker        "optree": ["optree>=0.12.0"],
1207*da0073e9SAndroid Build Coastguard Worker        "opt-einsum": ["opt-einsum>=3.3"],
1208*da0073e9SAndroid Build Coastguard Worker    }
1209*da0073e9SAndroid Build Coastguard Worker
1210*da0073e9SAndroid Build Coastguard Worker    # Read in README.md for our long_description
1211*da0073e9SAndroid Build Coastguard Worker    with open(os.path.join(cwd, "README.md"), encoding="utf-8") as f:
1212*da0073e9SAndroid Build Coastguard Worker        long_description = f.read()
1213*da0073e9SAndroid Build Coastguard Worker
1214*da0073e9SAndroid Build Coastguard Worker    version_range_max = max(sys.version_info[1], 12) + 1
1215*da0073e9SAndroid Build Coastguard Worker    torch_package_data = [
1216*da0073e9SAndroid Build Coastguard Worker        "py.typed",
1217*da0073e9SAndroid Build Coastguard Worker        "bin/*",
1218*da0073e9SAndroid Build Coastguard Worker        "test/*",
1219*da0073e9SAndroid Build Coastguard Worker        "*.pyi",
1220*da0073e9SAndroid Build Coastguard Worker        "_C/*.pyi",
1221*da0073e9SAndroid Build Coastguard Worker        "cuda/*.pyi",
1222*da0073e9SAndroid Build Coastguard Worker        "fx/*.pyi",
1223*da0073e9SAndroid Build Coastguard Worker        "optim/*.pyi",
1224*da0073e9SAndroid Build Coastguard Worker        "autograd/*.pyi",
1225*da0073e9SAndroid Build Coastguard Worker        "jit/*.pyi",
1226*da0073e9SAndroid Build Coastguard Worker        "nn/*.pyi",
1227*da0073e9SAndroid Build Coastguard Worker        "nn/modules/*.pyi",
1228*da0073e9SAndroid Build Coastguard Worker        "nn/parallel/*.pyi",
1229*da0073e9SAndroid Build Coastguard Worker        "utils/data/*.pyi",
1230*da0073e9SAndroid Build Coastguard Worker        "utils/data/datapipes/*.pyi",
1231*da0073e9SAndroid Build Coastguard Worker        "lib/*.pdb",
1232*da0073e9SAndroid Build Coastguard Worker        "lib/*shm*",
1233*da0073e9SAndroid Build Coastguard Worker        "lib/torch_shm_manager",
1234*da0073e9SAndroid Build Coastguard Worker        "lib/*.h",
1235*da0073e9SAndroid Build Coastguard Worker        "include/*.h",
1236*da0073e9SAndroid Build Coastguard Worker        "include/ATen/*.h",
1237*da0073e9SAndroid Build Coastguard Worker        "include/ATen/cpu/*.h",
1238*da0073e9SAndroid Build Coastguard Worker        "include/ATen/cpu/vec/vec256/*.h",
1239*da0073e9SAndroid Build Coastguard Worker        "include/ATen/cpu/vec/vec256/vsx/*.h",
1240*da0073e9SAndroid Build Coastguard Worker        "include/ATen/cpu/vec/vec256/zarch/*.h",
1241*da0073e9SAndroid Build Coastguard Worker        "include/ATen/cpu/vec/vec512/*.h",
1242*da0073e9SAndroid Build Coastguard Worker        "include/ATen/cpu/vec/*.h",
1243*da0073e9SAndroid Build Coastguard Worker        "include/ATen/core/*.h",
1244*da0073e9SAndroid Build Coastguard Worker        "include/ATen/cuda/*.cuh",
1245*da0073e9SAndroid Build Coastguard Worker        "include/ATen/cuda/*.h",
1246*da0073e9SAndroid Build Coastguard Worker        "include/ATen/cuda/detail/*.cuh",
1247*da0073e9SAndroid Build Coastguard Worker        "include/ATen/cuda/detail/*.h",
1248*da0073e9SAndroid Build Coastguard Worker        "include/ATen/cuda/tunable/*.h",
1249*da0073e9SAndroid Build Coastguard Worker        "include/ATen/cudnn/*.h",
1250*da0073e9SAndroid Build Coastguard Worker        "include/ATen/functorch/*.h",
1251*da0073e9SAndroid Build Coastguard Worker        "include/ATen/ops/*.h",
1252*da0073e9SAndroid Build Coastguard Worker        "include/ATen/hip/*.cuh",
1253*da0073e9SAndroid Build Coastguard Worker        "include/ATen/hip/*.h",
1254*da0073e9SAndroid Build Coastguard Worker        "include/ATen/hip/detail/*.cuh",
1255*da0073e9SAndroid Build Coastguard Worker        "include/ATen/hip/detail/*.h",
1256*da0073e9SAndroid Build Coastguard Worker        "include/ATen/hip/impl/*.h",
1257*da0073e9SAndroid Build Coastguard Worker        "include/ATen/hip/tunable/*.h",
1258*da0073e9SAndroid Build Coastguard Worker        "include/ATen/mps/*.h",
1259*da0073e9SAndroid Build Coastguard Worker        "include/ATen/miopen/*.h",
1260*da0073e9SAndroid Build Coastguard Worker        "include/ATen/detail/*.h",
1261*da0073e9SAndroid Build Coastguard Worker        "include/ATen/native/*.h",
1262*da0073e9SAndroid Build Coastguard Worker        "include/ATen/native/cpu/*.h",
1263*da0073e9SAndroid Build Coastguard Worker        "include/ATen/native/cuda/*.h",
1264*da0073e9SAndroid Build Coastguard Worker        "include/ATen/native/cuda/*.cuh",
1265*da0073e9SAndroid Build Coastguard Worker        "include/ATen/native/hip/*.h",
1266*da0073e9SAndroid Build Coastguard Worker        "include/ATen/native/hip/*.cuh",
1267*da0073e9SAndroid Build Coastguard Worker        "include/ATen/native/mps/*.h",
1268*da0073e9SAndroid Build Coastguard Worker        "include/ATen/native/nested/*.h",
1269*da0073e9SAndroid Build Coastguard Worker        "include/ATen/native/quantized/*.h",
1270*da0073e9SAndroid Build Coastguard Worker        "include/ATen/native/quantized/cpu/*.h",
1271*da0073e9SAndroid Build Coastguard Worker        "include/ATen/native/transformers/*.h",
1272*da0073e9SAndroid Build Coastguard Worker        "include/ATen/native/sparse/*.h",
1273*da0073e9SAndroid Build Coastguard Worker        "include/ATen/native/utils/*.h",
1274*da0073e9SAndroid Build Coastguard Worker        "include/ATen/quantized/*.h",
1275*da0073e9SAndroid Build Coastguard Worker        "include/ATen/xpu/*.h",
1276*da0073e9SAndroid Build Coastguard Worker        "include/ATen/xpu/detail/*.h",
1277*da0073e9SAndroid Build Coastguard Worker        "include/caffe2/serialize/*.h",
1278*da0073e9SAndroid Build Coastguard Worker        "include/c10/*.h",
1279*da0073e9SAndroid Build Coastguard Worker        "include/c10/macros/*.h",
1280*da0073e9SAndroid Build Coastguard Worker        "include/c10/core/*.h",
1281*da0073e9SAndroid Build Coastguard Worker        "include/ATen/core/boxing/*.h",
1282*da0073e9SAndroid Build Coastguard Worker        "include/ATen/core/boxing/impl/*.h",
1283*da0073e9SAndroid Build Coastguard Worker        "include/ATen/core/dispatch/*.h",
1284*da0073e9SAndroid Build Coastguard Worker        "include/ATen/core/op_registration/*.h",
1285*da0073e9SAndroid Build Coastguard Worker        "include/c10/core/impl/*.h",
1286*da0073e9SAndroid Build Coastguard Worker        "include/c10/util/*.h",
1287*da0073e9SAndroid Build Coastguard Worker        "include/c10/cuda/*.h",
1288*da0073e9SAndroid Build Coastguard Worker        "include/c10/cuda/impl/*.h",
1289*da0073e9SAndroid Build Coastguard Worker        "include/c10/hip/*.h",
1290*da0073e9SAndroid Build Coastguard Worker        "include/c10/hip/impl/*.h",
1291*da0073e9SAndroid Build Coastguard Worker        "include/c10/xpu/*.h",
1292*da0073e9SAndroid Build Coastguard Worker        "include/c10/xpu/impl/*.h",
1293*da0073e9SAndroid Build Coastguard Worker        "include/torch/*.h",
1294*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/*.h",
1295*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/*.h",
1296*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/data/*.h",
1297*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/data/dataloader/*.h",
1298*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/data/datasets/*.h",
1299*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/data/detail/*.h",
1300*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/data/samplers/*.h",
1301*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/data/transforms/*.h",
1302*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/detail/*.h",
1303*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/detail/ordered_dict.h",
1304*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/nn/*.h",
1305*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/nn/functional/*.h",
1306*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/nn/options/*.h",
1307*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/nn/modules/*.h",
1308*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/nn/modules/container/*.h",
1309*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/nn/parallel/*.h",
1310*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/nn/utils/*.h",
1311*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/optim/*.h",
1312*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/optim/schedulers/*.h",
1313*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/api/include/torch/serialize/*.h",
1314*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/autograd/*.h",
1315*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/autograd/functions/*.h",
1316*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/autograd/generated/*.h",
1317*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/autograd/utils/*.h",
1318*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/cuda/*.h",
1319*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/distributed/c10d/*.h",
1320*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/distributed/c10d/*.hpp",
1321*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/distributed/rpc/*.h",
1322*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/distributed/autograd/context/*.h",
1323*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/distributed/autograd/functions/*.h",
1324*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/distributed/autograd/rpc_messages/*.h",
1325*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/dynamo/*.h",
1326*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/inductor/*.h",
1327*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/inductor/aoti_runner/*.h",
1328*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/inductor/aoti_runtime/*.h",
1329*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/inductor/aoti_torch/*.h",
1330*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/inductor/aoti_torch/c/*.h",
1331*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/inductor/aoti_torch/generated/*.h",
1332*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/*.h",
1333*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/backends/*.h",
1334*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/generated/*.h",
1335*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/passes/*.h",
1336*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/passes/quantization/*.h",
1337*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/passes/utils/*.h",
1338*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/runtime/*.h",
1339*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/ir/*.h",
1340*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/frontend/*.h",
1341*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/api/*.h",
1342*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/serialization/*.h",
1343*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/python/*.h",
1344*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/mobile/*.h",
1345*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/testing/*.h",
1346*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/tensorexpr/*.h",
1347*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/tensorexpr/operators/*.h",
1348*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/jit/codegen/cuda/*.h",
1349*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/onnx/*.h",
1350*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/profiler/*.h",
1351*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/profiler/orchestration/*.h",
1352*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/profiler/standalone/*.h",
1353*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/profiler/stubs/*.h",
1354*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/profiler/unwind/*.h",
1355*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/profiler/python/*.h",
1356*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/utils/*.h",
1357*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/tensor/*.h",
1358*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/lazy/backend/*.h",
1359*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/lazy/core/*.h",
1360*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/lazy/core/internal_ops/*.h",
1361*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/lazy/core/ops/*.h",
1362*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/lazy/python/python_util.h",
1363*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/lazy/ts_backend/*.h",
1364*da0073e9SAndroid Build Coastguard Worker        "include/torch/csrc/xpu/*.h",
1365*da0073e9SAndroid Build Coastguard Worker        "include/pybind11/*.h",
1366*da0073e9SAndroid Build Coastguard Worker        "include/pybind11/detail/*.h",
1367*da0073e9SAndroid Build Coastguard Worker        "include/pybind11/eigen/*.h",
1368*da0073e9SAndroid Build Coastguard Worker        "include/TH/*.h*",
1369*da0073e9SAndroid Build Coastguard Worker        "include/TH/generic/*.h*",
1370*da0073e9SAndroid Build Coastguard Worker        "include/THC/*.cuh",
1371*da0073e9SAndroid Build Coastguard Worker        "include/THC/*.h*",
1372*da0073e9SAndroid Build Coastguard Worker        "include/THC/generic/*.h",
1373*da0073e9SAndroid Build Coastguard Worker        "include/THH/*.cuh",
1374*da0073e9SAndroid Build Coastguard Worker        "include/THH/*.h*",
1375*da0073e9SAndroid Build Coastguard Worker        "include/THH/generic/*.h",
1376*da0073e9SAndroid Build Coastguard Worker        "include/sleef.h",
1377*da0073e9SAndroid Build Coastguard Worker        "_inductor/codegen/*.h",
1378*da0073e9SAndroid Build Coastguard Worker        "_inductor/codegen/aoti_runtime/*.cpp",
1379*da0073e9SAndroid Build Coastguard Worker        "_export/serde/*.yaml",
1380*da0073e9SAndroid Build Coastguard Worker        "share/cmake/ATen/*.cmake",
1381*da0073e9SAndroid Build Coastguard Worker        "share/cmake/Caffe2/*.cmake",
1382*da0073e9SAndroid Build Coastguard Worker        "share/cmake/Caffe2/public/*.cmake",
1383*da0073e9SAndroid Build Coastguard Worker        "share/cmake/Caffe2/Modules_CUDA_fix/*.cmake",
1384*da0073e9SAndroid Build Coastguard Worker        "share/cmake/Caffe2/Modules_CUDA_fix/upstream/*.cmake",
1385*da0073e9SAndroid Build Coastguard Worker        "share/cmake/Caffe2/Modules_CUDA_fix/upstream/FindCUDA/*.cmake",
1386*da0073e9SAndroid Build Coastguard Worker        "share/cmake/Gloo/*.cmake",
1387*da0073e9SAndroid Build Coastguard Worker        "share/cmake/Tensorpipe/*.cmake",
1388*da0073e9SAndroid Build Coastguard Worker        "share/cmake/Torch/*.cmake",
1389*da0073e9SAndroid Build Coastguard Worker        "utils/benchmark/utils/*.cpp",
1390*da0073e9SAndroid Build Coastguard Worker        "utils/benchmark/utils/valgrind_wrapper/*.cpp",
1391*da0073e9SAndroid Build Coastguard Worker        "utils/benchmark/utils/valgrind_wrapper/*.h",
1392*da0073e9SAndroid Build Coastguard Worker        "utils/model_dump/skeleton.html",
1393*da0073e9SAndroid Build Coastguard Worker        "utils/model_dump/code.js",
1394*da0073e9SAndroid Build Coastguard Worker        "utils/model_dump/*.mjs",
1395*da0073e9SAndroid Build Coastguard Worker    ]
1396*da0073e9SAndroid Build Coastguard Worker
1397*da0073e9SAndroid Build Coastguard Worker    if not BUILD_LIBTORCH_WHL:
1398*da0073e9SAndroid Build Coastguard Worker        torch_package_data.extend(
1399*da0073e9SAndroid Build Coastguard Worker            [
1400*da0073e9SAndroid Build Coastguard Worker                "lib/libtorch_python.so",
1401*da0073e9SAndroid Build Coastguard Worker                "lib/libtorch_python.dylib",
1402*da0073e9SAndroid Build Coastguard Worker                "lib/libtorch_python.dll",
1403*da0073e9SAndroid Build Coastguard Worker            ]
1404*da0073e9SAndroid Build Coastguard Worker        )
1405*da0073e9SAndroid Build Coastguard Worker    if not BUILD_PYTHON_ONLY:
1406*da0073e9SAndroid Build Coastguard Worker        torch_package_data.extend(
1407*da0073e9SAndroid Build Coastguard Worker            [
1408*da0073e9SAndroid Build Coastguard Worker                "lib/*.so*",
1409*da0073e9SAndroid Build Coastguard Worker                "lib/*.dylib*",
1410*da0073e9SAndroid Build Coastguard Worker                "lib/*.dll",
1411*da0073e9SAndroid Build Coastguard Worker                "lib/*.lib",
1412*da0073e9SAndroid Build Coastguard Worker            ]
1413*da0073e9SAndroid Build Coastguard Worker        )
1414*da0073e9SAndroid Build Coastguard Worker    if get_cmake_cache_vars()["BUILD_CAFFE2"]:
1415*da0073e9SAndroid Build Coastguard Worker        torch_package_data.extend(
1416*da0073e9SAndroid Build Coastguard Worker            [
1417*da0073e9SAndroid Build Coastguard Worker                "include/caffe2/**/*.h",
1418*da0073e9SAndroid Build Coastguard Worker                "include/caffe2/utils/*.h",
1419*da0073e9SAndroid Build Coastguard Worker                "include/caffe2/utils/**/*.h",
1420*da0073e9SAndroid Build Coastguard Worker            ]
1421*da0073e9SAndroid Build Coastguard Worker        )
1422*da0073e9SAndroid Build Coastguard Worker    if get_cmake_cache_vars()["USE_TENSORPIPE"]:
1423*da0073e9SAndroid Build Coastguard Worker        torch_package_data.extend(
1424*da0073e9SAndroid Build Coastguard Worker            [
1425*da0073e9SAndroid Build Coastguard Worker                "include/tensorpipe/*.h",
1426*da0073e9SAndroid Build Coastguard Worker                "include/tensorpipe/channel/*.h",
1427*da0073e9SAndroid Build Coastguard Worker                "include/tensorpipe/channel/basic/*.h",
1428*da0073e9SAndroid Build Coastguard Worker                "include/tensorpipe/channel/cma/*.h",
1429*da0073e9SAndroid Build Coastguard Worker                "include/tensorpipe/channel/mpt/*.h",
1430*da0073e9SAndroid Build Coastguard Worker                "include/tensorpipe/channel/xth/*.h",
1431*da0073e9SAndroid Build Coastguard Worker                "include/tensorpipe/common/*.h",
1432*da0073e9SAndroid Build Coastguard Worker                "include/tensorpipe/core/*.h",
1433*da0073e9SAndroid Build Coastguard Worker                "include/tensorpipe/transport/*.h",
1434*da0073e9SAndroid Build Coastguard Worker                "include/tensorpipe/transport/ibv/*.h",
1435*da0073e9SAndroid Build Coastguard Worker                "include/tensorpipe/transport/shm/*.h",
1436*da0073e9SAndroid Build Coastguard Worker                "include/tensorpipe/transport/uv/*.h",
1437*da0073e9SAndroid Build Coastguard Worker            ]
1438*da0073e9SAndroid Build Coastguard Worker        )
1439*da0073e9SAndroid Build Coastguard Worker    if get_cmake_cache_vars()["USE_KINETO"]:
1440*da0073e9SAndroid Build Coastguard Worker        torch_package_data.extend(
1441*da0073e9SAndroid Build Coastguard Worker            [
1442*da0073e9SAndroid Build Coastguard Worker                "include/kineto/*.h",
1443*da0073e9SAndroid Build Coastguard Worker            ]
1444*da0073e9SAndroid Build Coastguard Worker        )
1445*da0073e9SAndroid Build Coastguard Worker    torchgen_package_data = [
1446*da0073e9SAndroid Build Coastguard Worker        # Recursive glob doesn't work in setup.py,
1447*da0073e9SAndroid Build Coastguard Worker        # https://github.com/pypa/setuptools/issues/1806
1448*da0073e9SAndroid Build Coastguard Worker        # To make this robust we should replace it with some code that
1449*da0073e9SAndroid Build Coastguard Worker        # returns a list of everything under packaged/
1450*da0073e9SAndroid Build Coastguard Worker        "packaged/ATen/*",
1451*da0073e9SAndroid Build Coastguard Worker        "packaged/ATen/native/*",
1452*da0073e9SAndroid Build Coastguard Worker        "packaged/ATen/templates/*",
1453*da0073e9SAndroid Build Coastguard Worker        "packaged/autograd/*",
1454*da0073e9SAndroid Build Coastguard Worker        "packaged/autograd/templates/*",
1455*da0073e9SAndroid Build Coastguard Worker    ]
1456*da0073e9SAndroid Build Coastguard Worker    package_data = {
1457*da0073e9SAndroid Build Coastguard Worker        "torch": torch_package_data,
1458*da0073e9SAndroid Build Coastguard Worker    }
1459*da0073e9SAndroid Build Coastguard Worker
1460*da0073e9SAndroid Build Coastguard Worker    if not BUILD_LIBTORCH_WHL:
1461*da0073e9SAndroid Build Coastguard Worker        package_data["torchgen"] = torchgen_package_data
1462*da0073e9SAndroid Build Coastguard Worker        package_data["caffe2"] = [
1463*da0073e9SAndroid Build Coastguard Worker            "python/serialized_test/data/operator_test/*.zip",
1464*da0073e9SAndroid Build Coastguard Worker        ]
1465*da0073e9SAndroid Build Coastguard Worker    else:
1466*da0073e9SAndroid Build Coastguard Worker        # no extensions in BUILD_LIBTORCH_WHL mode
1467*da0073e9SAndroid Build Coastguard Worker        extensions = []
1468*da0073e9SAndroid Build Coastguard Worker
1469*da0073e9SAndroid Build Coastguard Worker    setup(
1470*da0073e9SAndroid Build Coastguard Worker        name=package_name,
1471*da0073e9SAndroid Build Coastguard Worker        version=version,
1472*da0073e9SAndroid Build Coastguard Worker        description=(
1473*da0073e9SAndroid Build Coastguard Worker            "Tensors and Dynamic neural networks in "
1474*da0073e9SAndroid Build Coastguard Worker            "Python with strong GPU acceleration"
1475*da0073e9SAndroid Build Coastguard Worker        ),
1476*da0073e9SAndroid Build Coastguard Worker        long_description=long_description,
1477*da0073e9SAndroid Build Coastguard Worker        long_description_content_type="text/markdown",
1478*da0073e9SAndroid Build Coastguard Worker        ext_modules=extensions,
1479*da0073e9SAndroid Build Coastguard Worker        cmdclass=cmdclass,
1480*da0073e9SAndroid Build Coastguard Worker        packages=packages,
1481*da0073e9SAndroid Build Coastguard Worker        entry_points=entry_points,
1482*da0073e9SAndroid Build Coastguard Worker        install_requires=install_requires,
1483*da0073e9SAndroid Build Coastguard Worker        extras_require=extras_require,
1484*da0073e9SAndroid Build Coastguard Worker        package_data=package_data,
1485*da0073e9SAndroid Build Coastguard Worker        url="https://pytorch.org/",
1486*da0073e9SAndroid Build Coastguard Worker        download_url="https://github.com/pytorch/pytorch/tags",
1487*da0073e9SAndroid Build Coastguard Worker        author="PyTorch Team",
1488*da0073e9SAndroid Build Coastguard Worker        author_email="[email protected]",
1489*da0073e9SAndroid Build Coastguard Worker        python_requires=f">={python_min_version_str}",
1490*da0073e9SAndroid Build Coastguard Worker        # PyPI package information.
1491*da0073e9SAndroid Build Coastguard Worker        classifiers=[
1492*da0073e9SAndroid Build Coastguard Worker            "Development Status :: 5 - Production/Stable",
1493*da0073e9SAndroid Build Coastguard Worker            "Intended Audience :: Developers",
1494*da0073e9SAndroid Build Coastguard Worker            "Intended Audience :: Education",
1495*da0073e9SAndroid Build Coastguard Worker            "Intended Audience :: Science/Research",
1496*da0073e9SAndroid Build Coastguard Worker            "License :: OSI Approved :: BSD License",
1497*da0073e9SAndroid Build Coastguard Worker            "Topic :: Scientific/Engineering",
1498*da0073e9SAndroid Build Coastguard Worker            "Topic :: Scientific/Engineering :: Mathematics",
1499*da0073e9SAndroid Build Coastguard Worker            "Topic :: Scientific/Engineering :: Artificial Intelligence",
1500*da0073e9SAndroid Build Coastguard Worker            "Topic :: Software Development",
1501*da0073e9SAndroid Build Coastguard Worker            "Topic :: Software Development :: Libraries",
1502*da0073e9SAndroid Build Coastguard Worker            "Topic :: Software Development :: Libraries :: Python Modules",
1503*da0073e9SAndroid Build Coastguard Worker            "Programming Language :: C++",
1504*da0073e9SAndroid Build Coastguard Worker            "Programming Language :: Python :: 3",
1505*da0073e9SAndroid Build Coastguard Worker        ]
1506*da0073e9SAndroid Build Coastguard Worker        + [
1507*da0073e9SAndroid Build Coastguard Worker            f"Programming Language :: Python :: 3.{i}"
1508*da0073e9SAndroid Build Coastguard Worker            for i in range(python_min_version[1], version_range_max)
1509*da0073e9SAndroid Build Coastguard Worker        ],
1510*da0073e9SAndroid Build Coastguard Worker        license="BSD-3-Clause",
1511*da0073e9SAndroid Build Coastguard Worker        keywords="pytorch, machine learning",
1512*da0073e9SAndroid Build Coastguard Worker    )
1513*da0073e9SAndroid Build Coastguard Worker    if EMIT_BUILD_WARNING:
1514*da0073e9SAndroid Build Coastguard Worker        print_box(build_update_message)
1515*da0073e9SAndroid Build Coastguard Worker
1516*da0073e9SAndroid Build Coastguard Worker
1517*da0073e9SAndroid Build Coastguard Workerif __name__ == "__main__":
1518*da0073e9SAndroid Build Coastguard Worker    main()
1519