xref: /aosp_15_r20/external/pytorch/CMakeLists.txt (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Workercmake_minimum_required(VERSION 3.18 FATAL_ERROR)
2*da0073e9SAndroid Build Coastguard Worker# cmake_policy(SET CMP0022 NEW) cmake_policy(SET CMP0023 NEW)
3*da0073e9SAndroid Build Coastguard Worker
4*da0073e9SAndroid Build Coastguard Worker# Use compiler ID "AppleClang" instead of "Clang" for XCode. Not setting this
5*da0073e9SAndroid Build Coastguard Worker# sometimes makes XCode C compiler gets detected as "Clang", even when the C++
6*da0073e9SAndroid Build Coastguard Worker# one is detected as "AppleClang".
7*da0073e9SAndroid Build Coastguard Workercmake_policy(SET CMP0010 NEW)
8*da0073e9SAndroid Build Coastguard Workercmake_policy(SET CMP0025 NEW)
9*da0073e9SAndroid Build Coastguard Worker
10*da0073e9SAndroid Build Coastguard Worker# Enables CMake to set LTO on compilers other than Intel.
11*da0073e9SAndroid Build Coastguard Workercmake_policy(SET CMP0069 NEW)
12*da0073e9SAndroid Build Coastguard Worker# Enable the policy for CMake subprojects. protobuf currently causes issues
13*da0073e9SAndroid Build Coastguard Worker# set(CMAKE_POLICY_DEFAULT_CMP0069 NEW)
14*da0073e9SAndroid Build Coastguard Worker
15*da0073e9SAndroid Build Coastguard Worker# Suppress warning flags in default MSVC configuration.  It's not mandatory that
16*da0073e9SAndroid Build Coastguard Worker# we do this (and we don't if cmake is old), but it's nice when it's possible,
17*da0073e9SAndroid Build Coastguard Worker# and it's possible on our Windows configs.
18*da0073e9SAndroid Build Coastguard Workercmake_policy(SET CMP0092 NEW)
19*da0073e9SAndroid Build Coastguard Worker
20*da0073e9SAndroid Build Coastguard Worker# Prohibit in-source builds
21*da0073e9SAndroid Build Coastguard Workerif(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
22*da0073e9SAndroid Build Coastguard Worker  message(FATAL_ERROR "In-source build are not supported")
23*da0073e9SAndroid Build Coastguard Workerendif()
24*da0073e9SAndroid Build Coastguard Worker
25*da0073e9SAndroid Build Coastguard Worker# ---[ Project and semantic versioning.
26*da0073e9SAndroid Build Coastguard Workerproject(Torch CXX C)
27*da0073e9SAndroid Build Coastguard Worker
28*da0073e9SAndroid Build Coastguard Workerif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
29*da0073e9SAndroid Build Coastguard Worker  set(LINUX TRUE)
30*da0073e9SAndroid Build Coastguard Workerelse()
31*da0073e9SAndroid Build Coastguard Worker  set(LINUX FALSE)
32*da0073e9SAndroid Build Coastguard Workerendif()
33*da0073e9SAndroid Build Coastguard Worker
34*da0073e9SAndroid Build Coastguard Workerset(CMAKE_INSTALL_MESSAGE NEVER)
35*da0073e9SAndroid Build Coastguard Worker
36*da0073e9SAndroid Build Coastguard Worker# check and set CMAKE_CXX_STANDARD
37*da0073e9SAndroid Build Coastguard Workerstring(FIND "${CMAKE_CXX_FLAGS}" "-std=c++" env_cxx_standard)
38*da0073e9SAndroid Build Coastguard Workerif(env_cxx_standard GREATER -1)
39*da0073e9SAndroid Build Coastguard Worker  message(
40*da0073e9SAndroid Build Coastguard Worker    WARNING
41*da0073e9SAndroid Build Coastguard Worker      "C++ standard version definition detected in environment variable."
42*da0073e9SAndroid Build Coastguard Worker      "PyTorch requires -std=c++17. Please remove -std=c++ settings in your environment."
43*da0073e9SAndroid Build Coastguard Worker  )
44*da0073e9SAndroid Build Coastguard Workerendif()
45*da0073e9SAndroid Build Coastguard Workerset(CMAKE_CXX_STANDARD
46*da0073e9SAndroid Build Coastguard Worker    17
47*da0073e9SAndroid Build Coastguard Worker    CACHE STRING
48*da0073e9SAndroid Build Coastguard Worker          "The C++ standard whose features are requested to build this target.")
49*da0073e9SAndroid Build Coastguard Workerset(CMAKE_C_STANDARD
50*da0073e9SAndroid Build Coastguard Worker    11
51*da0073e9SAndroid Build Coastguard Worker    CACHE STRING
52*da0073e9SAndroid Build Coastguard Worker          "The C standard whose features are requested to build this target.")
53*da0073e9SAndroid Build Coastguard Worker
54*da0073e9SAndroid Build Coastguard Worker# ---[ Utils
55*da0073e9SAndroid Build Coastguard Workerinclude(cmake/public/utils.cmake)
56*da0073e9SAndroid Build Coastguard Worker
57*da0073e9SAndroid Build Coastguard Worker# --- [ Check that minimal gcc version is 9.3+
58*da0073e9SAndroid Build Coastguard Workerif(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.3)
59*da0073e9SAndroid Build Coastguard Worker  message(
60*da0073e9SAndroid Build Coastguard Worker    FATAL_ERROR
61*da0073e9SAndroid Build Coastguard Worker      "GCC-9.3 or newer is required to compile PyTorch, but found ${CMAKE_CXX_COMPILER_VERSION}"
62*da0073e9SAndroid Build Coastguard Worker  )
63*da0073e9SAndroid Build Coastguard Workerendif()
64*da0073e9SAndroid Build Coastguard Worker
65*da0073e9SAndroid Build Coastguard Worker# This define is needed to preserve behavior given anticpated changes to
66*da0073e9SAndroid Build Coastguard Worker# cccl/thrust
67*da0073e9SAndroid Build Coastguard Worker# https://nvidia.github.io/libcudacxx/standard_api/numerics_library/complex.html
68*da0073e9SAndroid Build Coastguard Workerstring(APPEND CMAKE_CUDA_FLAGS
69*da0073e9SAndroid Build Coastguard Worker       " -DLIBCUDACXX_ENABLE_SIMPLIFIED_COMPLEX_OPERATIONS")
70*da0073e9SAndroid Build Coastguard Worker
71*da0073e9SAndroid Build Coastguard Workerif(LINUX)
72*da0073e9SAndroid Build Coastguard Worker  include(cmake/CheckAbi.cmake)
73*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS
74*da0073e9SAndroid Build Coastguard Worker         " -D_GLIBCXX_USE_CXX11_ABI=${GLIBCXX_USE_CXX11_ABI}")
75*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CUDA_FLAGS
76*da0073e9SAndroid Build Coastguard Worker         " -D_GLIBCXX_USE_CXX11_ABI=${GLIBCXX_USE_CXX11_ABI}")
77*da0073e9SAndroid Build Coastguard Worker  if(${GLIBCXX_USE_CXX11_ABI} EQUAL 1)
78*da0073e9SAndroid Build Coastguard Worker    set(CXX_STANDARD_REQUIRED ON)
79*da0073e9SAndroid Build Coastguard Worker  else()
80*da0073e9SAndroid Build Coastguard Worker    # Please note this is required in order to ensure compatibility between gcc
81*da0073e9SAndroid Build Coastguard Worker    # 9 and gcc 7 This could be removed when all Linux PyTorch binary builds are
82*da0073e9SAndroid Build Coastguard Worker    # compiled by the same toolchain again
83*da0073e9SAndroid Build Coastguard Worker    append_cxx_flag_if_supported("-fabi-version=11" CMAKE_CXX_FLAGS)
84*da0073e9SAndroid Build Coastguard Worker  endif()
85*da0073e9SAndroid Build Coastguard Workerendif()
86*da0073e9SAndroid Build Coastguard Worker
87*da0073e9SAndroid Build Coastguard Workerset(CMAKE_EXPORT_COMPILE_COMMANDS ON)
88*da0073e9SAndroid Build Coastguard Workerset(CMAKE_LINK_WHAT_YOU_USE TRUE)
89*da0073e9SAndroid Build Coastguard Worker
90*da0073e9SAndroid Build Coastguard Worker# One variable that determines whether the current cmake process is being run
91*da0073e9SAndroid Build Coastguard Worker# with the main Caffe2 library. This is useful for building modules - if modules
92*da0073e9SAndroid Build Coastguard Worker# are built with the main Caffe2 library then one does not need to do find
93*da0073e9SAndroid Build Coastguard Worker# caffe2 in the cmake script. One can usually guard it in some way like if(NOT
94*da0073e9SAndroid Build Coastguard Worker# CAFFE2_CMAKE_BUILDING_WITH_MAIN_REPO) find_package(Caffe2 REQUIRED) endif()
95*da0073e9SAndroid Build Coastguard Workerset(CAFFE2_CMAKE_BUILDING_WITH_MAIN_REPO ON)
96*da0073e9SAndroid Build Coastguard Worker
97*da0073e9SAndroid Build Coastguard Worker# Googletest's cmake files are going to set it on once they are processed. Let's
98*da0073e9SAndroid Build Coastguard Worker# set it at the very beginning so that the entire build is deterministic.
99*da0073e9SAndroid Build Coastguard Workerset(THREADS_PREFER_PTHREAD_FLAG ON)
100*da0073e9SAndroid Build Coastguard Worker
101*da0073e9SAndroid Build Coastguard Workerif(NOT DEFINED BLAS_SET_BY_USER)
102*da0073e9SAndroid Build Coastguard Worker  if(DEFINED BLAS)
103*da0073e9SAndroid Build Coastguard Worker    set(BLAS_SET_BY_USER TRUE)
104*da0073e9SAndroid Build Coastguard Worker  else()
105*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Not forcing any particular BLAS to be found")
106*da0073e9SAndroid Build Coastguard Worker    set(BLAS_SET_BY_USER FALSE)
107*da0073e9SAndroid Build Coastguard Worker  endif()
108*da0073e9SAndroid Build Coastguard Worker  set(BLAS_SET_BY_USER
109*da0073e9SAndroid Build Coastguard Worker      ${BLAS_SET_BY_USER}
110*da0073e9SAndroid Build Coastguard Worker      CACHE STRING
111*da0073e9SAndroid Build Coastguard Worker            "Marks whether BLAS was manually set by user or auto-detected")
112*da0073e9SAndroid Build Coastguard Workerendif()
113*da0073e9SAndroid Build Coastguard Worker
114*da0073e9SAndroid Build Coastguard Worker# Apple specific
115*da0073e9SAndroid Build Coastguard Workerif(APPLE)
116*da0073e9SAndroid Build Coastguard Worker  # These lines are an attempt to make find_package(cuda) pick up libcuda.dylib,
117*da0073e9SAndroid Build Coastguard Worker  # and not cuda.framework.  It doesn't work all the time, but it seems to help
118*da0073e9SAndroid Build Coastguard Worker  # for some users. TODO: replace this with a more robust fix
119*da0073e9SAndroid Build Coastguard Worker  set(CMAKE_FIND_FRAMEWORK LAST)
120*da0073e9SAndroid Build Coastguard Worker  set(CMAKE_FIND_APPBUNDLE LAST)
121*da0073e9SAndroid Build Coastguard Worker
122*da0073e9SAndroid Build Coastguard Worker  # Get clang version on macOS
123*da0073e9SAndroid Build Coastguard Worker  execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version
124*da0073e9SAndroid Build Coastguard Worker                  OUTPUT_VARIABLE clang_full_version_string)
125*da0073e9SAndroid Build Coastguard Worker  string(REGEX REPLACE "Apple (.*) version ([0-9]+\\.[0-9]+).*" "\\2"
126*da0073e9SAndroid Build Coastguard Worker                       CLANG_VERSION_STRING ${clang_full_version_string})
127*da0073e9SAndroid Build Coastguard Worker  message(STATUS "CLANG_VERSION_STRING:         " ${CLANG_VERSION_STRING})
128*da0073e9SAndroid Build Coastguard Worker
129*da0073e9SAndroid Build Coastguard Worker  # RPATH stuff
130*da0073e9SAndroid Build Coastguard Worker  set(CMAKE_MACOSX_RPATH ON)
131*da0073e9SAndroid Build Coastguard Worker  if(NOT IOS)
132*da0073e9SAndroid Build Coastguard Worker    # Determine if we can link against MPSGraph
133*da0073e9SAndroid Build Coastguard Worker    set(MPS_FOUND OFF)
134*da0073e9SAndroid Build Coastguard Worker    execute_process(
135*da0073e9SAndroid Build Coastguard Worker      COMMAND bash -c "xcrun --sdk macosx --show-sdk-version"
136*da0073e9SAndroid Build Coastguard Worker      RESULT_VARIABLE _exit_code
137*da0073e9SAndroid Build Coastguard Worker      OUTPUT_VARIABLE _macosx_sdk_version
138*da0073e9SAndroid Build Coastguard Worker      OUTPUT_STRIP_TRAILING_WHITESPACE)
139*da0073e9SAndroid Build Coastguard Worker    if(_exit_code EQUAL 0)
140*da0073e9SAndroid Build Coastguard Worker      set(_MPS_supported_os_version OFF)
141*da0073e9SAndroid Build Coastguard Worker      if(_macosx_sdk_version VERSION_GREATER_EQUAL 12.3)
142*da0073e9SAndroid Build Coastguard Worker        set(_MPS_supported_os_version ON)
143*da0073e9SAndroid Build Coastguard Worker      endif()
144*da0073e9SAndroid Build Coastguard Worker      message(
145*da0073e9SAndroid Build Coastguard Worker        STATUS
146*da0073e9SAndroid Build Coastguard Worker          "sdk version: ${_macosx_sdk_version}, mps supported: ${_MPS_supported_os_version}"
147*da0073e9SAndroid Build Coastguard Worker      )
148*da0073e9SAndroid Build Coastguard Worker      execute_process(
149*da0073e9SAndroid Build Coastguard Worker        COMMAND bash -c "xcrun --sdk macosx --show-sdk-path"
150*da0073e9SAndroid Build Coastguard Worker        OUTPUT_VARIABLE _macosx_sdk_path
151*da0073e9SAndroid Build Coastguard Worker        OUTPUT_STRIP_TRAILING_WHITESPACE)
152*da0073e9SAndroid Build Coastguard Worker      set(_SDK_SEARCH_PATH "${_macosx_sdk_path}/System/Library/Frameworks/")
153*da0073e9SAndroid Build Coastguard Worker      set(_FRAMEWORK_SEARCH_PATH "/System/Library/Frameworks/")
154*da0073e9SAndroid Build Coastguard Worker
155*da0073e9SAndroid Build Coastguard Worker      find_library(
156*da0073e9SAndroid Build Coastguard Worker        _MPS_fwrk_path_
157*da0073e9SAndroid Build Coastguard Worker        NAMES MetalPerformanceShadersGraph MetalPerformanceShaders
158*da0073e9SAndroid Build Coastguard Worker        PATHS ${_FRAMEWORK_SEARCH_PATH}
159*da0073e9SAndroid Build Coastguard Worker        NO_DEFAULT_PATH)
160*da0073e9SAndroid Build Coastguard Worker      find_library(
161*da0073e9SAndroid Build Coastguard Worker        _MPS_sdk_path_
162*da0073e9SAndroid Build Coastguard Worker        NAMES MetalPerformanceShadersGraph MetalPerformanceShaders
163*da0073e9SAndroid Build Coastguard Worker        PATHS ${_SDK_SEARCH_PATH}
164*da0073e9SAndroid Build Coastguard Worker        NO_DEFAULT_PATH)
165*da0073e9SAndroid Build Coastguard Worker
166*da0073e9SAndroid Build Coastguard Worker      if(_MPS_supported_os_version
167*da0073e9SAndroid Build Coastguard Worker         AND _MPS_fwrk_path_
168*da0073e9SAndroid Build Coastguard Worker         AND _MPS_sdk_path_)
169*da0073e9SAndroid Build Coastguard Worker        set(MPS_FOUND ON)
170*da0073e9SAndroid Build Coastguard Worker        message(STATUS "MPSGraph framework found")
171*da0073e9SAndroid Build Coastguard Worker      else()
172*da0073e9SAndroid Build Coastguard Worker        message(STATUS "MPSGraph framework not found")
173*da0073e9SAndroid Build Coastguard Worker      endif()
174*da0073e9SAndroid Build Coastguard Worker    else()
175*da0073e9SAndroid Build Coastguard Worker      message(STATUS "MPS: unable to get MacOS sdk version")
176*da0073e9SAndroid Build Coastguard Worker      message(STATUS "MPSGraph framework not found")
177*da0073e9SAndroid Build Coastguard Worker    endif()
178*da0073e9SAndroid Build Coastguard Worker  endif()
179*da0073e9SAndroid Build Coastguard Workerendif()
180*da0073e9SAndroid Build Coastguard Worker
181*da0073e9SAndroid Build Coastguard Workerset(CPU_AARCH64 OFF)
182*da0073e9SAndroid Build Coastguard Workerset(CPU_INTEL OFF)
183*da0073e9SAndroid Build Coastguard Worker
184*da0073e9SAndroid Build Coastguard Workerif(CMAKE_SYSTEM_PROCESSOR MATCHES "(AMD64|x86_64)")
185*da0073e9SAndroid Build Coastguard Worker  set(CPU_INTEL ON)
186*da0073e9SAndroid Build Coastguard Workerelseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64)")
187*da0073e9SAndroid Build Coastguard Worker  set(CPU_AARCH64 ON)
188*da0073e9SAndroid Build Coastguard Workerendif()
189*da0073e9SAndroid Build Coastguard Worker
190*da0073e9SAndroid Build Coastguard Worker# For non-supported platforms, turn USE_DISTRIBUTED off by default. It is not
191*da0073e9SAndroid Build Coastguard Worker# tested and likely won't work without additional changes.
192*da0073e9SAndroid Build Coastguard Workerif(NOT LINUX AND NOT WIN32)
193*da0073e9SAndroid Build Coastguard Worker  set(USE_DISTRIBUTED
194*da0073e9SAndroid Build Coastguard Worker      OFF
195*da0073e9SAndroid Build Coastguard Worker      CACHE STRING "Use distributed")
196*da0073e9SAndroid Build Coastguard Worker  # On macOS, if USE_DISTRIBUTED is enabled (specified by the user), then make
197*da0073e9SAndroid Build Coastguard Worker  # Gloo build with the libuv transport.
198*da0073e9SAndroid Build Coastguard Worker  if(APPLE AND USE_DISTRIBUTED)
199*da0073e9SAndroid Build Coastguard Worker    set(USE_LIBUV
200*da0073e9SAndroid Build Coastguard Worker        ON
201*da0073e9SAndroid Build Coastguard Worker        CACHE STRING "")
202*da0073e9SAndroid Build Coastguard Worker  endif()
203*da0073e9SAndroid Build Coastguard Workerendif()
204*da0073e9SAndroid Build Coastguard Worker
205*da0073e9SAndroid Build Coastguard Worker# ---[ Options. Note to developers: if you add an option below, make sure you
206*da0073e9SAndroid Build Coastguard Worker# also add it to cmake/Summary.cmake so that the summary prints out the option
207*da0073e9SAndroid Build Coastguard Worker# values.
208*da0073e9SAndroid Build Coastguard Workerinclude(CMakeDependentOption)
209*da0073e9SAndroid Build Coastguard Workeroption(ATEN_NO_TEST "Do not build ATen test binaries" OFF)
210*da0073e9SAndroid Build Coastguard Workeroption(BUILD_BINARY "Build C++ binaries" OFF)
211*da0073e9SAndroid Build Coastguard Workeroption(BUILD_CUSTOM_PROTOBUF
212*da0073e9SAndroid Build Coastguard Worker       "Build and use Caffe2's own protobuf under third_party" ON)
213*da0073e9SAndroid Build Coastguard Workeroption(BUILD_PYTHON "Build Python binaries" ON)
214*da0073e9SAndroid Build Coastguard Workeroption(BUILD_LITE_INTERPRETER "Master flag to build Lite Interpreter" OFF)
215*da0073e9SAndroid Build Coastguard Workeroption(BUILD_SHARED_LIBS "Build libcaffe2.so" ON)
216*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
217*da0073e9SAndroid Build Coastguard Worker  CAFFE2_LINK_LOCAL_PROTOBUF "If set, build protobuf inside libcaffe2.so." ON
218*da0073e9SAndroid Build Coastguard Worker  "BUILD_SHARED_LIBS AND BUILD_CUSTOM_PROTOBUF" OFF)
219*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
220*da0073e9SAndroid Build Coastguard Worker  CAFFE2_USE_MSVC_STATIC_RUNTIME "Using MSVC static runtime libraries" ON
221*da0073e9SAndroid Build Coastguard Worker  "NOT BUILD_SHARED_LIBS" OFF)
222*da0073e9SAndroid Build Coastguard Workeroption(BUILD_TEST "Build C++ test binaries (need gtest and gbenchmark)" OFF)
223*da0073e9SAndroid Build Coastguard Workeroption(BUILD_AOT_INDUCTOR_TEST "Build C++ test binaries for aot-inductor" OFF)
224*da0073e9SAndroid Build Coastguard Workeroption(BUILD_STATIC_RUNTIME_BENCHMARK
225*da0073e9SAndroid Build Coastguard Worker       "Build C++ binaries for static runtime benchmarks (need gbenchmark)" OFF)
226*da0073e9SAndroid Build Coastguard Workeroption(
227*da0073e9SAndroid Build Coastguard Worker  BUILD_MOBILE_BENCHMARK
228*da0073e9SAndroid Build Coastguard Worker  "Build C++ test binaries for mobile (ARM) targets(need gtest and gbenchmark)"
229*da0073e9SAndroid Build Coastguard Worker  OFF)
230*da0073e9SAndroid Build Coastguard Workeroption(
231*da0073e9SAndroid Build Coastguard Worker  BUILD_MOBILE_TEST
232*da0073e9SAndroid Build Coastguard Worker  "Build C++ test binaries for mobile (ARM) targets(need gtest and gbenchmark)"
233*da0073e9SAndroid Build Coastguard Worker  OFF)
234*da0073e9SAndroid Build Coastguard Workeroption(BUILD_JNI "Build JNI bindings" OFF)
235*da0073e9SAndroid Build Coastguard Workeroption(BUILD_MOBILE_AUTOGRAD
236*da0073e9SAndroid Build Coastguard Worker       "Build autograd function in mobile build (in development)" OFF)
237*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(INSTALL_TEST "Install test binaries if BUILD_TEST is on"
238*da0073e9SAndroid Build Coastguard Worker                       ON "BUILD_TEST" OFF)
239*da0073e9SAndroid Build Coastguard Workeroption(USE_CPP_CODE_COVERAGE "Compile C/C++ with code coverage flags" OFF)
240*da0073e9SAndroid Build Coastguard Workeroption(USE_COLORIZE_OUTPUT "Colorize output during compilation" ON)
241*da0073e9SAndroid Build Coastguard Workeroption(USE_ASAN "Use Address+Undefined Sanitizers" OFF)
242*da0073e9SAndroid Build Coastguard Workeroption(USE_TSAN "Use Thread Sanitizer" OFF)
243*da0073e9SAndroid Build Coastguard Workeroption(USE_CUDA "Use CUDA" ON)
244*da0073e9SAndroid Build Coastguard Workeroption(USE_XPU "Use XPU" ON)
245*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
246*da0073e9SAndroid Build Coastguard Worker  BUILD_LAZY_CUDA_LINALG "Build cuda linalg ops as separate library" ON
247*da0073e9SAndroid Build Coastguard Worker  "USE_CUDA AND LINUX AND BUILD_PYTHON" OFF)
248*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_ROCM "Use ROCm" ON "LINUX" OFF)
249*da0073e9SAndroid Build Coastguard Workeroption(CAFFE2_STATIC_LINK_CUDA "Statically link CUDA libraries" OFF)
250*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_CUDNN "Use cuDNN" ON "USE_CUDA" OFF)
251*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_STATIC_CUDNN "Use cuDNN static libraries" OFF
252*da0073e9SAndroid Build Coastguard Worker                       "USE_CUDNN" OFF)
253*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_CUSPARSELT "Use cuSPARSELt" ON "USE_CUDA" OFF)
254*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_CUDSS "Use cuDSS" ON "USE_CUDA" OFF)
255*da0073e9SAndroid Build Coastguard Worker# Binary builds will fail for cufile due to https://github.com/pytorch/builder/issues/1924
256*da0073e9SAndroid Build Coastguard Worker# Using TH_BINARY_BUILD to check whether is binary build.
257*da0073e9SAndroid Build Coastguard Worker# USE_ROCM is guarded against in Dependencies.cmake because USE_ROCM is not properly defined here
258*da0073e9SAndroid Build Coastguard Workerif(DEFINED ENV{TH_BINARY_BUILD})
259*da0073e9SAndroid Build Coastguard Worker  cmake_dependent_option(USE_CUFILE "Use cuFile" OFF
260*da0073e9SAndroid Build Coastguard Worker                         "USE_CUDA AND NOT $ENV{TH_BINARY_BUILD} AND NOT WIN32" OFF)
261*da0073e9SAndroid Build Coastguard Workerelse()
262*da0073e9SAndroid Build Coastguard Worker  cmake_dependent_option(USE_CUFILE "Use cuFile" OFF "USE_CUDA AND NOT WIN32" OFF)
263*da0073e9SAndroid Build Coastguard Workerendif()
264*da0073e9SAndroid Build Coastguard Workeroption(USE_FBGEMM "Use FBGEMM (quantized 8-bit server operators)" ON)
265*da0073e9SAndroid Build Coastguard Workeroption(USE_KINETO "Use Kineto profiling library" ON)
266*da0073e9SAndroid Build Coastguard Workeroption(USE_CUPTI_SO "Use CUPTI as a shared library" ON)
267*da0073e9SAndroid Build Coastguard Workeroption(USE_FAKELOWP "Use FakeLowp operators" OFF)
268*da0073e9SAndroid Build Coastguard Workeroption(USE_GFLAGS "Use GFLAGS" OFF)
269*da0073e9SAndroid Build Coastguard Workeroption(USE_GLOG "Use GLOG" OFF)
270*da0073e9SAndroid Build Coastguard Workeroption(USE_LITE_PROTO "Use lite protobuf instead of full." OFF)
271*da0073e9SAndroid Build Coastguard Workeroption(USE_MAGMA "Use MAGMA" ON)
272*da0073e9SAndroid Build Coastguard Workeroption(USE_PYTORCH_METAL "Use Metal for PyTorch iOS build" OFF)
273*da0073e9SAndroid Build Coastguard Workeroption(USE_PYTORCH_METAL_EXPORT "Export Metal models on MacOSX desktop" OFF)
274*da0073e9SAndroid Build Coastguard Workeroption(USE_NATIVE_ARCH "Use -march=native" OFF)
275*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_MPS "Use MPS for macOS build" ON "MPS_FOUND" OFF)
276*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_NCCL "Use NCCL" ON
277*da0073e9SAndroid Build Coastguard Worker                       "USE_CUDA OR USE_ROCM;UNIX;NOT APPLE" OFF)
278*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_RCCL "Use RCCL" ON USE_NCCL OFF)
279*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_STATIC_NCCL "Use static NCCL" OFF "USE_NCCL" OFF)
280*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_SYSTEM_NCCL "Use system-wide NCCL" OFF "USE_NCCL"
281*da0073e9SAndroid Build Coastguard Worker                       OFF)
282*da0073e9SAndroid Build Coastguard Workeroption(USE_NNAPI "Use NNAPI" OFF)
283*da0073e9SAndroid Build Coastguard Workeroption(USE_NNPACK "Use NNPACK" ON)
284*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_NUMA "Use NUMA. Only available on Linux." ON "LINUX"
285*da0073e9SAndroid Build Coastguard Worker                       OFF)
286*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_NVRTC "Use NVRTC. Only available if USE_CUDA is on."
287*da0073e9SAndroid Build Coastguard Worker                       OFF "USE_CUDA" OFF)
288*da0073e9SAndroid Build Coastguard Workeroption(USE_NUMPY "Use NumPy" ON)
289*da0073e9SAndroid Build Coastguard Workeroption(USE_OBSERVERS "Use observers module." OFF)
290*da0073e9SAndroid Build Coastguard Workeroption(USE_OPENCL "Use OpenCL" OFF)
291*da0073e9SAndroid Build Coastguard Workeroption(USE_OPENMP "Use OpenMP for parallel code" ON)
292*da0073e9SAndroid Build Coastguard Workeroption(USE_PRECOMPILED_HEADERS "Use pre-compiled headers to accelerate build."
293*da0073e9SAndroid Build Coastguard Worker       OFF)
294*da0073e9SAndroid Build Coastguard Worker
295*da0073e9SAndroid Build Coastguard Workeroption(USE_PROF "Use profiling" OFF)
296*da0073e9SAndroid Build Coastguard Workeroption(USE_PYTORCH_QNNPACK "Use ATen/QNNPACK (quantized 8-bit operators)" ON)
297*da0073e9SAndroid Build Coastguard Workeroption(USE_SNPE "Use Qualcomm's SNPE library" OFF)
298*da0073e9SAndroid Build Coastguard Workeroption(USE_SYSTEM_EIGEN_INSTALL
299*da0073e9SAndroid Build Coastguard Worker    "Use system Eigen instead of the one under third_party" OFF)
300*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
301*da0073e9SAndroid Build Coastguard Worker    USE_VALGRIND "Use Valgrind. Only available on Linux." ON
302*da0073e9SAndroid Build Coastguard Worker    "LINUX" OFF)
303*da0073e9SAndroid Build Coastguard Worker
304*da0073e9SAndroid Build Coastguard Workerif(NOT DEFINED USE_VULKAN)
305*da0073e9SAndroid Build Coastguard Worker  cmake_dependent_option(USE_VULKAN "Use Vulkan GPU backend" ON "ANDROID" OFF)
306*da0073e9SAndroid Build Coastguard Workerendif()
307*da0073e9SAndroid Build Coastguard Worker
308*da0073e9SAndroid Build Coastguard Workeroption(USE_SLEEF_FOR_ARM_VEC256 "Use sleef for arm" OFF)
309*da0073e9SAndroid Build Coastguard Workeroption(USE_SOURCE_DEBUG_ON_MOBILE "Enable" ON)
310*da0073e9SAndroid Build Coastguard Workeroption(USE_LITE_INTERPRETER_PROFILER "Enable" ON)
311*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
312*da0073e9SAndroid Build Coastguard Worker  USE_LITE_AOTI "Include AOTI sources" OFF
313*da0073e9SAndroid Build Coastguard Worker  "BUILD_LITE_INTERPRETER" OFF)
314*da0073e9SAndroid Build Coastguard Workeroption(USE_VULKAN_FP16_INFERENCE "Vulkan - Use fp16 inference" OFF)
315*da0073e9SAndroid Build Coastguard Workeroption(USE_VULKAN_RELAXED_PRECISION
316*da0073e9SAndroid Build Coastguard Worker       "Vulkan - Use relaxed precision math in the kernels (mediump)" OFF)
317*da0073e9SAndroid Build Coastguard Worker# option USE_XNNPACK: try to enable xnnpack by default.
318*da0073e9SAndroid Build Coastguard Workeroption(USE_XNNPACK "Use XNNPACK" ON)
319*da0073e9SAndroid Build Coastguard Workeroption(USE_ROCM_KERNEL_ASSERT "Use Kernel Assert for ROCm" OFF)
320*da0073e9SAndroid Build Coastguard Worker# Ensure that an ITT build is the default for x86 CPUs
321*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_ITT "Use Intel(R) VTune Profiler ITT functionality"
322*da0073e9SAndroid Build Coastguard Worker                       ON "CPU_INTEL" OFF)
323*da0073e9SAndroid Build Coastguard Worker# Ensure that an MKLDNN build is the default for x86 CPUs but optional for
324*da0073e9SAndroid Build Coastguard Worker# AArch64 (dependent on -DUSE_MKLDNN).
325*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
326*da0073e9SAndroid Build Coastguard Worker  USE_MKLDNN "Use MKLDNN. Only available on x86, x86_64, and AArch64."
327*da0073e9SAndroid Build Coastguard Worker  "${CPU_INTEL}" "CPU_INTEL OR CPU_AARCH64" OFF)
328*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
329*da0073e9SAndroid Build Coastguard Worker  USE_MKLDNN_ACL "Use Compute Library for the Arm architecture." OFF
330*da0073e9SAndroid Build Coastguard Worker  "USE_MKLDNN AND CPU_AARCH64" OFF)
331*da0073e9SAndroid Build Coastguard Workerset(MKLDNN_ENABLE_CONCURRENT_EXEC ${USE_MKLDNN})
332*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_MKLDNN_CBLAS "Use CBLAS in MKLDNN" OFF "USE_MKLDNN"
333*da0073e9SAndroid Build Coastguard Worker                       OFF)
334*da0073e9SAndroid Build Coastguard Workeroption(USE_STATIC_MKL "Prefer to link with MKL statically (Unix only)" OFF)
335*da0073e9SAndroid Build Coastguard Workeroption(USE_DISTRIBUTED "Use distributed" ON)
336*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
337*da0073e9SAndroid Build Coastguard Worker  USE_MPI "Use MPI for Caffe2. Only available if USE_DISTRIBUTED is on." ON
338*da0073e9SAndroid Build Coastguard Worker  "USE_DISTRIBUTED" OFF)
339*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
340*da0073e9SAndroid Build Coastguard Worker  USE_UCC "Use UCC. Only available if USE_DISTRIBUTED is on." OFF
341*da0073e9SAndroid Build Coastguard Worker  "USE_DISTRIBUTED" OFF)
342*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_SYSTEM_UCC "Use system-wide UCC" OFF "USE_UCC" OFF)
343*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_C10D_UCC "USE C10D UCC" ON "USE_DISTRIBUTED;USE_UCC"
344*da0073e9SAndroid Build Coastguard Worker                       OFF)
345*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
346*da0073e9SAndroid Build Coastguard Worker  USE_GLOO "Use Gloo. Only available if USE_DISTRIBUTED is on." ON
347*da0073e9SAndroid Build Coastguard Worker  "USE_DISTRIBUTED" OFF)
348*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
349*da0073e9SAndroid Build Coastguard Worker  USE_GLOO_WITH_OPENSSL
350*da0073e9SAndroid Build Coastguard Worker  "Use Gloo with OpenSSL. Only available if USE_GLOO is on." OFF
351*da0073e9SAndroid Build Coastguard Worker  "USE_GLOO AND LINUX AND NOT INTERN_BUILD_MOBILE" OFF)
352*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_C10D_GLOO "USE C10D GLOO" ON
353*da0073e9SAndroid Build Coastguard Worker                       "USE_DISTRIBUTED;USE_GLOO" OFF)
354*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_C10D_NCCL "USE C10D NCCL" ON
355*da0073e9SAndroid Build Coastguard Worker                       "USE_DISTRIBUTED;USE_NCCL" OFF)
356*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(USE_C10D_MPI "USE C10D MPI" ON "USE_DISTRIBUTED;USE_MPI"
357*da0073e9SAndroid Build Coastguard Worker                       OFF)
358*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
359*da0073e9SAndroid Build Coastguard Worker    USE_GLOO "Use Gloo. Only available if USE_DISTRIBUTED is on." ON
360*da0073e9SAndroid Build Coastguard Worker    "USE_DISTRIBUTED" OFF)
361*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
362*da0073e9SAndroid Build Coastguard Worker  USE_GLOO_WITH_OPENSSL "Use Gloo with OpenSSL. Only available if USE_GLOO is on." OFF
363*da0073e9SAndroid Build Coastguard Worker    "USE_GLOO AND LINUX AND NOT INTERN_BUILD_MOBILE" OFF)
364*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
365*da0073e9SAndroid Build Coastguard Worker    USE_C10D_GLOO "USE C10D GLOO" ON "USE_DISTRIBUTED;USE_GLOO" OFF)
366*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
367*da0073e9SAndroid Build Coastguard Worker    USE_C10D_NCCL "USE C10D NCCL" ON "USE_DISTRIBUTED;USE_NCCL" OFF)
368*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
369*da0073e9SAndroid Build Coastguard Worker    USE_C10D_MPI "USE C10D MPI" ON "USE_DISTRIBUTED;USE_MPI" OFF)
370*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
371*da0073e9SAndroid Build Coastguard Worker    USE_TENSORPIPE "Use TensorPipe. Only available if USE_DISTRIBUTED is on." ON
372*da0073e9SAndroid Build Coastguard Worker    "USE_DISTRIBUTED" OFF)
373*da0073e9SAndroid Build Coastguard Workeroption(ONNX_ML "Enable traditional ONNX ML API." ON)
374*da0073e9SAndroid Build Coastguard Workeroption(HAVE_SOVERSION "Whether to add SOVERSION to the shared objects" OFF)
375*da0073e9SAndroid Build Coastguard Workeroption(BUILD_LIBTORCH_CPU_WITH_DEBUG
376*da0073e9SAndroid Build Coastguard Worker       "Enable RelWithDebInfo for libtorch_cpu target only" OFF)
377*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
378*da0073e9SAndroid Build Coastguard Worker  USE_CCACHE "Attempt using CCache to wrap the compilation" ON "UNIX" OFF)
379*da0073e9SAndroid Build Coastguard Workeroption(WERROR "Build with -Werror supported by the compiler" OFF)
380*da0073e9SAndroid Build Coastguard Workeroption(
381*da0073e9SAndroid Build Coastguard Worker  DEBUG_CUDA
382*da0073e9SAndroid Build Coastguard Worker  "When compiling DEBUG, also attempt to compile CUDA with debug flags (may cause nvcc to OOM)"
383*da0073e9SAndroid Build Coastguard Worker  OFF)
384*da0073e9SAndroid Build Coastguard Workeroption(USE_COREML_DELEGATE "Use the CoreML backend through delegate APIs" OFF)
385*da0073e9SAndroid Build Coastguard Workeroption(USE_PER_OPERATOR_HEADERS
386*da0073e9SAndroid Build Coastguard Worker       "Whether ATen should generate separate headers for each operator" ON)
387*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
388*da0073e9SAndroid Build Coastguard Worker  BUILD_LAZY_TS_BACKEND
389*da0073e9SAndroid Build Coastguard Worker  "Build the lazy Torchscript backend, not compatible with mobile builds" ON
390*da0073e9SAndroid Build Coastguard Worker  "NOT INTERN_BUILD_MOBILE" OFF)
391*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(BUILD_FUNCTORCH "Build Functorch" ON "BUILD_PYTHON" OFF)
392*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(BUILD_BUNDLE_PTXAS "Bundle PTX into torch/bin fodler"
393*da0073e9SAndroid Build Coastguard Worker                       OFF "USE_CUDA" OFF)
394*da0073e9SAndroid Build Coastguard Worker
395*da0073e9SAndroid Build Coastguard Workeroption(USE_MIMALLOC "Use mimalloc" OFF)
396*da0073e9SAndroid Build Coastguard Worker# Enable third party mimalloc library to improve memory allocation performance
397*da0073e9SAndroid Build Coastguard Worker# on Windows.
398*da0073e9SAndroid Build Coastguard Workerif(WIN32)
399*da0073e9SAndroid Build Coastguard Worker  set(USE_MIMALLOC ON)
400*da0073e9SAndroid Build Coastguard Workerendif()
401*da0073e9SAndroid Build Coastguard Worker
402*da0073e9SAndroid Build Coastguard Workerif(USE_CCACHE)
403*da0073e9SAndroid Build Coastguard Worker  find_program(CCACHE_PROGRAM ccache)
404*da0073e9SAndroid Build Coastguard Worker  if(CCACHE_PROGRAM)
405*da0073e9SAndroid Build Coastguard Worker    set(CMAKE_C_COMPILER_LAUNCHER
406*da0073e9SAndroid Build Coastguard Worker        "${CCACHE_PROGRAM}"
407*da0073e9SAndroid Build Coastguard Worker        CACHE STRING "C compiler launcher")
408*da0073e9SAndroid Build Coastguard Worker    set(CMAKE_CXX_COMPILER_LAUNCHER
409*da0073e9SAndroid Build Coastguard Worker        "${CCACHE_PROGRAM}"
410*da0073e9SAndroid Build Coastguard Worker        CACHE STRING "CXX compiler launcher")
411*da0073e9SAndroid Build Coastguard Worker    set(CMAKE_CUDA_COMPILER_LAUNCHER
412*da0073e9SAndroid Build Coastguard Worker        "${CCACHE_PROGRAM}"
413*da0073e9SAndroid Build Coastguard Worker        CACHE STRING "CUDA compiler launcher")
414*da0073e9SAndroid Build Coastguard Worker  else()
415*da0073e9SAndroid Build Coastguard Worker    message(
416*da0073e9SAndroid Build Coastguard Worker      STATUS
417*da0073e9SAndroid Build Coastguard Worker        "Could not find ccache. Consider installing ccache to speed up compilation."
418*da0073e9SAndroid Build Coastguard Worker    )
419*da0073e9SAndroid Build Coastguard Worker  endif()
420*da0073e9SAndroid Build Coastguard Workerendif()
421*da0073e9SAndroid Build Coastguard Worker
422*da0073e9SAndroid Build Coastguard Worker# Since TensorPipe does not support Windows, set it to OFF when WIN32 detected
423*da0073e9SAndroid Build Coastguard Worker# On Windows platform, if user does not install libuv in build conda env and
424*da0073e9SAndroid Build Coastguard Worker# does not set libuv_ROOT environment variable. Set USE_DISTRIBUTED to OFF.
425*da0073e9SAndroid Build Coastguard Workerif(WIN32)
426*da0073e9SAndroid Build Coastguard Worker  set(USE_TENSORPIPE OFF)
427*da0073e9SAndroid Build Coastguard Worker  message(WARNING "TensorPipe cannot be used on Windows. Set it to OFF")
428*da0073e9SAndroid Build Coastguard Worker
429*da0073e9SAndroid Build Coastguard Worker  if(USE_DISTRIBUTED AND NOT DEFINED ENV{libuv_ROOT})
430*da0073e9SAndroid Build Coastguard Worker    find_library(
431*da0073e9SAndroid Build Coastguard Worker      libuv_tmp_LIBRARY
432*da0073e9SAndroid Build Coastguard Worker      NAMES uv libuv
433*da0073e9SAndroid Build Coastguard Worker      HINTS $ENV{CONDA_PREFIX}\\Library $ENV{PREFIX}\\Library
434*da0073e9SAndroid Build Coastguard Worker      PATH_SUFFIXES lib
435*da0073e9SAndroid Build Coastguard Worker      NO_DEFAULT_PATH)
436*da0073e9SAndroid Build Coastguard Worker    if(NOT libuv_tmp_LIBRARY)
437*da0073e9SAndroid Build Coastguard Worker      set(USE_DISTRIBUTED OFF)
438*da0073e9SAndroid Build Coastguard Worker      set(USE_GLOO OFF)
439*da0073e9SAndroid Build Coastguard Worker      message(
440*da0073e9SAndroid Build Coastguard Worker        WARNING
441*da0073e9SAndroid Build Coastguard Worker          "Libuv is not installed in current conda env. Set USE_DISTRIBUTED to OFF. "
442*da0073e9SAndroid Build Coastguard Worker          "Please run command 'conda install -c conda-forge libuv=1.39' to install libuv."
443*da0073e9SAndroid Build Coastguard Worker      )
444*da0073e9SAndroid Build Coastguard Worker    else()
445*da0073e9SAndroid Build Coastguard Worker      set(ENV{libuv_ROOT} ${libuv_tmp_LIBRARY}/../../)
446*da0073e9SAndroid Build Coastguard Worker    endif()
447*da0073e9SAndroid Build Coastguard Worker  endif()
448*da0073e9SAndroid Build Coastguard Workerendif()
449*da0073e9SAndroid Build Coastguard Worker
450*da0073e9SAndroid Build Coastguard Workerif(USE_GLOO_WITH_OPENSSL)
451*da0073e9SAndroid Build Coastguard Worker  set(USE_TCP_OPENSSL_LOAD
452*da0073e9SAndroid Build Coastguard Worker      ON
453*da0073e9SAndroid Build Coastguard Worker      CACHE STRING "")
454*da0073e9SAndroid Build Coastguard Workerendif()
455*da0073e9SAndroid Build Coastguard Worker
456*da0073e9SAndroid Build Coastguard Worker# Linux distributions do not want too many embedded sources, in that sense we
457*da0073e9SAndroid Build Coastguard Worker# need to be able to build pytorch with an (almost) empty third_party directory.
458*da0073e9SAndroid Build Coastguard Worker# USE_SYSTEM_LIBS is a shortcut variable to toggle all the # USE_SYSTEM_*
459*da0073e9SAndroid Build Coastguard Worker# variables on. Individual USE_SYSTEM_* variables can be toggled with
460*da0073e9SAndroid Build Coastguard Worker# USE_SYSTEM_LIBS being "OFF".
461*da0073e9SAndroid Build Coastguard Workeroption(USE_SYSTEM_LIBS "Use all available system-provided libraries." OFF)
462*da0073e9SAndroid Build Coastguard Workeroption(USE_SYSTEM_CPUINFO "Use system-provided cpuinfo." OFF)
463*da0073e9SAndroid Build Coastguard Workeroption(USE_SYSTEM_SLEEF "Use system-provided sleef." OFF)
464*da0073e9SAndroid Build Coastguard Workeroption(USE_SYSTEM_GLOO "Use system-provided gloo." OFF)
465*da0073e9SAndroid Build Coastguard Workeroption(USE_SYSTEM_FP16 "Use system-provided fp16." OFF)
466*da0073e9SAndroid Build Coastguard Workeroption(USE_SYSTEM_PYBIND11 "Use system-provided PyBind11." OFF)
467*da0073e9SAndroid Build Coastguard Workeroption(USE_SYSTEM_PTHREADPOOL "Use system-provided pthreadpool." OFF)
468*da0073e9SAndroid Build Coastguard Workeroption(USE_SYSTEM_PSIMD "Use system-provided psimd." OFF)
469*da0073e9SAndroid Build Coastguard Workeroption(USE_SYSTEM_FXDIV "Use system-provided fxdiv." OFF)
470*da0073e9SAndroid Build Coastguard Workeroption(USE_SYSTEM_BENCHMARK "Use system-provided google benchmark." OFF)
471*da0073e9SAndroid Build Coastguard Workeroption(USE_SYSTEM_ONNX "Use system-provided onnx." OFF)
472*da0073e9SAndroid Build Coastguard Workeroption(USE_SYSTEM_XNNPACK "Use system-provided xnnpack." OFF)
473*da0073e9SAndroid Build Coastguard Workeroption(USE_GOLD_LINKER "Use ld.gold to link" OFF)
474*da0073e9SAndroid Build Coastguard Workerif(USE_SYSTEM_LIBS)
475*da0073e9SAndroid Build Coastguard Worker  set(USE_SYSTEM_CPUINFO ON)
476*da0073e9SAndroid Build Coastguard Worker  set(USE_SYSTEM_SLEEF ON)
477*da0073e9SAndroid Build Coastguard Worker  set(USE_SYSTEM_GLOO ON)
478*da0073e9SAndroid Build Coastguard Worker  set(BUILD_CUSTOM_PROTOBUF OFF)
479*da0073e9SAndroid Build Coastguard Worker  set(USE_SYSTEM_EIGEN_INSTALL ON)
480*da0073e9SAndroid Build Coastguard Worker  set(USE_SYSTEM_FP16 ON)
481*da0073e9SAndroid Build Coastguard Worker  set(USE_SYSTEM_PTHREADPOOL ON)
482*da0073e9SAndroid Build Coastguard Worker  set(USE_SYSTEM_PSIMD ON)
483*da0073e9SAndroid Build Coastguard Worker  set(USE_SYSTEM_FXDIV ON)
484*da0073e9SAndroid Build Coastguard Worker  set(USE_SYSTEM_BENCHMARK ON)
485*da0073e9SAndroid Build Coastguard Worker  set(USE_SYSTEM_ONNX ON)
486*da0073e9SAndroid Build Coastguard Worker  set(USE_SYSTEM_XNNPACK ON)
487*da0073e9SAndroid Build Coastguard Worker  set(USE_SYSTEM_PYBIND11 ON)
488*da0073e9SAndroid Build Coastguard Worker  if(USE_NCCL)
489*da0073e9SAndroid Build Coastguard Worker    set(USE_SYSTEM_NCCL ON)
490*da0073e9SAndroid Build Coastguard Worker  endif()
491*da0073e9SAndroid Build Coastguard Workerendif()
492*da0073e9SAndroid Build Coastguard Worker
493*da0073e9SAndroid Build Coastguard Worker# /Z7 override option When generating debug symbols, CMake default to use the
494*da0073e9SAndroid Build Coastguard Worker# flag /Zi. However, it is not compatible with sccache. So we rewrite it off.
495*da0073e9SAndroid Build Coastguard Worker# But some users don't use sccache; this override is for them.
496*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
497*da0073e9SAndroid Build Coastguard Worker  MSVC_Z7_OVERRIDE
498*da0073e9SAndroid Build Coastguard Worker  "Work around sccache bug by replacing /Zi and /ZI with /Z7 when using MSVC (if you are not using sccache, you can turn this OFF)"
499*da0073e9SAndroid Build Coastguard Worker  ON
500*da0073e9SAndroid Build Coastguard Worker  "MSVC"
501*da0073e9SAndroid Build Coastguard Worker  OFF)
502*da0073e9SAndroid Build Coastguard Worker
503*da0073e9SAndroid Build Coastguard Workerif(NOT USE_SYSTEM_ONNX)
504*da0073e9SAndroid Build Coastguard Worker  set(ONNX_NAMESPACE
505*da0073e9SAndroid Build Coastguard Worker      "onnx_torch"
506*da0073e9SAndroid Build Coastguard Worker      CACHE
507*da0073e9SAndroid Build Coastguard Worker        STRING
508*da0073e9SAndroid Build Coastguard Worker        "A namespace for ONNX; needed to build with other frameworks that share ONNX."
509*da0073e9SAndroid Build Coastguard Worker  )
510*da0073e9SAndroid Build Coastguard Workerelse()
511*da0073e9SAndroid Build Coastguard Worker  set(ONNX_NAMESPACE
512*da0073e9SAndroid Build Coastguard Worker      "onnx"
513*da0073e9SAndroid Build Coastguard Worker      CACHE
514*da0073e9SAndroid Build Coastguard Worker        STRING
515*da0073e9SAndroid Build Coastguard Worker        "A namespace for ONNX; needed to build with other frameworks that share ONNX."
516*da0073e9SAndroid Build Coastguard Worker  )
517*da0073e9SAndroid Build Coastguard Workerendif()
518*da0073e9SAndroid Build Coastguard Workerset(SELECTED_OP_LIST
519*da0073e9SAndroid Build Coastguard Worker    ""
520*da0073e9SAndroid Build Coastguard Worker    CACHE
521*da0073e9SAndroid Build Coastguard Worker      STRING
522*da0073e9SAndroid Build Coastguard Worker      "Path to the yaml file that contains the list of operators to include for custom build. Include all operators by default."
523*da0073e9SAndroid Build Coastguard Worker)
524*da0073e9SAndroid Build Coastguard Workeroption(
525*da0073e9SAndroid Build Coastguard Worker  STATIC_DISPATCH_BACKEND
526*da0073e9SAndroid Build Coastguard Worker  "Name of the backend for which static dispatch code is generated, e.g.: CPU."
527*da0073e9SAndroid Build Coastguard Worker  "")
528*da0073e9SAndroid Build Coastguard Workeroption(
529*da0073e9SAndroid Build Coastguard Worker  USE_LIGHTWEIGHT_DISPATCH
530*da0073e9SAndroid Build Coastguard Worker  "Enable codegen unboxing for ATen ops, need to work with static dispatch in order to work properly."
531*da0073e9SAndroid Build Coastguard Worker  OFF)
532*da0073e9SAndroid Build Coastguard Workerif(USE_LIGHTWEIGHT_DISPATCH AND NOT STATIC_DISPATCH_BACKEND)
533*da0073e9SAndroid Build Coastguard Worker  message(
534*da0073e9SAndroid Build Coastguard Worker    FATAL_ERROR
535*da0073e9SAndroid Build Coastguard Worker      "Need to enable static dispatch after enabling USE_LIGHTWEIGHT_DISPATCH.")
536*da0073e9SAndroid Build Coastguard Workerendif()
537*da0073e9SAndroid Build Coastguard Workeroption(TRACING_BASED
538*da0073e9SAndroid Build Coastguard Worker       "Master flag to build Lite Interpreter with tracing build option" OFF)
539*da0073e9SAndroid Build Coastguard Workeroption(BUILD_EXECUTORCH "Master flag to build Executorch" ON)
540*da0073e9SAndroid Build Coastguard Worker# This is a fix for a rare build issue on Ubuntu: symbol lookup error:
541*da0073e9SAndroid Build Coastguard Worker# miniconda3/envs/pytorch-py3.7/lib/libmkl_intel_lp64.so: undefined symbol:
542*da0073e9SAndroid Build Coastguard Worker# mkl_blas_dsyrk
543*da0073e9SAndroid Build Coastguard Worker# https://software.intel.com/en-us/articles/symbol-lookup-error-when-linking-intel-mkl-with-gcc-on-ubuntu
544*da0073e9SAndroid Build Coastguard Workerif(LINUX)
545*da0073e9SAndroid Build Coastguard Worker  set(CMAKE_SHARED_LINKER_FLAGS
546*da0073e9SAndroid Build Coastguard Worker      "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-as-needed")
547*da0073e9SAndroid Build Coastguard Worker
548*da0073e9SAndroid Build Coastguard Worker  set(ENV_LDFLAGS "$ENV{LDFLAGS}")
549*da0073e9SAndroid Build Coastguard Worker  string(STRIP "${ENV_LDFLAGS}" ENV_LDFLAGS)
550*da0073e9SAndroid Build Coastguard Worker  # Do not append linker flags passed via env var if they already there
551*da0073e9SAndroid Build Coastguard Worker  if(NOT ${CMAKE_SHARED_LINKER_FLAGS} MATCHES "${ENV_LDFLAGS}")
552*da0073e9SAndroid Build Coastguard Worker     set(CMAKE_SHARED_LINKER_FLAGS
553*da0073e9SAndroid Build Coastguard Worker         "${CMAKE_SHARED_LINKER_FLAGS} ${ENV_LDFLAGS}")
554*da0073e9SAndroid Build Coastguard Worker  endif()
555*da0073e9SAndroid Build Coastguard Workerendif()
556*da0073e9SAndroid Build Coastguard Worker
557*da0073e9SAndroid Build Coastguard Workerif(MSVC)
558*da0073e9SAndroid Build Coastguard Worker  # MSVC by default does not apply the correct __cplusplus version as specified
559*da0073e9SAndroid Build Coastguard Worker  # by the C++ standard because MSVC is not a completely compliant
560*da0073e9SAndroid Build Coastguard Worker  # implementation. This option forces MSVC to use the appropriate value given
561*da0073e9SAndroid Build Coastguard Worker  # the requested --std option. This fixes a compilation issue mismatch between
562*da0073e9SAndroid Build Coastguard Worker  # GCC/Clang and MSVC.
563*da0073e9SAndroid Build Coastguard Worker  #
564*da0073e9SAndroid Build Coastguard Worker  # See: *
565*da0073e9SAndroid Build Coastguard Worker  # https://learn.microsoft.com/en-us/cpp/build/reference/zc-cplusplus?view=msvc-170
566*da0073e9SAndroid Build Coastguard Worker  # * https://en.cppreference.com/w/cpp/preprocessor/replace#Predefined_macros
567*da0073e9SAndroid Build Coastguard Worker  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:__cplusplus")
568*da0073e9SAndroid Build Coastguard Worker  set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler  /Zc:__cplusplus")
569*da0073e9SAndroid Build Coastguard Worker
570*da0073e9SAndroid Build Coastguard Worker  set(CMAKE_NINJA_CMCLDEPS_RC OFF)
571*da0073e9SAndroid Build Coastguard Worker  foreach(
572*da0073e9SAndroid Build Coastguard Worker    flag_var
573*da0073e9SAndroid Build Coastguard Worker    CMAKE_C_FLAGS
574*da0073e9SAndroid Build Coastguard Worker    CMAKE_C_FLAGS_DEBUG
575*da0073e9SAndroid Build Coastguard Worker    CMAKE_C_FLAGS_RELEASE
576*da0073e9SAndroid Build Coastguard Worker    CMAKE_C_FLAGS_MINSIZEREL
577*da0073e9SAndroid Build Coastguard Worker    CMAKE_C_FLAGS_RELWITHDEBINFO
578*da0073e9SAndroid Build Coastguard Worker    CMAKE_CXX_FLAGS
579*da0073e9SAndroid Build Coastguard Worker    CMAKE_CXX_FLAGS_DEBUG
580*da0073e9SAndroid Build Coastguard Worker    CMAKE_CXX_FLAGS_RELEASE
581*da0073e9SAndroid Build Coastguard Worker    CMAKE_CXX_FLAGS_MINSIZEREL
582*da0073e9SAndroid Build Coastguard Worker    CMAKE_CXX_FLAGS_RELWITHDEBINFO)
583*da0073e9SAndroid Build Coastguard Worker    # Replace /Zi and /ZI with /Z7
584*da0073e9SAndroid Build Coastguard Worker    if(MSVC_Z7_OVERRIDE)
585*da0073e9SAndroid Build Coastguard Worker      if(${flag_var} MATCHES "/Z[iI]")
586*da0073e9SAndroid Build Coastguard Worker        string(REGEX REPLACE "/Z[iI]" "/Z7" ${flag_var} "${${flag_var}}")
587*da0073e9SAndroid Build Coastguard Worker      endif(${flag_var} MATCHES "/Z[iI]")
588*da0073e9SAndroid Build Coastguard Worker    endif(MSVC_Z7_OVERRIDE)
589*da0073e9SAndroid Build Coastguard Worker
590*da0073e9SAndroid Build Coastguard Worker    if(${CAFFE2_USE_MSVC_STATIC_RUNTIME})
591*da0073e9SAndroid Build Coastguard Worker      if(${flag_var} MATCHES "/MD")
592*da0073e9SAndroid Build Coastguard Worker        string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
593*da0073e9SAndroid Build Coastguard Worker      endif(${flag_var} MATCHES "/MD")
594*da0073e9SAndroid Build Coastguard Worker    else()
595*da0073e9SAndroid Build Coastguard Worker      if(${flag_var} MATCHES "/MT")
596*da0073e9SAndroid Build Coastguard Worker        string(REGEX REPLACE "/MT" "/MD" ${flag_var} "${${flag_var}}")
597*da0073e9SAndroid Build Coastguard Worker      endif()
598*da0073e9SAndroid Build Coastguard Worker    endif()
599*da0073e9SAndroid Build Coastguard Worker
600*da0073e9SAndroid Build Coastguard Worker    # /bigobj increases number of sections in .obj file, which is needed to link
601*da0073e9SAndroid Build Coastguard Worker    # against libraries in Python 2.7 under Windows For Visual Studio
602*da0073e9SAndroid Build Coastguard Worker    # generators, if /MP is not added, then we may need to add /MP to the flags.
603*da0073e9SAndroid Build Coastguard Worker    # For other generators like ninja, we don't need to add /MP because it is
604*da0073e9SAndroid Build Coastguard Worker    # already handled by the generator itself.
605*da0073e9SAndroid Build Coastguard Worker    if(CMAKE_GENERATOR MATCHES "Visual Studio" AND NOT ${flag_var} MATCHES
606*da0073e9SAndroid Build Coastguard Worker                                                   "/MP")
607*da0073e9SAndroid Build Coastguard Worker      set(${flag_var} "${${flag_var}} /MP /bigobj")
608*da0073e9SAndroid Build Coastguard Worker    else()
609*da0073e9SAndroid Build Coastguard Worker      set(${flag_var} "${${flag_var}} /bigobj")
610*da0073e9SAndroid Build Coastguard Worker    endif()
611*da0073e9SAndroid Build Coastguard Worker  endforeach(flag_var)
612*da0073e9SAndroid Build Coastguard Worker
613*da0073e9SAndroid Build Coastguard Worker  foreach(flag_var
614*da0073e9SAndroid Build Coastguard Worker          CMAKE_C_FLAGS CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL
615*da0073e9SAndroid Build Coastguard Worker          CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL)
616*da0073e9SAndroid Build Coastguard Worker    if(${flag_var} MATCHES "/Z[iI7]")
617*da0073e9SAndroid Build Coastguard Worker      string(REGEX REPLACE "/Z[iI7]" "" ${flag_var} "${${flag_var}}")
618*da0073e9SAndroid Build Coastguard Worker    endif()
619*da0073e9SAndroid Build Coastguard Worker  endforeach(flag_var)
620*da0073e9SAndroid Build Coastguard Worker
621*da0073e9SAndroid Build Coastguard Worker  foreach(
622*da0073e9SAndroid Build Coastguard Worker    flag_var
623*da0073e9SAndroid Build Coastguard Worker    CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO
624*da0073e9SAndroid Build Coastguard Worker    CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO
625*da0073e9SAndroid Build Coastguard Worker    CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO
626*da0073e9SAndroid Build Coastguard Worker    CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO
627*da0073e9SAndroid Build Coastguard Worker    CMAKE_SHARED_LINKER_FLAGS_DEBUG
628*da0073e9SAndroid Build Coastguard Worker    CMAKE_STATIC_LINKER_FLAGS_DEBUG
629*da0073e9SAndroid Build Coastguard Worker    CMAKE_EXE_LINKER_FLAGS_DEBUG
630*da0073e9SAndroid Build Coastguard Worker    CMAKE_MODULE_LINKER_FLAGS_DEBUG)
631*da0073e9SAndroid Build Coastguard Worker    # Switch off incremental linking in debug/relwithdebinfo builds
632*da0073e9SAndroid Build Coastguard Worker    if(${flag_var} MATCHES "/INCREMENTAL" AND NOT ${flag_var} MATCHES
633*da0073e9SAndroid Build Coastguard Worker                                              "/INCREMENTAL:NO")
634*da0073e9SAndroid Build Coastguard Worker      string(REGEX REPLACE "/INCREMENTAL" "/INCREMENTAL:NO" ${flag_var}
635*da0073e9SAndroid Build Coastguard Worker                           "${${flag_var}}")
636*da0073e9SAndroid Build Coastguard Worker    endif()
637*da0073e9SAndroid Build Coastguard Worker  endforeach(flag_var)
638*da0073e9SAndroid Build Coastguard Worker
639*da0073e9SAndroid Build Coastguard Worker  foreach(flag_var CMAKE_SHARED_LINKER_FLAGS CMAKE_STATIC_LINKER_FLAGS
640*da0073e9SAndroid Build Coastguard Worker                   CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS)
641*da0073e9SAndroid Build Coastguard Worker    string(APPEND ${flag_var} " /ignore:4049 /ignore:4217 /ignore:4099")
642*da0073e9SAndroid Build Coastguard Worker  endforeach(flag_var)
643*da0073e9SAndroid Build Coastguard Worker
644*da0073e9SAndroid Build Coastguard Worker  foreach(flag_var CMAKE_SHARED_LINKER_FLAGS)
645*da0073e9SAndroid Build Coastguard Worker    # https://github.com/pytorch/pytorch/issues/91933: Don't set the manifest
646*da0073e9SAndroid Build Coastguard Worker    # filename explicitly helps fix the linker error when linking
647*da0073e9SAndroid Build Coastguard Worker    # torch_python.dll. The manifest file would still be there in the correct
648*da0073e9SAndroid Build Coastguard Worker    # format torch_python.dll.manifest
649*da0073e9SAndroid Build Coastguard Worker    if(${flag_var} MATCHES "/MANIFESTFILE:.*\\.manifest")
650*da0073e9SAndroid Build Coastguard Worker      string(REGEX REPLACE "/MANIFESTFILE:.*\\.manifest" "" ${flag_var}
651*da0073e9SAndroid Build Coastguard Worker                           "${${flag_var}}")
652*da0073e9SAndroid Build Coastguard Worker    endif()
653*da0073e9SAndroid Build Coastguard Worker  endforeach(flag_var)
654*da0073e9SAndroid Build Coastguard Worker
655*da0073e9SAndroid Build Coastguard Worker  # Try harder
656*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CUDA_FLAGS " -Xcompiler /w -w")
657*da0073e9SAndroid Build Coastguard Worker
658*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " /FS")
659*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CUDA_FLAGS " -Xcompiler /FS")
660*da0073e9SAndroid Build Coastguard Workerendif(MSVC)
661*da0073e9SAndroid Build Coastguard Worker
662*da0073e9SAndroid Build Coastguard Workerstring(APPEND CMAKE_CUDA_FLAGS " -Xfatbin -compress-all")
663*da0073e9SAndroid Build Coastguard Worker
664*da0073e9SAndroid Build Coastguard Worker# Set INTERN_BUILD_MOBILE for all mobile builds. Components that are not
665*da0073e9SAndroid Build Coastguard Worker# applicable to mobile are disabled by this variable. Setting
666*da0073e9SAndroid Build Coastguard Worker# `BUILD_PYTORCH_MOBILE_WITH_HOST_TOOLCHAIN` environment variable can force it
667*da0073e9SAndroid Build Coastguard Worker# to do mobile build with host toolchain - which is useful for testing purpose.
668*da0073e9SAndroid Build Coastguard Workerif(ANDROID
669*da0073e9SAndroid Build Coastguard Worker   OR IOS
670*da0073e9SAndroid Build Coastguard Worker   OR DEFINED ENV{BUILD_PYTORCH_MOBILE_WITH_HOST_TOOLCHAIN})
671*da0073e9SAndroid Build Coastguard Worker  set(INTERN_BUILD_MOBILE ON)
672*da0073e9SAndroid Build Coastguard Worker  message(WARNING "INTERN_BUILD_MOBILE is on, disabling BUILD_LAZY_TS_BACKEND")
673*da0073e9SAndroid Build Coastguard Worker  set(BUILD_LAZY_TS_BACKEND OFF)
674*da0073e9SAndroid Build Coastguard Worker
675*da0073e9SAndroid Build Coastguard Worker  # Set -ffunction-sections and -fdata-sections so that each method has its own
676*da0073e9SAndroid Build Coastguard Worker  # text section. This allows the linker to remove unused section when the flag
677*da0073e9SAndroid Build Coastguard Worker  # -Wl,-gc-sections is provided at link time.
678*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -ffunction-sections")
679*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_C_FLAGS " -ffunction-sections")
680*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -fdata-sections")
681*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_C_FLAGS " -fdata-sections")
682*da0073e9SAndroid Build Coastguard Worker
683*da0073e9SAndroid Build Coastguard Worker  # Please note that the use of the following flags is required when linking
684*da0073e9SAndroid Build Coastguard Worker  # against libtorch_cpu.a for mobile builds. -Wl,--whole-archive -ltorch_cpu
685*da0073e9SAndroid Build Coastguard Worker  # -Wl,--no-whole-archive
686*da0073e9SAndroid Build Coastguard Worker  #
687*da0073e9SAndroid Build Coastguard Worker  # This allows global constructors to be included and run. Global constructors
688*da0073e9SAndroid Build Coastguard Worker  # are used for operator/kernel registration with the PyTorch Dispatcher.
689*da0073e9SAndroid Build Coastguard Worker
690*da0073e9SAndroid Build Coastguard Worker  if(DEFINED ENV{BUILD_PYTORCH_MOBILE_WITH_HOST_TOOLCHAIN})
691*da0073e9SAndroid Build Coastguard Worker    # C10_MOBILE is derived from Android/iOS toolchain macros in
692*da0073e9SAndroid Build Coastguard Worker    # c10/macros/Macros.h, so it needs to be explicitly set here.
693*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -DC10_MOBILE")
694*da0073e9SAndroid Build Coastguard Worker  endif()
695*da0073e9SAndroid Build Coastguard Worker
696*da0073e9SAndroid Build Coastguard Worker  if(DEFINED ENV{PYTORCH_MOBILE_TRIM_DISPATCH_KEY_SET})
697*da0073e9SAndroid Build Coastguard Worker    # If PYTORCH_MOBILE_TRIM_DISPATCH_KEY_SET is defined (env var), then define
698*da0073e9SAndroid Build Coastguard Worker    # C10_MOBILE_TRIM_DISPATCH_KEYS, which limits the number of dispatch keys in
699*da0073e9SAndroid Build Coastguard Worker    # OperatorEntry::dispatchTable_ to reduce peak memory during library
700*da0073e9SAndroid Build Coastguard Worker    # initialization.
701*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -DC10_MOBILE_TRIM_DISPATCH_KEYS")
702*da0073e9SAndroid Build Coastguard Worker  endif()
703*da0073e9SAndroid Build Coastguard Workerendif()
704*da0073e9SAndroid Build Coastguard Worker
705*da0073e9SAndroid Build Coastguard Worker# INTERN_BUILD_ATEN_OPS is used to control whether to build ATen/TH operators.
706*da0073e9SAndroid Build Coastguard Workerset(INTERN_BUILD_ATEN_OPS ON)
707*da0073e9SAndroid Build Coastguard Worker
708*da0073e9SAndroid Build Coastguard Workerif(NOT DEFINED USE_BLAS)
709*da0073e9SAndroid Build Coastguard Worker  set(USE_BLAS ON)
710*da0073e9SAndroid Build Coastguard Workerendif()
711*da0073e9SAndroid Build Coastguard Worker
712*da0073e9SAndroid Build Coastguard Worker# Build libtorch mobile library, which contains ATen/TH ops and native support
713*da0073e9SAndroid Build Coastguard Worker# for TorchScript model, but doesn't contain not-yet-unified caffe2 ops;
714*da0073e9SAndroid Build Coastguard Workerif(INTERN_BUILD_MOBILE)
715*da0073e9SAndroid Build Coastguard Worker  if(NOT BUILD_SHARED_LIBS AND NOT "${SELECTED_OP_LIST}" STREQUAL "")
716*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -DNO_EXPORT")
717*da0073e9SAndroid Build Coastguard Worker  endif()
718*da0073e9SAndroid Build Coastguard Worker  if(BUILD_MOBILE_AUTOGRAD)
719*da0073e9SAndroid Build Coastguard Worker    set(INTERN_DISABLE_AUTOGRAD OFF)
720*da0073e9SAndroid Build Coastguard Worker  else()
721*da0073e9SAndroid Build Coastguard Worker    set(INTERN_DISABLE_AUTOGRAD ON)
722*da0073e9SAndroid Build Coastguard Worker  endif()
723*da0073e9SAndroid Build Coastguard Worker  set(BUILD_PYTHON OFF)
724*da0073e9SAndroid Build Coastguard Worker  set(BUILD_FUNCTORCH OFF)
725*da0073e9SAndroid Build Coastguard Worker  set(USE_DISTRIBUTED OFF)
726*da0073e9SAndroid Build Coastguard Worker  set(NO_API ON)
727*da0073e9SAndroid Build Coastguard Worker  set(USE_FBGEMM OFF)
728*da0073e9SAndroid Build Coastguard Worker  set(INTERN_DISABLE_ONNX ON)
729*da0073e9SAndroid Build Coastguard Worker  if(USE_BLAS)
730*da0073e9SAndroid Build Coastguard Worker    set(INTERN_USE_EIGEN_BLAS ON)
731*da0073e9SAndroid Build Coastguard Worker  else()
732*da0073e9SAndroid Build Coastguard Worker    set(INTERN_USE_EIGEN_BLAS OFF)
733*da0073e9SAndroid Build Coastguard Worker  endif()
734*da0073e9SAndroid Build Coastguard Worker  # Disable developing mobile interpreter for actual mobile build. Enable it
735*da0073e9SAndroid Build Coastguard Worker  # elsewhere to capture build error.
736*da0073e9SAndroid Build Coastguard Worker  set(INTERN_DISABLE_MOBILE_INTERP ON)
737*da0073e9SAndroid Build Coastguard Workerendif()
738*da0073e9SAndroid Build Coastguard Worker
739*da0073e9SAndroid Build Coastguard Worker# ---[ Version numbers for generated libraries
740*da0073e9SAndroid Build Coastguard Workerfile(READ version.txt TORCH_DEFAULT_VERSION)
741*da0073e9SAndroid Build Coastguard Worker# Strip trailing newline
742*da0073e9SAndroid Build Coastguard Workerstring(REGEX REPLACE "\n$" "" TORCH_DEFAULT_VERSION "${TORCH_DEFAULT_VERSION}")
743*da0073e9SAndroid Build Coastguard Workerif("${TORCH_DEFAULT_VERSION} " STREQUAL " ")
744*da0073e9SAndroid Build Coastguard Worker  message(WARNING "Could not get version from base 'version.txt'")
745*da0073e9SAndroid Build Coastguard Worker  # If we can't get the version from the version file we should probably set it
746*da0073e9SAndroid Build Coastguard Worker  # to something non-sensical like 0.0.0
747*da0073e9SAndroid Build Coastguard Worker  set(TORCH_DEFAULT_VERSION, "0.0.0")
748*da0073e9SAndroid Build Coastguard Workerendif()
749*da0073e9SAndroid Build Coastguard Workerset(TORCH_BUILD_VERSION
750*da0073e9SAndroid Build Coastguard Worker    "${TORCH_DEFAULT_VERSION}"
751*da0073e9SAndroid Build Coastguard Worker    CACHE STRING "Torch build version")
752*da0073e9SAndroid Build Coastguard Workerif(DEFINED ENV{PYTORCH_BUILD_VERSION})
753*da0073e9SAndroid Build Coastguard Worker  set(TORCH_BUILD_VERSION
754*da0073e9SAndroid Build Coastguard Worker      "$ENV{PYTORCH_BUILD_VERSION}"
755*da0073e9SAndroid Build Coastguard Worker      CACHE STRING "Torch build version" FORCE)
756*da0073e9SAndroid Build Coastguard Workerendif()
757*da0073e9SAndroid Build Coastguard Workerif(NOT TORCH_BUILD_VERSION)
758*da0073e9SAndroid Build Coastguard Worker  # An empty string was specified so force version to the default
759*da0073e9SAndroid Build Coastguard Worker  set(TORCH_BUILD_VERSION
760*da0073e9SAndroid Build Coastguard Worker      "${TORCH_DEFAULT_VERSION}"
761*da0073e9SAndroid Build Coastguard Worker      CACHE STRING "Torch build version" FORCE)
762*da0073e9SAndroid Build Coastguard Workerendif()
763*da0073e9SAndroid Build Coastguard Workercaffe2_parse_version_str(TORCH ${TORCH_BUILD_VERSION})
764*da0073e9SAndroid Build Coastguard Workerset(TORCH_SOVERSION "${TORCH_VERSION_MAJOR}.${TORCH_VERSION_MINOR}")
765*da0073e9SAndroid Build Coastguard Worker
766*da0073e9SAndroid Build Coastguard Worker# ---[ CMake scripts + modules
767*da0073e9SAndroid Build Coastguard Workerlist(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules)
768*da0073e9SAndroid Build Coastguard Worker
769*da0073e9SAndroid Build Coastguard Worker# ---[ CMake build directories
770*da0073e9SAndroid Build Coastguard Workerset(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
771*da0073e9SAndroid Build Coastguard Workerset(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
772*da0073e9SAndroid Build Coastguard Workerset(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
773*da0073e9SAndroid Build Coastguard Worker
774*da0073e9SAndroid Build Coastguard Workerenable_testing()
775*da0073e9SAndroid Build Coastguard Worker
776*da0073e9SAndroid Build Coastguard Worker# ---[ Build variables set within the cmake tree
777*da0073e9SAndroid Build Coastguard Workerinclude(cmake/BuildVariables.cmake)
778*da0073e9SAndroid Build Coastguard Workerset(CAFFE2_ALLOWLIST
779*da0073e9SAndroid Build Coastguard Worker    ""
780*da0073e9SAndroid Build Coastguard Worker    CACHE STRING "A allowlist file of files that one should build.")
781*da0073e9SAndroid Build Coastguard Worker
782*da0073e9SAndroid Build Coastguard Worker# Set default build type
783*da0073e9SAndroid Build Coastguard Workerif(NOT CMAKE_BUILD_TYPE)
784*da0073e9SAndroid Build Coastguard Worker  message(STATUS "Build type not set - defaulting to Release")
785*da0073e9SAndroid Build Coastguard Worker  set(CMAKE_BUILD_TYPE
786*da0073e9SAndroid Build Coastguard Worker      "Release"
787*da0073e9SAndroid Build Coastguard Worker      CACHE
788*da0073e9SAndroid Build Coastguard Worker        STRING
789*da0073e9SAndroid Build Coastguard Worker        "Choose the type of build from: Debug Release RelWithDebInfo MinSizeRel Coverage."
790*da0073e9SAndroid Build Coastguard Worker        FORCE)
791*da0073e9SAndroid Build Coastguard Workerendif()
792*da0073e9SAndroid Build Coastguard Worker
793*da0073e9SAndroid Build Coastguard Worker# The below means we are cross compiling for arm64 or x86_64 on MacOSX
794*da0073e9SAndroid Build Coastguard Workerif(NOT IOS
795*da0073e9SAndroid Build Coastguard Worker   AND CMAKE_SYSTEM_NAME STREQUAL "Darwin"
796*da0073e9SAndroid Build Coastguard Worker   AND CMAKE_OSX_ARCHITECTURES MATCHES "^(x86_64|arm64)$")
797*da0073e9SAndroid Build Coastguard Worker  set(CROSS_COMPILING_MACOSX TRUE)
798*da0073e9SAndroid Build Coastguard Worker  # We need to compile a universal protoc to not fail protobuf build We set
799*da0073e9SAndroid Build Coastguard Worker  # CMAKE_TRY_COMPILE_TARGET_TYPE to STATIC_LIBRARY (vs executable) to succeed
800*da0073e9SAndroid Build Coastguard Worker  # the cmake compiler check for cross-compiling
801*da0073e9SAndroid Build Coastguard Worker  set(protoc_build_command
802*da0073e9SAndroid Build Coastguard Worker      "./scripts/build_host_protoc.sh --other-flags -DCMAKE_OSX_ARCHITECTURES=\"x86_64;arm64\" -DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY -DCMAKE_C_COMPILER_WORKS=1 -DCMAKE_CXX_COMPILER_WORKS=1"
803*da0073e9SAndroid Build Coastguard Worker  )
804*da0073e9SAndroid Build Coastguard Worker  # We write to a temp scriptfile because CMake COMMAND dislikes double quotes
805*da0073e9SAndroid Build Coastguard Worker  # in commands
806*da0073e9SAndroid Build Coastguard Worker  file(WRITE ${PROJECT_SOURCE_DIR}/tmp_protoc_script.sh
807*da0073e9SAndroid Build Coastguard Worker       "#!/bin/bash\n${protoc_build_command}")
808*da0073e9SAndroid Build Coastguard Worker  file(
809*da0073e9SAndroid Build Coastguard Worker    COPY ${PROJECT_SOURCE_DIR}/tmp_protoc_script.sh
810*da0073e9SAndroid Build Coastguard Worker    DESTINATION ${PROJECT_SOURCE_DIR}/scripts/
811*da0073e9SAndroid Build Coastguard Worker    FILE_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ)
812*da0073e9SAndroid Build Coastguard Worker  execute_process(
813*da0073e9SAndroid Build Coastguard Worker    COMMAND ./scripts/tmp_protoc_script.sh
814*da0073e9SAndroid Build Coastguard Worker    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
815*da0073e9SAndroid Build Coastguard Worker    RESULT_VARIABLE BUILD_HOST_PROTOC_RESULT)
816*da0073e9SAndroid Build Coastguard Worker  file(REMOVE ${PROJECT_SOURCE_DIR}/tmp_protoc_script.sh
817*da0073e9SAndroid Build Coastguard Worker       ${PROJECT_SOURCE_DIR}/scripts/tmp_protoc_script.sh)
818*da0073e9SAndroid Build Coastguard Worker  if(NOT BUILD_HOST_PROTOC_RESULT EQUAL "0")
819*da0073e9SAndroid Build Coastguard Worker    message(FATAL_ERROR "Could not compile universal protoc.")
820*da0073e9SAndroid Build Coastguard Worker  endif()
821*da0073e9SAndroid Build Coastguard Worker  set(PROTOBUF_PROTOC_EXECUTABLE
822*da0073e9SAndroid Build Coastguard Worker      "${PROJECT_SOURCE_DIR}/build_host_protoc/bin/protoc")
823*da0073e9SAndroid Build Coastguard Worker  set(CAFFE2_CUSTOM_PROTOC_EXECUTABLE
824*da0073e9SAndroid Build Coastguard Worker      "${PROJECT_SOURCE_DIR}/build_host_protoc/bin/protoc")
825*da0073e9SAndroid Build Coastguard Workerendif()
826*da0073e9SAndroid Build Coastguard Worker
827*da0073e9SAndroid Build Coastguard Worker# ---[ Misc checks to cope with various compiler modes
828*da0073e9SAndroid Build Coastguard Workerinclude(cmake/MiscCheck.cmake)
829*da0073e9SAndroid Build Coastguard Worker
830*da0073e9SAndroid Build Coastguard Worker# External projects
831*da0073e9SAndroid Build Coastguard Workerinclude(ExternalProject)
832*da0073e9SAndroid Build Coastguard Worker
833*da0073e9SAndroid Build Coastguard Worker# ---[ Dependencies ---[ FBGEMM doesn't work on x86 32bit and
834*da0073e9SAndroid Build Coastguard Worker# CMAKE_SYSTEM_PROCESSOR thinks its 64bit
835*da0073e9SAndroid Build Coastguard Workerif(USE_FBGEMM
836*da0073e9SAndroid Build Coastguard Worker   AND((CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND CMAKE_SIZEOF_VOID_P EQUAL
837*da0073e9SAndroid Build Coastguard Worker                                                      4)
838*da0073e9SAndroid Build Coastguard Worker        OR CMAKE_SYSTEM_PROCESSOR STREQUAL "x86"))
839*da0073e9SAndroid Build Coastguard Worker  set(USE_FBGEMM OFF)
840*da0073e9SAndroid Build Coastguard Workerendif()
841*da0073e9SAndroid Build Coastguard Worker
842*da0073e9SAndroid Build Coastguard Workerset(BUILD_ONEDNN_GRAPH OFF)
843*da0073e9SAndroid Build Coastguard Worker
844*da0073e9SAndroid Build Coastguard Workerif(MSVC)
845*da0073e9SAndroid Build Coastguard Worker  # The source code is in utf-8 encoding
846*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("/utf-8" CMAKE_CXX_FLAGS)
847*da0073e9SAndroid Build Coastguard Workerendif()
848*da0073e9SAndroid Build Coastguard Worker
849*da0073e9SAndroid Build Coastguard Worker# Note for ROCM platform: 1. USE_ROCM is always ON until
850*da0073e9SAndroid Build Coastguard Worker# include(cmake/Dependencies.cmake) 2. USE_CUDA will become OFF during
851*da0073e9SAndroid Build Coastguard Worker# re-configuration Truth Table: CUDA 1st pass: USE_CUDA=True;USE_ROCM=True,
852*da0073e9SAndroid Build Coastguard Worker# FLASH evaluates to ON by default CUDA 2nd pass: USE_CUDA=True;USE_ROCM=False,
853*da0073e9SAndroid Build Coastguard Worker# FLASH evaluates to ON by default ROCM 1st pass: USE_CUDA=True;USE_ROCM=True,
854*da0073e9SAndroid Build Coastguard Worker# FLASH evaluates to ON by default ROCM 2nd pass: USE_CUDA=False;USE_ROCM=True,
855*da0073e9SAndroid Build Coastguard Worker# FLASH evaluates to ON by default CPU 1st pass: USE_CUDA=False(Cmd
856*da0073e9SAndroid Build Coastguard Worker# Option);USE_ROCM=True, FLASH evaluates to OFF by default CPU 2nd pass:
857*da0073e9SAndroid Build Coastguard Worker# USE_CUDA=False(Cmd Option);USE_ROCM=False, FLASH evaluates to OFF by default
858*da0073e9SAndroid Build Coastguard Worker# Thus we cannot tell ROCM 2nd pass and CPU 1st pass
859*da0073e9SAndroid Build Coastguard Worker#
860*da0073e9SAndroid Build Coastguard Worker# The only solution is to include(cmake/Dependencies.cmake), and defer the
861*da0073e9SAndroid Build Coastguard Worker# aotriton build decision later.
862*da0073e9SAndroid Build Coastguard Worker
863*da0073e9SAndroid Build Coastguard Workerinclude(cmake/Dependencies.cmake)
864*da0073e9SAndroid Build Coastguard Worker
865*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
866*da0073e9SAndroid Build Coastguard Worker  USE_FLASH_ATTENTION
867*da0073e9SAndroid Build Coastguard Worker  "Whether to build the flash_attention kernel for scaled dot product attention.\
868*da0073e9SAndroid Build Coastguard Worker  Will be disabled if not supported by the platform"
869*da0073e9SAndroid Build Coastguard Worker  ON
870*da0073e9SAndroid Build Coastguard Worker  "USE_CUDA OR USE_ROCM;NOT MSVC"
871*da0073e9SAndroid Build Coastguard Worker  OFF)
872*da0073e9SAndroid Build Coastguard Worker
873*da0073e9SAndroid Build Coastguard Worker# We are currenlty not using alibi attention for Flash So we disable this
874*da0073e9SAndroid Build Coastguard Worker# feature by default We dont currently document this feature because we don't
875*da0073e9SAndroid Build Coastguard Worker# Suspect users building from source will need this
876*da0073e9SAndroid Build Coastguard Workeradd_definitions(-DFLASHATTENTION_DISABLE_ALIBI)
877*da0073e9SAndroid Build Coastguard Worker
878*da0073e9SAndroid Build Coastguard Worker# CAVEAT: Again, Flash Attention2 will error while building for sm52 while Mem
879*da0073e9SAndroid Build Coastguard Worker# Eff Attention won't
880*da0073e9SAndroid Build Coastguard Workercmake_dependent_option(
881*da0073e9SAndroid Build Coastguard Worker  USE_MEM_EFF_ATTENTION
882*da0073e9SAndroid Build Coastguard Worker  "Enable memory-efficient attention for scaled dot product attention.\
883*da0073e9SAndroid Build Coastguard Worker  Will be disabled if not supported by the platform" ON
884*da0073e9SAndroid Build Coastguard Worker  "USE_CUDA OR USE_ROCM" OFF)
885*da0073e9SAndroid Build Coastguard Worker
886*da0073e9SAndroid Build Coastguard Worker#
887*da0073e9SAndroid Build Coastguard Worker# Cannot be put into Dependencies.cmake due circular dependency:
888*da0073e9SAndroid Build Coastguard Worker# USE_FLASH_ATTENTION -> USE_ROCM -> Dependencies.cmake -> aotriton.cmake
889*da0073e9SAndroid Build Coastguard Worker#
890*da0073e9SAndroid Build Coastguard Workerif(USE_ROCM)
891*da0073e9SAndroid Build Coastguard Worker  if(USE_FLASH_ATTENTION OR USE_MEM_EFF_ATTENTION)
892*da0073e9SAndroid Build Coastguard Worker    include(cmake/External/aotriton.cmake)
893*da0073e9SAndroid Build Coastguard Worker  endif()
894*da0073e9SAndroid Build Coastguard Workerendif()
895*da0073e9SAndroid Build Coastguard Worker
896*da0073e9SAndroid Build Coastguard Workerif(DEBUG_CUDA)
897*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CUDA_FLAGS_DEBUG " -lineinfo")
898*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CUDA_FLAGS_RELWITHDEBINFO " -lineinfo")
899*da0073e9SAndroid Build Coastguard Worker  # CUDA-12.1 crashes when trying to compile with --source-in-ptx See
900*da0073e9SAndroid Build Coastguard Worker  # https://github.com/pytorch/pytorch/issues/102372#issuecomment-1572526893
901*da0073e9SAndroid Build Coastguard Worker  if(CMAKE_CUDA_COMPILER_VERSION VERSION_LESS 12.1)
902*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CUDA_FLAGS_DEBUG " --source-in-ptx")
903*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CUDA_FLAGS_RELWITHDEBINFO " --source-in-ptx")
904*da0073e9SAndroid Build Coastguard Worker  endif()
905*da0073e9SAndroid Build Coastguard Workerendif(DEBUG_CUDA)
906*da0073e9SAndroid Build Coastguard Worker
907*da0073e9SAndroid Build Coastguard Workerif(USE_FBGEMM)
908*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -DUSE_FBGEMM")
909*da0073e9SAndroid Build Coastguard Workerendif()
910*da0073e9SAndroid Build Coastguard Worker
911*da0073e9SAndroid Build Coastguard Workerif(USE_PYTORCH_QNNPACK)
912*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -DUSE_PYTORCH_QNNPACK")
913*da0073e9SAndroid Build Coastguard Workerendif()
914*da0073e9SAndroid Build Coastguard Worker
915*da0073e9SAndroid Build Coastguard Workerif(USE_SLEEF_FOR_ARM_VEC256)
916*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -DAT_BUILD_ARM_VEC256_WITH_SLEEF")
917*da0073e9SAndroid Build Coastguard Worker  add_definitions(-DAT_BUILD_ARM_VEC256_WITH_SLEEF)
918*da0073e9SAndroid Build Coastguard Workerendif()
919*da0073e9SAndroid Build Coastguard Worker
920*da0073e9SAndroid Build Coastguard Worker# Enable sleef on macOS with Apple silicon by default
921*da0073e9SAndroid Build Coastguard Workerif((${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") AND ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "arm64"))
922*da0073e9SAndroid Build Coastguard Worker  message(STATUS "Running on macOS with Apple silicon")
923*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -DAT_BUILD_ARM_VEC256_WITH_SLEEF")
924*da0073e9SAndroid Build Coastguard Worker  add_definitions(-DAT_BUILD_ARM_VEC256_WITH_SLEEF)
925*da0073e9SAndroid Build Coastguard Workerendif()
926*da0073e9SAndroid Build Coastguard Worker
927*da0073e9SAndroid Build Coastguard Workerif(USE_XNNPACK)
928*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -DUSE_XNNPACK")
929*da0073e9SAndroid Build Coastguard Workerendif()
930*da0073e9SAndroid Build Coastguard Worker
931*da0073e9SAndroid Build Coastguard Workerif(USE_VULKAN)
932*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -DUSE_VULKAN")
933*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -DUSE_VULKAN_API")
934*da0073e9SAndroid Build Coastguard Worker
935*da0073e9SAndroid Build Coastguard Worker  if(USE_VULKAN_FP16_INFERENCE)
936*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -DUSE_VULKAN_FP16_INFERENCE")
937*da0073e9SAndroid Build Coastguard Worker  endif()
938*da0073e9SAndroid Build Coastguard Worker
939*da0073e9SAndroid Build Coastguard Worker  if(USE_VULKAN_RELAXED_PRECISION)
940*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -DUSE_VULKAN_RELAXED_PRECISION")
941*da0073e9SAndroid Build Coastguard Worker  endif()
942*da0073e9SAndroid Build Coastguard Worker
943*da0073e9SAndroid Build Coastguard Workerendif()
944*da0073e9SAndroid Build Coastguard Worker
945*da0073e9SAndroid Build Coastguard Workerif(BUILD_LITE_INTERPRETER)
946*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -DBUILD_LITE_INTERPRETER")
947*da0073e9SAndroid Build Coastguard Workerendif()
948*da0073e9SAndroid Build Coastguard Worker
949*da0073e9SAndroid Build Coastguard Workerif(TRACING_BASED)
950*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -DTRACING_BASED")
951*da0073e9SAndroid Build Coastguard Workerendif()
952*da0073e9SAndroid Build Coastguard Worker
953*da0073e9SAndroid Build Coastguard Workerif(USE_PYTORCH_METAL)
954*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -DUSE_PYTORCH_METAL")
955*da0073e9SAndroid Build Coastguard Workerendif()
956*da0073e9SAndroid Build Coastguard Worker
957*da0073e9SAndroid Build Coastguard Workerif(USE_PYTORCH_METAL_EXPORT)
958*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -DUSE_PYTORCH_METAL_EXPORT")
959*da0073e9SAndroid Build Coastguard Workerendif()
960*da0073e9SAndroid Build Coastguard Worker
961*da0073e9SAndroid Build Coastguard Workerif(USE_SOURCE_DEBUG_ON_MOBILE)
962*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -DSYMBOLICATE_MOBILE_DEBUG_HANDLE")
963*da0073e9SAndroid Build Coastguard Workerendif()
964*da0073e9SAndroid Build Coastguard Worker
965*da0073e9SAndroid Build Coastguard Workerif(BUILD_LITE_INTERPRETER AND USE_LITE_INTERPRETER_PROFILER)
966*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -DEDGE_PROFILER_USE_KINETO")
967*da0073e9SAndroid Build Coastguard Workerendif()
968*da0073e9SAndroid Build Coastguard Worker
969*da0073e9SAndroid Build Coastguard Workerif(USE_COREML_DELEGATE)
970*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -DUSE_COREML_DELEGATE")
971*da0073e9SAndroid Build Coastguard Workerendif()
972*da0073e9SAndroid Build Coastguard Worker
973*da0073e9SAndroid Build Coastguard Worker# ---[ Allowlist file if allowlist is specified
974*da0073e9SAndroid Build Coastguard Workerinclude(cmake/Allowlist.cmake)
975*da0073e9SAndroid Build Coastguard Worker
976*da0073e9SAndroid Build Coastguard Worker# ---[ Set link flag, handle additional deps for gcc 4.8 and above
977*da0073e9SAndroid Build Coastguard Workerif(CMAKE_COMPILER_IS_GNUCXX AND NOT ANDROID)
978*da0073e9SAndroid Build Coastguard Worker  message(
979*da0073e9SAndroid Build Coastguard Worker    STATUS
980*da0073e9SAndroid Build Coastguard Worker      "GCC ${CMAKE_CXX_COMPILER_VERSION}: Adding gcc and gcc_s libs to link line"
981*da0073e9SAndroid Build Coastguard Worker  )
982*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS gcc_s gcc)
983*da0073e9SAndroid Build Coastguard Workerendif()
984*da0073e9SAndroid Build Coastguard Worker
985*da0073e9SAndroid Build Coastguard Worker# ---[ Build flags Re-include to override append_cxx_flag_if_supported from
986*da0073e9SAndroid Build Coastguard Worker# third_party/FBGEMM
987*da0073e9SAndroid Build Coastguard Workerinclude(cmake/public/utils.cmake)
988*da0073e9SAndroid Build Coastguard Workerif(NOT MSVC)
989*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -O2 -fPIC")
990*da0073e9SAndroid Build Coastguard Worker  # Eigen fails to build with some versions, so convert this to a warning
991*da0073e9SAndroid Build Coastguard Worker  # Details at http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1459
992*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -Wall")
993*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -Wextra")
994*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Werror=return-type" CMAKE_CXX_FLAGS)
995*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Werror=non-virtual-dtor" CMAKE_CXX_FLAGS)
996*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Werror=braced-scalar-init" CMAKE_CXX_FLAGS)
997*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Werror=range-loop-construct" CMAKE_CXX_FLAGS)
998*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Werror=bool-operation" CMAKE_CXX_FLAGS)
999*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wnarrowing" CMAKE_CXX_FLAGS)
1000*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wno-missing-field-initializers"
1001*da0073e9SAndroid Build Coastguard Worker                               CMAKE_CXX_FLAGS)
1002*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wno-type-limits" CMAKE_CXX_FLAGS)
1003*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wno-array-bounds" CMAKE_CXX_FLAGS)
1004*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wno-unknown-pragmas" CMAKE_CXX_FLAGS)
1005*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wno-unused-parameter" CMAKE_CXX_FLAGS)
1006*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wno-strict-overflow" CMAKE_CXX_FLAGS)
1007*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wno-strict-aliasing" CMAKE_CXX_FLAGS)
1008*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wno-stringop-overflow" CMAKE_CXX_FLAGS)
1009*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wvla-extension" CMAKE_CXX_FLAGS)
1010*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wsuggest-override" CMAKE_CXX_FLAGS)
1011*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wnewline-eof" CMAKE_CXX_FLAGS)
1012*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Winconsistent-missing-override"
1013*da0073e9SAndroid Build Coastguard Worker                               CMAKE_CXX_FLAGS)
1014*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Winconsistent-missing-destructor-override"
1015*da0073e9SAndroid Build Coastguard Worker                               CMAKE_CXX_FLAGS)
1016*da0073e9SAndroid Build Coastguard Worker  if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
1017*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -Wno-pass-failed")
1018*da0073e9SAndroid Build Coastguard Worker  endif()
1019*da0073e9SAndroid Build Coastguard Worker  if(CMAKE_COMPILER_IS_GNUCXX)
1020*da0073e9SAndroid Build Coastguard Worker    # Suppress "The ABI for passing parameters with 64-byte alignment has
1021*da0073e9SAndroid Build Coastguard Worker    # changed in GCC 4.6"
1022*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -Wno-psabi")
1023*da0073e9SAndroid Build Coastguard Worker  endif()
1024*da0073e9SAndroid Build Coastguard Worker
1025*da0073e9SAndroid Build Coastguard Worker  # Use ld.gold if available, fall back to ld.bfd (the default ld) if not
1026*da0073e9SAndroid Build Coastguard Worker  if(USE_GOLD_LINKER)
1027*da0073e9SAndroid Build Coastguard Worker    if(USE_DISTRIBUTED AND USE_MPI)
1028*da0073e9SAndroid Build Coastguard Worker      # Same issue as here with default MPI on Ubuntu
1029*da0073e9SAndroid Build Coastguard Worker      # https://bugs.launchpad.net/ubuntu/+source/deal.ii/+bug/1841577
1030*da0073e9SAndroid Build Coastguard Worker      message(WARNING "Refusing to use gold when USE_MPI=1")
1031*da0073e9SAndroid Build Coastguard Worker    else()
1032*da0073e9SAndroid Build Coastguard Worker      execute_process(
1033*da0073e9SAndroid Build Coastguard Worker        COMMAND "${CMAKE_C_COMPILER}" -fuse-ld=gold -Wl,--version
1034*da0073e9SAndroid Build Coastguard Worker        ERROR_QUIET
1035*da0073e9SAndroid Build Coastguard Worker        OUTPUT_VARIABLE LD_VERSION)
1036*da0073e9SAndroid Build Coastguard Worker      if(NOT "${LD_VERSION}" MATCHES "GNU gold")
1037*da0073e9SAndroid Build Coastguard Worker        message(
1038*da0073e9SAndroid Build Coastguard Worker          WARNING
1039*da0073e9SAndroid Build Coastguard Worker            "USE_GOLD_LINKER was set but ld.gold isn't available, turning it off"
1040*da0073e9SAndroid Build Coastguard Worker        )
1041*da0073e9SAndroid Build Coastguard Worker        set(USE_GOLD_LINKER OFF)
1042*da0073e9SAndroid Build Coastguard Worker      else()
1043*da0073e9SAndroid Build Coastguard Worker        message(STATUS "ld.gold is available, using it to link")
1044*da0073e9SAndroid Build Coastguard Worker        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold")
1045*da0073e9SAndroid Build Coastguard Worker        set(CMAKE_SHARED_LINKER_FLAGS
1046*da0073e9SAndroid Build Coastguard Worker            "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=gold")
1047*da0073e9SAndroid Build Coastguard Worker        set(CMAKE_MODULE_LINKER_FLAGS
1048*da0073e9SAndroid Build Coastguard Worker            "${CMAKE_MODULE_LINKER_FLAGS} -fuse-ld=gold")
1049*da0073e9SAndroid Build Coastguard Worker      endif()
1050*da0073e9SAndroid Build Coastguard Worker    endif()
1051*da0073e9SAndroid Build Coastguard Worker  endif()
1052*da0073e9SAndroid Build Coastguard Worker
1053*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wno-error=old-style-cast" CMAKE_CXX_FLAGS)
1054*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wconstant-conversion" CMAKE_CXX_FLAGS)
1055*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wno-aligned-allocation-unavailable"
1056*da0073e9SAndroid Build Coastguard Worker                               CMAKE_CXX_FLAGS)
1057*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wno-missing-braces" CMAKE_CXX_FLAGS)
1058*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Qunused-arguments" CMAKE_CXX_FLAGS)
1059*da0073e9SAndroid Build Coastguard Worker
1060*da0073e9SAndroid Build Coastguard Worker  if(${USE_COLORIZE_OUTPUT})
1061*da0073e9SAndroid Build Coastguard Worker    # Why compiler checks are necessary even when `try_compile` is used Because
1062*da0073e9SAndroid Build Coastguard Worker    # of the bug in ccache that can incorrectly identify `-fcolor-diagnostics`
1063*da0073e9SAndroid Build Coastguard Worker    # As supported by GCC, see https://github.com/ccache/ccache/issues/740 (for
1064*da0073e9SAndroid Build Coastguard Worker    # older ccache) and https://github.com/ccache/ccache/issues/1275 (for newer
1065*da0073e9SAndroid Build Coastguard Worker    # ones)
1066*da0073e9SAndroid Build Coastguard Worker    if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
1067*da0073e9SAndroid Build Coastguard Worker      append_cxx_flag_if_supported("-fdiagnostics-color=always" CMAKE_CXX_FLAGS)
1068*da0073e9SAndroid Build Coastguard Worker    else()
1069*da0073e9SAndroid Build Coastguard Worker      append_cxx_flag_if_supported("-fcolor-diagnostics" CMAKE_CXX_FLAGS)
1070*da0073e9SAndroid Build Coastguard Worker    endif()
1071*da0073e9SAndroid Build Coastguard Worker  endif()
1072*da0073e9SAndroid Build Coastguard Worker
1073*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-faligned-new" CMAKE_CXX_FLAGS)
1074*da0073e9SAndroid Build Coastguard Worker
1075*da0073e9SAndroid Build Coastguard Worker  if(WERROR)
1076*da0073e9SAndroid Build Coastguard Worker    append_cxx_flag_if_supported("-Werror" CMAKE_CXX_FLAGS)
1077*da0073e9SAndroid Build Coastguard Worker    if(NOT COMPILER_SUPPORT_WERROR)
1078*da0073e9SAndroid Build Coastguard Worker      set(WERROR FALSE)
1079*da0073e9SAndroid Build Coastguard Worker    endif()
1080*da0073e9SAndroid Build Coastguard Worker  endif()
1081*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wno-unused-but-set-variable" CMAKE_CXX_FLAGS)
1082*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wno-maybe-uninitialized" CMAKE_CXX_FLAGS)
1083*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-fstandalone-debug" CMAKE_CXX_FLAGS_DEBUG)
1084*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS_DEBUG " -fno-omit-frame-pointer -O0")
1085*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_LINKER_FLAGS_DEBUG " -fno-omit-frame-pointer -O0")
1086*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-fno-math-errno" CMAKE_CXX_FLAGS)
1087*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-fno-trapping-math" CMAKE_CXX_FLAGS)
1088*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Werror=format" CMAKE_CXX_FLAGS)
1089*da0073e9SAndroid Build Coastguard Workerelse()
1090*da0073e9SAndroid Build Coastguard Worker  # skip unwanted includes from windows.h
1091*da0073e9SAndroid Build Coastguard Worker  add_compile_definitions(WIN32_LEAN_AND_MEAN)
1092*da0073e9SAndroid Build Coastguard Worker  # Windows SDK broke compatibility since version 25131, but introduced this
1093*da0073e9SAndroid Build Coastguard Worker  # define for backward compatibility.
1094*da0073e9SAndroid Build Coastguard Worker  add_compile_definitions(_UCRT_LEGACY_INFINITY)
1095*da0073e9SAndroid Build Coastguard Worker  # disable min/max macros
1096*da0073e9SAndroid Build Coastguard Worker  add_compile_definitions(NOMINMAX)
1097*da0073e9SAndroid Build Coastguard Worker  # Turn off these warnings on Windows. destructor was implicitly defined as
1098*da0073e9SAndroid Build Coastguard Worker  # delete
1099*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("/wd4624" CMAKE_CXX_FLAGS)
1100*da0073e9SAndroid Build Coastguard Worker  # unknown pragma
1101*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("/wd4068" CMAKE_CXX_FLAGS)
1102*da0073e9SAndroid Build Coastguard Worker  # unexpected tokens following preprocessor directive - expected a newline
1103*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("/wd4067" CMAKE_CXX_FLAGS)
1104*da0073e9SAndroid Build Coastguard Worker  # conversion from 'size_t' to 'unsigned int', possible loss of data
1105*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("/wd4267" CMAKE_CXX_FLAGS)
1106*da0073e9SAndroid Build Coastguard Worker  # no suitable definition provided for explicit template instantiation request
1107*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("/wd4661" CMAKE_CXX_FLAGS)
1108*da0073e9SAndroid Build Coastguard Worker  # recursive on all control paths, function will cause runtime stack overflow
1109*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("/wd4717" CMAKE_CXX_FLAGS)
1110*da0073e9SAndroid Build Coastguard Worker  # conversion from '_Ty' to '_Ty', possible loss of data
1111*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("/wd4244" CMAKE_CXX_FLAGS)
1112*da0073e9SAndroid Build Coastguard Worker  # unsafe use of type 'bool' in operation
1113*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("/wd4804" CMAKE_CXX_FLAGS)
1114*da0073e9SAndroid Build Coastguard Worker  # inconsistent dll linkage
1115*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("/wd4273" CMAKE_CXX_FLAGS)
1116*da0073e9SAndroid Build Coastguard Workerendif()
1117*da0073e9SAndroid Build Coastguard Worker
1118*da0073e9SAndroid Build Coastguard Workerif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
1119*da0073e9SAndroid Build Coastguard Worker  include(CheckCSourceCompiles)
1120*da0073e9SAndroid Build Coastguard Worker  check_c_source_compiles(
1121*da0073e9SAndroid Build Coastguard Worker    "#include <arm_neon.h>
1122*da0073e9SAndroid Build Coastguard Workerint main() {
1123*da0073e9SAndroid Build Coastguard Worker  float a[] = {1.0, 1.0};
1124*da0073e9SAndroid Build Coastguard Worker  float32x4x2_t v;
1125*da0073e9SAndroid Build Coastguard Worker  v.val[0] = vcombine_f32 (vcreate_f32 (0UL), vcreate_f32 (0UL));
1126*da0073e9SAndroid Build Coastguard Worker  v.val[1] = vcombine_f32 (vcreate_f32 (0UL), vcreate_f32 (0UL));
1127*da0073e9SAndroid Build Coastguard Worker  vst1q_f32_x2(a, v);
1128*da0073e9SAndroid Build Coastguard Worker  return 0;
1129*da0073e9SAndroid Build Coastguard Worker}"
1130*da0073e9SAndroid Build Coastguard Worker    HAS_VST1)
1131*da0073e9SAndroid Build Coastguard Worker
1132*da0073e9SAndroid Build Coastguard Worker  if(NOT HAS_VST1)
1133*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -DMISSING_ARM_VST1")
1134*da0073e9SAndroid Build Coastguard Worker  endif()
1135*da0073e9SAndroid Build Coastguard Workerendif()
1136*da0073e9SAndroid Build Coastguard Worker
1137*da0073e9SAndroid Build Coastguard Workerif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
1138*da0073e9SAndroid Build Coastguard Worker  include(CheckCSourceCompiles)
1139*da0073e9SAndroid Build Coastguard Worker  check_c_source_compiles(
1140*da0073e9SAndroid Build Coastguard Worker    "#include <arm_neon.h>
1141*da0073e9SAndroid Build Coastguard Workerint main() {
1142*da0073e9SAndroid Build Coastguard Worker  float a[] = {1.0, 1.0};
1143*da0073e9SAndroid Build Coastguard Worker  vld1q_f32_x2(a);
1144*da0073e9SAndroid Build Coastguard Worker  return 0;
1145*da0073e9SAndroid Build Coastguard Worker}"
1146*da0073e9SAndroid Build Coastguard Worker    HAS_VLD1)
1147*da0073e9SAndroid Build Coastguard Worker
1148*da0073e9SAndroid Build Coastguard Worker  if(NOT HAS_VLD1)
1149*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -DMISSING_ARM_VLD1")
1150*da0073e9SAndroid Build Coastguard Worker  endif()
1151*da0073e9SAndroid Build Coastguard Workerendif()
1152*da0073e9SAndroid Build Coastguard Worker
1153*da0073e9SAndroid Build Coastguard Worker# Add code coverage flags to supported compilers
1154*da0073e9SAndroid Build Coastguard Workerif(USE_CPP_CODE_COVERAGE)
1155*da0073e9SAndroid Build Coastguard Worker  if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
1156*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_C_FLAGS " --coverage -fprofile-abs-path")
1157*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " --coverage -fprofile-abs-path")
1158*da0073e9SAndroid Build Coastguard Worker  elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
1159*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_C_FLAGS " -fprofile-instr-generate -fcoverage-mapping")
1160*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS
1161*da0073e9SAndroid Build Coastguard Worker           " -fprofile-instr-generate -fcoverage-mapping")
1162*da0073e9SAndroid Build Coastguard Worker  else()
1163*da0073e9SAndroid Build Coastguard Worker    message(
1164*da0073e9SAndroid Build Coastguard Worker      ERROR
1165*da0073e9SAndroid Build Coastguard Worker      "Code coverage for compiler ${CMAKE_CXX_COMPILER_ID} is unsupported")
1166*da0073e9SAndroid Build Coastguard Worker  endif()
1167*da0073e9SAndroid Build Coastguard Worker
1168*da0073e9SAndroid Build Coastguard Workerendif()
1169*da0073e9SAndroid Build Coastguard Worker
1170*da0073e9SAndroid Build Coastguard Workerif(APPLE)
1171*da0073e9SAndroid Build Coastguard Worker  if(USE_MPS)
1172*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_OBJCXX_FLAGS " -DUSE_MPS -fno-objc-arc")
1173*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -DUSE_MPS")
1174*da0073e9SAndroid Build Coastguard Worker    string(
1175*da0073e9SAndroid Build Coastguard Worker      APPEND
1176*da0073e9SAndroid Build Coastguard Worker      CMAKE_SHARED_LINKER_FLAGS
1177*da0073e9SAndroid Build Coastguard Worker      " -weak_framework Foundation -weak_framework MetalPerformanceShaders -weak_framework MetalPerformanceShadersGraph -weak_framework Metal"
1178*da0073e9SAndroid Build Coastguard Worker    )
1179*da0073e9SAndroid Build Coastguard Worker    # To suppress MPSGraph availability warnings
1180*da0073e9SAndroid Build Coastguard Worker    append_cxx_flag_if_supported("-Wno-unguarded-availability-new"
1181*da0073e9SAndroid Build Coastguard Worker                                 CMAKE_OBJCXX_FLAGS)
1182*da0073e9SAndroid Build Coastguard Worker  endif()
1183*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wno-unused-private-field" CMAKE_CXX_FLAGS)
1184*da0073e9SAndroid Build Coastguard Worker  append_cxx_flag_if_supported("-Wno-missing-braces" CMAKE_CXX_FLAGS)
1185*da0073e9SAndroid Build Coastguard Workerendif()
1186*da0073e9SAndroid Build Coastguard Worker
1187*da0073e9SAndroid Build Coastguard Workerif(USE_XPU)
1188*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -DUSE_XPU")
1189*da0073e9SAndroid Build Coastguard Workerendif()
1190*da0073e9SAndroid Build Coastguard Worker
1191*da0073e9SAndroid Build Coastguard Workerif(EMSCRIPTEN)
1192*da0073e9SAndroid Build Coastguard Worker  string(
1193*da0073e9SAndroid Build Coastguard Worker    APPEND
1194*da0073e9SAndroid Build Coastguard Worker    CMAKE_CXX_FLAGS
1195*da0073e9SAndroid Build Coastguard Worker    " -Wno-implicit-function-declaration -DEMSCRIPTEN -s DISABLE_EXCEPTION_CATCHING=0"
1196*da0073e9SAndroid Build Coastguard Worker  )
1197*da0073e9SAndroid Build Coastguard Workerendif()
1198*da0073e9SAndroid Build Coastguard Worker
1199*da0073e9SAndroid Build Coastguard Workerappend_cxx_flag_if_supported("-Wno-stringop-overflow" CMAKE_CXX_FLAGS)
1200*da0073e9SAndroid Build Coastguard Worker
1201*da0073e9SAndroid Build Coastguard Workerif(ANDROID AND (NOT ANDROID_DEBUG_SYMBOLS))
1202*da0073e9SAndroid Build Coastguard Worker  if(CMAKE_COMPILER_IS_GNUCXX)
1203*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -s")
1204*da0073e9SAndroid Build Coastguard Worker  elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
1205*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -g0")
1206*da0073e9SAndroid Build Coastguard Worker  else()
1207*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_EXE_LINKER_FLAGS " -s")
1208*da0073e9SAndroid Build Coastguard Worker  endif()
1209*da0073e9SAndroid Build Coastguard Workerendif()
1210*da0073e9SAndroid Build Coastguard Worker
1211*da0073e9SAndroid Build Coastguard Workerif(NOT APPLE AND UNIX)
1212*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS dl)
1213*da0073e9SAndroid Build Coastguard Workerendif()
1214*da0073e9SAndroid Build Coastguard Worker
1215*da0073e9SAndroid Build Coastguard Worker# Prefix path to Caffe2 headers. If a directory containing installed Caffe2
1216*da0073e9SAndroid Build Coastguard Worker# headers was inadvertently added to the list of include directories, prefixing
1217*da0073e9SAndroid Build Coastguard Worker# PROJECT_SOURCE_DIR means this source tree always takes precedence.
1218*da0073e9SAndroid Build Coastguard Workerinclude_directories(BEFORE ${PROJECT_SOURCE_DIR})
1219*da0073e9SAndroid Build Coastguard Worker
1220*da0073e9SAndroid Build Coastguard Worker# Prefix path to generated Caffe2 headers. These need to take precedence over
1221*da0073e9SAndroid Build Coastguard Worker# their empty counterparts located in PROJECT_SOURCE_DIR.
1222*da0073e9SAndroid Build Coastguard Workerinclude_directories(BEFORE ${PROJECT_BINARY_DIR})
1223*da0073e9SAndroid Build Coastguard Worker
1224*da0073e9SAndroid Build Coastguard Workerinclude_directories(BEFORE ${PROJECT_SOURCE_DIR}/aten/src/)
1225*da0073e9SAndroid Build Coastguard Workerinclude_directories(BEFORE ${CMAKE_BINARY_DIR}/aten/src/)
1226*da0073e9SAndroid Build Coastguard Worker
1227*da0073e9SAndroid Build Coastguard Workerif(USE_MIMALLOC)
1228*da0073e9SAndroid Build Coastguard Worker  set(MI_OVERRIDE OFF)
1229*da0073e9SAndroid Build Coastguard Worker  set(MI_BUILD_SHARED OFF)
1230*da0073e9SAndroid Build Coastguard Worker  set(MI_BUILD_OBJECT OFF)
1231*da0073e9SAndroid Build Coastguard Worker  set(MI_BUILD_TESTS OFF)
1232*da0073e9SAndroid Build Coastguard Worker  add_definitions(-DUSE_MIMALLOC)
1233*da0073e9SAndroid Build Coastguard Worker  add_subdirectory(third_party/mimalloc)
1234*da0073e9SAndroid Build Coastguard Worker  include_directories(third_party/mimalloc/include)
1235*da0073e9SAndroid Build Coastguard Workerendif()
1236*da0073e9SAndroid Build Coastguard Worker
1237*da0073e9SAndroid Build Coastguard Worker# ---[ Main build
1238*da0073e9SAndroid Build Coastguard Workeradd_subdirectory(c10)
1239*da0073e9SAndroid Build Coastguard Workeradd_subdirectory(caffe2)
1240*da0073e9SAndroid Build Coastguard Worker
1241*da0073e9SAndroid Build Coastguard Worker# ---[ CMake related files Uninistall option.
1242*da0073e9SAndroid Build Coastguard Workerif(NOT TARGET caffe2_uninstall)
1243*da0073e9SAndroid Build Coastguard Worker  configure_file(
1244*da0073e9SAndroid Build Coastguard Worker    ${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in
1245*da0073e9SAndroid Build Coastguard Worker    ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake IMMEDIATE @ONLY)
1246*da0073e9SAndroid Build Coastguard Worker
1247*da0073e9SAndroid Build Coastguard Worker  add_custom_target(
1248*da0073e9SAndroid Build Coastguard Worker    caffe2_uninstall COMMAND ${CMAKE_COMMAND} -P
1249*da0073e9SAndroid Build Coastguard Worker                             ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
1250*da0073e9SAndroid Build Coastguard Workerendif()
1251*da0073e9SAndroid Build Coastguard Worker
1252*da0073e9SAndroid Build Coastguard Worker# ---[ Make configuration files for cmake to allow dependent libraries easier
1253*da0073e9SAndroid Build Coastguard Worker# access to Caffe2.
1254*da0073e9SAndroid Build Coastguard Worker
1255*da0073e9SAndroid Build Coastguard Workerif((NOT USE_GLOG)
1256*da0073e9SAndroid Build Coastguard Worker   OR(NOT USE_GFLAGS)
1257*da0073e9SAndroid Build Coastguard Worker   OR BUILD_CUSTOM_PROTOBUF)
1258*da0073e9SAndroid Build Coastguard Worker  message(WARNING "Generated cmake files are only fully tested if one builds "
1259*da0073e9SAndroid Build Coastguard Worker                  "with system glog, gflags, and protobuf. Other settings may "
1260*da0073e9SAndroid Build Coastguard Worker                  "generate files that are not well tested.")
1261*da0073e9SAndroid Build Coastguard Workerendif()
1262*da0073e9SAndroid Build Coastguard Worker
1263*da0073e9SAndroid Build Coastguard Workerif(USE_CUDA OR USE_ROCM)
1264*da0073e9SAndroid Build Coastguard Worker  # TODO: check if we should include other cuda dependency libraries to the
1265*da0073e9SAndroid Build Coastguard Worker  # interface as well.
1266*da0073e9SAndroid Build Coastguard Worker
1267*da0073e9SAndroid Build Coastguard Workerendif()
1268*da0073e9SAndroid Build Coastguard Worker
1269*da0073e9SAndroid Build Coastguard Worker# Note(jiayq): when building static libraries, all PRIVATE dependencies will
1270*da0073e9SAndroid Build Coastguard Worker# also become interface libraries, and as a result if there are any dependency
1271*da0073e9SAndroid Build Coastguard Worker# libraries that are not exported, the following install export script will
1272*da0073e9SAndroid Build Coastguard Worker# fail. As a result, we will only provide the targets cmake files for shared lib
1273*da0073e9SAndroid Build Coastguard Worker# installation. For more info, read:
1274*da0073e9SAndroid Build Coastguard Worker# https://cmake.org/pipermail/cmake/2016-May/063400.html
1275*da0073e9SAndroid Build Coastguard Workerif(BUILD_SHARED_LIBS)
1276*da0073e9SAndroid Build Coastguard Worker  configure_file(${PROJECT_SOURCE_DIR}/cmake/Caffe2Config.cmake.in
1277*da0073e9SAndroid Build Coastguard Worker                 ${PROJECT_BINARY_DIR}/Caffe2Config.cmake @ONLY)
1278*da0073e9SAndroid Build Coastguard Worker  install(
1279*da0073e9SAndroid Build Coastguard Worker    FILES ${PROJECT_BINARY_DIR}/Caffe2Config.cmake
1280*da0073e9SAndroid Build Coastguard Worker    DESTINATION share/cmake/Caffe2
1281*da0073e9SAndroid Build Coastguard Worker    COMPONENT dev)
1282*da0073e9SAndroid Build Coastguard Worker  install(
1283*da0073e9SAndroid Build Coastguard Worker    FILES ${PROJECT_SOURCE_DIR}/cmake/public/cuda.cmake
1284*da0073e9SAndroid Build Coastguard Worker          ${PROJECT_SOURCE_DIR}/cmake/public/xpu.cmake
1285*da0073e9SAndroid Build Coastguard Worker          ${PROJECT_SOURCE_DIR}/cmake/public/glog.cmake
1286*da0073e9SAndroid Build Coastguard Worker          ${PROJECT_SOURCE_DIR}/cmake/public/gflags.cmake
1287*da0073e9SAndroid Build Coastguard Worker          ${PROJECT_SOURCE_DIR}/cmake/public/mkl.cmake
1288*da0073e9SAndroid Build Coastguard Worker          ${PROJECT_SOURCE_DIR}/cmake/public/mkldnn.cmake
1289*da0073e9SAndroid Build Coastguard Worker          ${PROJECT_SOURCE_DIR}/cmake/public/protobuf.cmake
1290*da0073e9SAndroid Build Coastguard Worker          ${PROJECT_SOURCE_DIR}/cmake/public/utils.cmake
1291*da0073e9SAndroid Build Coastguard Worker          ${PROJECT_SOURCE_DIR}/cmake/public/LoadHIP.cmake
1292*da0073e9SAndroid Build Coastguard Worker    DESTINATION share/cmake/Caffe2/public
1293*da0073e9SAndroid Build Coastguard Worker    COMPONENT dev)
1294*da0073e9SAndroid Build Coastguard Worker  install(
1295*da0073e9SAndroid Build Coastguard Worker    DIRECTORY ${PROJECT_SOURCE_DIR}/cmake/Modules_CUDA_fix
1296*da0073e9SAndroid Build Coastguard Worker    DESTINATION share/cmake/Caffe2/
1297*da0073e9SAndroid Build Coastguard Worker    COMPONENT dev)
1298*da0073e9SAndroid Build Coastguard Worker  install(
1299*da0073e9SAndroid Build Coastguard Worker    FILES ${PROJECT_SOURCE_DIR}/cmake/Modules/FindCUDAToolkit.cmake
1300*da0073e9SAndroid Build Coastguard Worker    DESTINATION share/cmake/Caffe2/
1301*da0073e9SAndroid Build Coastguard Worker    COMPONENT dev)
1302*da0073e9SAndroid Build Coastguard Worker  install(
1303*da0073e9SAndroid Build Coastguard Worker    FILES ${PROJECT_SOURCE_DIR}/cmake/Modules/FindCUSPARSELT.cmake
1304*da0073e9SAndroid Build Coastguard Worker    DESTINATION share/cmake/Caffe2/
1305*da0073e9SAndroid Build Coastguard Worker    COMPONENT dev)
1306*da0073e9SAndroid Build Coastguard Worker  install(
1307*da0073e9SAndroid Build Coastguard Worker    FILES ${PROJECT_SOURCE_DIR}/cmake/Modules/FindCUDSS.cmake
1308*da0073e9SAndroid Build Coastguard Worker    DESTINATION share/cmake/Caffe2/
1309*da0073e9SAndroid Build Coastguard Worker    COMPONENT dev)
1310*da0073e9SAndroid Build Coastguard Worker  install(
1311*da0073e9SAndroid Build Coastguard Worker    FILES ${PROJECT_SOURCE_DIR}/cmake/Modules/FindSYCLToolkit.cmake
1312*da0073e9SAndroid Build Coastguard Worker    DESTINATION share/cmake/Caffe2/
1313*da0073e9SAndroid Build Coastguard Worker    COMPONENT dev)
1314*da0073e9SAndroid Build Coastguard Worker  if(NOT BUILD_LIBTORCHLESS)
1315*da0073e9SAndroid Build Coastguard Worker    install(
1316*da0073e9SAndroid Build Coastguard Worker      EXPORT Caffe2Targets
1317*da0073e9SAndroid Build Coastguard Worker      DESTINATION share/cmake/Caffe2
1318*da0073e9SAndroid Build Coastguard Worker      FILE Caffe2Targets.cmake
1319*da0073e9SAndroid Build Coastguard Worker      COMPONENT dev)
1320*da0073e9SAndroid Build Coastguard Worker  endif()
1321*da0073e9SAndroid Build Coastguard Workerelse()
1322*da0073e9SAndroid Build Coastguard Worker  message(WARNING "Generated cmake files are only available when building "
1323*da0073e9SAndroid Build Coastguard Worker                  "shared libs.")
1324*da0073e9SAndroid Build Coastguard Workerendif()
1325*da0073e9SAndroid Build Coastguard Worker
1326*da0073e9SAndroid Build Coastguard Worker# ---[ Binaries Binaries will be built after the Caffe2 main libraries and the
1327*da0073e9SAndroid Build Coastguard Worker# modules are built. For the binaries, they will be linked to the Caffe2 main
1328*da0073e9SAndroid Build Coastguard Worker# libraries, as well as all the modules that are built with Caffe2 (the ones
1329*da0073e9SAndroid Build Coastguard Worker# built in the previous Modules section above).
1330*da0073e9SAndroid Build Coastguard Workerif(BUILD_BINARY)
1331*da0073e9SAndroid Build Coastguard Worker  add_subdirectory(binaries)
1332*da0073e9SAndroid Build Coastguard Workerendif()
1333*da0073e9SAndroid Build Coastguard Worker
1334*da0073e9SAndroid Build Coastguard Worker# ---[ JNI
1335*da0073e9SAndroid Build Coastguard Workerif(BUILD_JNI)
1336*da0073e9SAndroid Build Coastguard Worker  if(NOT MSVC)
1337*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -Wno-unused-variable")
1338*da0073e9SAndroid Build Coastguard Worker  endif()
1339*da0073e9SAndroid Build Coastguard Worker  set(BUILD_LIBTORCH_WITH_JNI 1)
1340*da0073e9SAndroid Build Coastguard Worker  set(FBJNI_SKIP_TESTS 1)
1341*da0073e9SAndroid Build Coastguard Worker  add_subdirectory(android/pytorch_android)
1342*da0073e9SAndroid Build Coastguard Workerendif()
1343*da0073e9SAndroid Build Coastguard Worker
1344*da0073e9SAndroid Build Coastguard Workerinclude(cmake/Summary.cmake)
1345*da0073e9SAndroid Build Coastguard Workercaffe2_print_configuration_summary()
1346*da0073e9SAndroid Build Coastguard Worker
1347*da0073e9SAndroid Build Coastguard Workerif(BUILD_FUNCTORCH)
1348*da0073e9SAndroid Build Coastguard Worker  add_subdirectory(functorch)
1349*da0073e9SAndroid Build Coastguard Workerendif()
1350*da0073e9SAndroid Build Coastguard Worker
1351*da0073e9SAndroid Build Coastguard Worker# Parse custom debug info
1352*da0073e9SAndroid Build Coastguard Workerif(DEFINED USE_CUSTOM_DEBINFO)
1353*da0073e9SAndroid Build Coastguard Worker  string(REPLACE ";" " " SOURCE_FILES "${USE_CUSTOM_DEBINFO}")
1354*da0073e9SAndroid Build Coastguard Worker  message(STATUS "Source files with custom debug infos: ${SOURCE_FILES}")
1355*da0073e9SAndroid Build Coastguard Worker
1356*da0073e9SAndroid Build Coastguard Worker  string(REGEX REPLACE " +" ";" SOURCE_FILES_LIST "${SOURCE_FILES}")
1357*da0073e9SAndroid Build Coastguard Worker
1358*da0073e9SAndroid Build Coastguard Worker  # Set the COMPILE_FLAGS property for each source file
1359*da0073e9SAndroid Build Coastguard Worker  foreach(SOURCE_FILE ${SOURCE_FILES_LIST})
1360*da0073e9SAndroid Build Coastguard Worker    # We have to specify the scope here. We do this by specifying the targets we
1361*da0073e9SAndroid Build Coastguard Worker    # care about and caffe2/ for all test targets defined there
1362*da0073e9SAndroid Build Coastguard Worker    if(BUILD_LIBTORCHLESS)
1363*da0073e9SAndroid Build Coastguard Worker      caffe2_update_option(USE_CUDA OFF)
1364*da0073e9SAndroid Build Coastguard Worker      set(ALL_PT_TARGETS "torch_python;${C10_LIB};${TORCH_CPU_LIB};${TORCH_LIB}")
1365*da0073e9SAndroid Build Coastguard Worker    else()
1366*da0073e9SAndroid Build Coastguard Worker      # @todo test if we can remove this
1367*da0073e9SAndroid Build Coastguard Worker      set(ALL_PT_TARGETS "torch_python;c10;torch_cpu;torch")
1368*da0073e9SAndroid Build Coastguard Worker    endif()
1369*da0073e9SAndroid Build Coastguard Worker    set_source_files_properties(
1370*da0073e9SAndroid Build Coastguard Worker      ${SOURCE_FILE} DIRECTORY "caffe2/" TARGET_DIRECTORY ${ALL_PT_TARGETS}
1371*da0073e9SAndroid Build Coastguard Worker      PROPERTIES COMPILE_FLAGS "-g")
1372*da0073e9SAndroid Build Coastguard Worker  endforeach()
1373*da0073e9SAndroid Build Coastguard Worker
1374*da0073e9SAndroid Build Coastguard Worker  # Link everything with debug info when any file is in debug mode
1375*da0073e9SAndroid Build Coastguard Worker  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -g")
1376*da0073e9SAndroid Build Coastguard Worker  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -g")
1377*da0073e9SAndroid Build Coastguard Workerendif()
1378*da0073e9SAndroid Build Coastguard Worker
1379*da0073e9SAndroid Build Coastguard Worker# Bundle PTXAS if needed
1380*da0073e9SAndroid Build Coastguard Workerif(BUILD_BUNDLE_PTXAS AND USE_CUDA)
1381*da0073e9SAndroid Build Coastguard Worker  if(NOT EXISTS "${PROJECT_SOURCE_DIR}/build/bin/ptxas")
1382*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Copying PTXAS into the bin folder")
1383*da0073e9SAndroid Build Coastguard Worker    file(COPY "${CUDAToolkit_BIN_DIR}/ptxas"
1384*da0073e9SAndroid Build Coastguard Worker         DESTINATION "${PROJECT_BINARY_DIR}")
1385*da0073e9SAndroid Build Coastguard Worker  endif()
1386*da0073e9SAndroid Build Coastguard Worker  install(PROGRAMS "${PROJECT_BINARY_DIR}/ptxas"
1387*da0073e9SAndroid Build Coastguard Worker          DESTINATION "${CMAKE_INSTALL_BINDIR}")
1388*da0073e9SAndroid Build Coastguard Workerendif()
1389