xref: /aosp_15_r20/external/pytorch/cmake/Dependencies.cmake (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker# RPATH stuff
2*da0073e9SAndroid Build Coastguard Worker# see https://cmake.org/Wiki/CMake_RPATH_handling
3*da0073e9SAndroid Build Coastguard Workerif(APPLE)
4*da0073e9SAndroid Build Coastguard Worker  set(CMAKE_MACOSX_RPATH ON)
5*da0073e9SAndroid Build Coastguard Worker  set(_rpath_portable_origin "@loader_path")
6*da0073e9SAndroid Build Coastguard Workerelse()
7*da0073e9SAndroid Build Coastguard Worker  set(_rpath_portable_origin $ORIGIN)
8*da0073e9SAndroid Build Coastguard Workerendif(APPLE)
9*da0073e9SAndroid Build Coastguard Worker# Use separate rpaths during build and install phases
10*da0073e9SAndroid Build Coastguard Workerset(CMAKE_SKIP_BUILD_RPATH  FALSE)
11*da0073e9SAndroid Build Coastguard Worker# Don't use the install-rpath during the build phase
12*da0073e9SAndroid Build Coastguard Workerset(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
13*da0073e9SAndroid Build Coastguard Workerset(CMAKE_INSTALL_RPATH "${_rpath_portable_origin}")
14*da0073e9SAndroid Build Coastguard Worker# Automatically add all linked folders that are NOT in the build directory to
15*da0073e9SAndroid Build Coastguard Worker# the rpath (per library?)
16*da0073e9SAndroid Build Coastguard Workerset(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
17*da0073e9SAndroid Build Coastguard Worker
18*da0073e9SAndroid Build Coastguard Worker # UBSAN triggers when compiling protobuf, so we need to disable it.
19*da0073e9SAndroid Build Coastguard Workerset(UBSAN_FLAG "-fsanitize=undefined")
20*da0073e9SAndroid Build Coastguard Worker
21*da0073e9SAndroid Build Coastguard Workermacro(disable_ubsan)
22*da0073e9SAndroid Build Coastguard Worker  if(CMAKE_C_FLAGS MATCHES ${UBSAN_FLAG} OR CMAKE_CXX_FLAGS MATCHES ${UBSAN_FLAG})
23*da0073e9SAndroid Build Coastguard Worker    set(CAFFE2_UBSAN_ENABLED ON)
24*da0073e9SAndroid Build Coastguard Worker    string(REPLACE ${UBSAN_FLAG} "" CMAKE_C_FLAGS ${CMAKE_C_FLAGS})
25*da0073e9SAndroid Build Coastguard Worker    string(REPLACE ${UBSAN_FLAG} "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
26*da0073e9SAndroid Build Coastguard Worker  endif()
27*da0073e9SAndroid Build Coastguard Workerendmacro()
28*da0073e9SAndroid Build Coastguard Worker
29*da0073e9SAndroid Build Coastguard Workermacro(enable_ubsan)
30*da0073e9SAndroid Build Coastguard Worker  if(CAFFE2_UBSAN_ENABLED)
31*da0073e9SAndroid Build Coastguard Worker    set(CMAKE_C_FLAGS "${UBSAN_FLAG} ${CMAKE_C_FLAGS}")
32*da0073e9SAndroid Build Coastguard Worker    set(CMAKE_CXX_FLAGS "${UBSAN_FLAG} ${CMAKE_CXX_FLAGS}")
33*da0073e9SAndroid Build Coastguard Worker  endif()
34*da0073e9SAndroid Build Coastguard Workerendmacro()
35*da0073e9SAndroid Build Coastguard Worker
36*da0073e9SAndroid Build Coastguard Worker# ---[ CUDA
37*da0073e9SAndroid Build Coastguard Workerif(USE_CUDA)
38*da0073e9SAndroid Build Coastguard Worker  # public/*.cmake uses CAFFE2_USE_*
39*da0073e9SAndroid Build Coastguard Worker  set(CAFFE2_USE_CUDA ${USE_CUDA})
40*da0073e9SAndroid Build Coastguard Worker  set(CAFFE2_USE_CUDNN ${USE_CUDNN})
41*da0073e9SAndroid Build Coastguard Worker  set(CAFFE2_USE_CUSPARSELT ${USE_CUSPARSELT})
42*da0073e9SAndroid Build Coastguard Worker  set(CAFFE2_USE_CUFILE ${USE_CUFILE})
43*da0073e9SAndroid Build Coastguard Worker  set(CAFFE2_USE_NVRTC ${USE_NVRTC})
44*da0073e9SAndroid Build Coastguard Worker  include(${CMAKE_CURRENT_LIST_DIR}/public/cuda.cmake)
45*da0073e9SAndroid Build Coastguard Worker  if(CAFFE2_USE_CUDA)
46*da0073e9SAndroid Build Coastguard Worker    # A helper variable recording the list of Caffe2 dependent libraries
47*da0073e9SAndroid Build Coastguard Worker    # torch::cudart is dealt with separately, due to CUDA_ADD_LIBRARY
48*da0073e9SAndroid Build Coastguard Worker    # design reason (it adds CUDA_LIBRARIES itself).
49*da0073e9SAndroid Build Coastguard Worker    set(Caffe2_PUBLIC_CUDA_DEPENDENCY_LIBS )
50*da0073e9SAndroid Build Coastguard Worker    if(NOT CAFFE2_USE_NVRTC)
51*da0073e9SAndroid Build Coastguard Worker      caffe2_update_option(USE_NVRTC OFF)
52*da0073e9SAndroid Build Coastguard Worker    endif()
53*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_CUDA_DEPENDENCY_LIBS caffe2::curand caffe2::cufft caffe2::cublas)
54*da0073e9SAndroid Build Coastguard Worker    if(CAFFE2_USE_CUDNN)
55*da0073e9SAndroid Build Coastguard Worker      list(APPEND Caffe2_CUDA_DEPENDENCY_LIBS torch::cudnn)
56*da0073e9SAndroid Build Coastguard Worker    else()
57*da0073e9SAndroid Build Coastguard Worker      caffe2_update_option(USE_CUDNN OFF)
58*da0073e9SAndroid Build Coastguard Worker    endif()
59*da0073e9SAndroid Build Coastguard Worker    if(CAFFE2_USE_CUSPARSELT)
60*da0073e9SAndroid Build Coastguard Worker      list(APPEND Caffe2_CUDA_DEPENDENCY_LIBS torch::cusparselt)
61*da0073e9SAndroid Build Coastguard Worker    else()
62*da0073e9SAndroid Build Coastguard Worker      caffe2_update_option(USE_CUSPARSELT OFF)
63*da0073e9SAndroid Build Coastguard Worker    endif()
64*da0073e9SAndroid Build Coastguard Worker    if(CAFFE2_USE_CUFILE)
65*da0073e9SAndroid Build Coastguard Worker      list(APPEND Caffe2_CUDA_DEPENDENCY_LIBS torch::cufile)
66*da0073e9SAndroid Build Coastguard Worker    endif()
67*da0073e9SAndroid Build Coastguard Worker    find_program(SCCACHE_EXECUTABLE sccache)
68*da0073e9SAndroid Build Coastguard Worker    if(SCCACHE_EXECUTABLE)
69*da0073e9SAndroid Build Coastguard Worker      # Using RSP/--options-file renders output noncacheable by sccache
70*da0073e9SAndroid Build Coastguard Worker      # as they fall under `multiple input files` non-cacheable rule
71*da0073e9SAndroid Build Coastguard Worker      set(CMAKE_CUDA_USE_RESPONSE_FILE_FOR_INCLUDES 0)
72*da0073e9SAndroid Build Coastguard Worker      set(CMAKE_CUDA_USE_RESPONSE_FILE_FOR_LIBRARIES 0)
73*da0073e9SAndroid Build Coastguard Worker      set(CMAKE_CUDA_USE_RESPONSE_FILE_FOR_OBJECTS 0)
74*da0073e9SAndroid Build Coastguard Worker    endif()
75*da0073e9SAndroid Build Coastguard Worker  else()
76*da0073e9SAndroid Build Coastguard Worker    message(WARNING
77*da0073e9SAndroid Build Coastguard Worker      "Not compiling with CUDA. Suppress this warning with "
78*da0073e9SAndroid Build Coastguard Worker      "-DUSE_CUDA=OFF.")
79*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_CUDA OFF)
80*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_CUDNN OFF)
81*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_CUSPARSELT OFF)
82*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_NVRTC OFF)
83*da0073e9SAndroid Build Coastguard Worker    set(CAFFE2_USE_CUDA OFF)
84*da0073e9SAndroid Build Coastguard Worker    set(CAFFE2_USE_CUDNN OFF)
85*da0073e9SAndroid Build Coastguard Worker    set(CAFFE2_USE_CUSPARSELT OFF)
86*da0073e9SAndroid Build Coastguard Worker    set(CAFFE2_USE_CUFILE OFF)
87*da0073e9SAndroid Build Coastguard Worker    set(CAFFE2_USE_NVRTC OFF)
88*da0073e9SAndroid Build Coastguard Worker  endif()
89*da0073e9SAndroid Build Coastguard Workerendif()
90*da0073e9SAndroid Build Coastguard Worker
91*da0073e9SAndroid Build Coastguard Worker# ---[ XPU
92*da0073e9SAndroid Build Coastguard Workerif(USE_XPU)
93*da0073e9SAndroid Build Coastguard Worker  include(${CMAKE_CURRENT_LIST_DIR}/public/xpu.cmake)
94*da0073e9SAndroid Build Coastguard Worker  if(NOT PYTORCH_FOUND_XPU)
95*da0073e9SAndroid Build Coastguard Worker    message(WARNING "Not compiling with XPU. Could NOT find SYCL."
96*da0073e9SAndroid Build Coastguard Worker    "Suppress this warning with -DUSE_XPU=OFF.")
97*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_XPU OFF)
98*da0073e9SAndroid Build Coastguard Worker  else()
99*da0073e9SAndroid Build Coastguard Worker    if(LINUX)
100*da0073e9SAndroid Build Coastguard Worker      string(APPEND CMAKE_CXX_FLAGS " -D__INTEL_PREVIEW_BREAKING_CHANGES")
101*da0073e9SAndroid Build Coastguard Worker    endif()
102*da0073e9SAndroid Build Coastguard Worker  endif()
103*da0073e9SAndroid Build Coastguard Workerendif()
104*da0073e9SAndroid Build Coastguard Worker
105*da0073e9SAndroid Build Coastguard Worker# ---[ Custom Protobuf
106*da0073e9SAndroid Build Coastguard Workerif(CAFFE2_CMAKE_BUILDING_WITH_MAIN_REPO AND NOT INTERN_BUILD_MOBILE)
107*da0073e9SAndroid Build Coastguard Worker  disable_ubsan()
108*da0073e9SAndroid Build Coastguard Worker  include(${CMAKE_CURRENT_LIST_DIR}/ProtoBuf.cmake)
109*da0073e9SAndroid Build Coastguard Worker  enable_ubsan()
110*da0073e9SAndroid Build Coastguard Workerendif()
111*da0073e9SAndroid Build Coastguard Worker
112*da0073e9SAndroid Build Coastguard Workerif(USE_ASAN OR USE_TSAN)
113*da0073e9SAndroid Build Coastguard Worker  find_package(Sanitizer REQUIRED)
114*da0073e9SAndroid Build Coastguard Worker  if(USE_ASAN)
115*da0073e9SAndroid Build Coastguard Worker    if(TARGET Sanitizer::address)
116*da0073e9SAndroid Build Coastguard Worker      list(APPEND Caffe2_DEPENDENCY_LIBS Sanitizer::address)
117*da0073e9SAndroid Build Coastguard Worker    else()
118*da0073e9SAndroid Build Coastguard Worker      message(WARNING "Not ASAN found. Suppress this warning with -DUSE_ASAN=OFF.")
119*da0073e9SAndroid Build Coastguard Worker      caffe2_update_option(USE_ASAN OFF)
120*da0073e9SAndroid Build Coastguard Worker    endif()
121*da0073e9SAndroid Build Coastguard Worker    if(TARGET Sanitizer::undefined)
122*da0073e9SAndroid Build Coastguard Worker      list(APPEND Caffe2_DEPENDENCY_LIBS Sanitizer::undefined)
123*da0073e9SAndroid Build Coastguard Worker    endif()
124*da0073e9SAndroid Build Coastguard Worker  endif()
125*da0073e9SAndroid Build Coastguard Worker  if(USE_TSAN)
126*da0073e9SAndroid Build Coastguard Worker    if(TARGET Sanitizer::thread)
127*da0073e9SAndroid Build Coastguard Worker      list(APPEND Caffe2_DEPENDENCY_LIBS Sanitizer::thread)
128*da0073e9SAndroid Build Coastguard Worker    else()
129*da0073e9SAndroid Build Coastguard Worker      message(WARNING "Not TSAN found. Suppress this warning with -DUSE_TSAN=OFF.")
130*da0073e9SAndroid Build Coastguard Worker      caffe2_update_option(USE_TSAN OFF)
131*da0073e9SAndroid Build Coastguard Worker    endif()
132*da0073e9SAndroid Build Coastguard Worker  endif()
133*da0073e9SAndroid Build Coastguard Workerendif()
134*da0073e9SAndroid Build Coastguard Worker
135*da0073e9SAndroid Build Coastguard Worker# ---[ Threads
136*da0073e9SAndroid Build Coastguard Workerfind_package(Threads REQUIRED)
137*da0073e9SAndroid Build Coastguard Workerif(TARGET Threads::Threads)
138*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS Threads::Threads)
139*da0073e9SAndroid Build Coastguard Workerelse()
140*da0073e9SAndroid Build Coastguard Worker  message(FATAL_ERROR
141*da0073e9SAndroid Build Coastguard Worker      "Cannot find threading library. PyTorch requires Threads to compile.")
142*da0073e9SAndroid Build Coastguard Workerendif()
143*da0073e9SAndroid Build Coastguard Worker
144*da0073e9SAndroid Build Coastguard Worker# ---[ protobuf
145*da0073e9SAndroid Build Coastguard Workerif(CAFFE2_CMAKE_BUILDING_WITH_MAIN_REPO)
146*da0073e9SAndroid Build Coastguard Worker  if(USE_LITE_PROTO)
147*da0073e9SAndroid Build Coastguard Worker    set(CAFFE2_USE_LITE_PROTO 1)
148*da0073e9SAndroid Build Coastguard Worker  endif()
149*da0073e9SAndroid Build Coastguard Workerendif()
150*da0073e9SAndroid Build Coastguard Worker
151*da0073e9SAndroid Build Coastguard Worker# ---[ BLAS
152*da0073e9SAndroid Build Coastguard Worker
153*da0073e9SAndroid Build Coastguard Workerset(AT_MKLDNN_ACL_ENABLED 0)
154*da0073e9SAndroid Build Coastguard Workerset(AT_MKLDNN_ENABLED 0)
155*da0073e9SAndroid Build Coastguard Workerset(AT_MKL_ENABLED 0)
156*da0073e9SAndroid Build Coastguard Worker# setting default preferred BLAS options if not already present.
157*da0073e9SAndroid Build Coastguard Workerif(NOT INTERN_BUILD_MOBILE)
158*da0073e9SAndroid Build Coastguard Worker  set(BLAS "MKL" CACHE STRING "Selected BLAS library")
159*da0073e9SAndroid Build Coastguard Workerelse()
160*da0073e9SAndroid Build Coastguard Worker  set(BLAS "Eigen" CACHE STRING "Selected BLAS library")
161*da0073e9SAndroid Build Coastguard Worker  set(AT_MKLDNN_ENABLED 0)
162*da0073e9SAndroid Build Coastguard Worker  set(AT_MKL_ENABLED 0)
163*da0073e9SAndroid Build Coastguard Workerendif()
164*da0073e9SAndroid Build Coastguard Workerset_property(CACHE BLAS PROPERTY STRINGS "ATLAS;BLIS;Eigen;FLAME;Generic;MKL;OpenBLAS;vecLib")
165*da0073e9SAndroid Build Coastguard Workermessage(STATUS "Trying to find preferred BLAS backend of choice: " ${BLAS})
166*da0073e9SAndroid Build Coastguard Worker
167*da0073e9SAndroid Build Coastguard Workerif(BLAS STREQUAL "Eigen")
168*da0073e9SAndroid Build Coastguard Worker  # Eigen is header-only and we do not have any dependent libraries
169*da0073e9SAndroid Build Coastguard Worker  set(CAFFE2_USE_EIGEN_FOR_BLAS ON)
170*da0073e9SAndroid Build Coastguard Workerelseif(BLAS STREQUAL "ATLAS")
171*da0073e9SAndroid Build Coastguard Worker  find_package(Atlas REQUIRED)
172*da0073e9SAndroid Build Coastguard Worker  include_directories(SYSTEM ${ATLAS_INCLUDE_DIRS})
173*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS ${ATLAS_LIBRARIES})
174*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS cblas)
175*da0073e9SAndroid Build Coastguard Worker  set(BLAS_INFO "atlas")
176*da0073e9SAndroid Build Coastguard Worker  set(BLAS_FOUND 1)
177*da0073e9SAndroid Build Coastguard Worker  set(BLAS_LIBRARIES ${ATLAS_LIBRARIES} cblas)
178*da0073e9SAndroid Build Coastguard Workerelseif(BLAS STREQUAL "OpenBLAS")
179*da0073e9SAndroid Build Coastguard Worker  find_package(OpenBLAS REQUIRED)
180*da0073e9SAndroid Build Coastguard Worker  include_directories(SYSTEM ${OpenBLAS_INCLUDE_DIR})
181*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS ${OpenBLAS_LIB})
182*da0073e9SAndroid Build Coastguard Worker  set(BLAS_INFO "open")
183*da0073e9SAndroid Build Coastguard Worker  set(BLAS_FOUND 1)
184*da0073e9SAndroid Build Coastguard Worker  set(BLAS_LIBRARIES ${OpenBLAS_LIB})
185*da0073e9SAndroid Build Coastguard Workerelseif(BLAS STREQUAL "BLIS")
186*da0073e9SAndroid Build Coastguard Worker  find_package(BLIS REQUIRED)
187*da0073e9SAndroid Build Coastguard Worker  include_directories(SYSTEM ${BLIS_INCLUDE_DIR})
188*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS ${BLIS_LIB})
189*da0073e9SAndroid Build Coastguard Workerelseif(BLAS STREQUAL "MKL")
190*da0073e9SAndroid Build Coastguard Worker  if(BLAS_SET_BY_USER)
191*da0073e9SAndroid Build Coastguard Worker    find_package(MKL REQUIRED)
192*da0073e9SAndroid Build Coastguard Worker  else()
193*da0073e9SAndroid Build Coastguard Worker    find_package(MKL QUIET)
194*da0073e9SAndroid Build Coastguard Worker  endif()
195*da0073e9SAndroid Build Coastguard Worker  include(${CMAKE_CURRENT_LIST_DIR}/public/mkl.cmake)
196*da0073e9SAndroid Build Coastguard Worker  if(MKL_FOUND)
197*da0073e9SAndroid Build Coastguard Worker    message(STATUS "MKL libraries: ${MKL_LIBRARIES}")
198*da0073e9SAndroid Build Coastguard Worker    message(STATUS "MKL include directory: ${MKL_INCLUDE_DIR}")
199*da0073e9SAndroid Build Coastguard Worker    message(STATUS "MKL OpenMP type: ${MKL_OPENMP_TYPE}")
200*da0073e9SAndroid Build Coastguard Worker    message(STATUS "MKL OpenMP library: ${MKL_OPENMP_LIBRARY}")
201*da0073e9SAndroid Build Coastguard Worker    include_directories(AFTER SYSTEM ${MKL_INCLUDE_DIR})
202*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_PUBLIC_DEPENDENCY_LIBS caffe2::mkl)
203*da0073e9SAndroid Build Coastguard Worker    set(CAFFE2_USE_MKL ON)
204*da0073e9SAndroid Build Coastguard Worker    set(BLAS_INFO "mkl")
205*da0073e9SAndroid Build Coastguard Worker    set(BLAS_FOUND 1)
206*da0073e9SAndroid Build Coastguard Worker    set(BLAS_LIBRARIES ${MKL_LIBRARIES})
207*da0073e9SAndroid Build Coastguard Worker  else()
208*da0073e9SAndroid Build Coastguard Worker    message(WARNING "MKL could not be found. Defaulting to Eigen")
209*da0073e9SAndroid Build Coastguard Worker    set(CAFFE2_USE_EIGEN_FOR_BLAS ON)
210*da0073e9SAndroid Build Coastguard Worker    set(CAFFE2_USE_MKL OFF)
211*da0073e9SAndroid Build Coastguard Worker  endif()
212*da0073e9SAndroid Build Coastguard Workerelseif(BLAS STREQUAL "NVPL")
213*da0073e9SAndroid Build Coastguard Worker  find_package(NVPL_BLAS REQUIRED)
214*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS nvpl::blas_lp64_omp)
215*da0073e9SAndroid Build Coastguard Worker  set(BLAS_INFO "nvpl")
216*da0073e9SAndroid Build Coastguard Worker  set(BLAS_FOUND 1)
217*da0073e9SAndroid Build Coastguard Worker  set(BLAS_USE_CBLAS_DOT TRUE)
218*da0073e9SAndroid Build Coastguard Workerelseif(BLAS STREQUAL "vecLib")
219*da0073e9SAndroid Build Coastguard Worker  find_package(vecLib REQUIRED)
220*da0073e9SAndroid Build Coastguard Worker  include_directories(SYSTEM ${vecLib_INCLUDE_DIR})
221*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS ${vecLib_LINKER_LIBS})
222*da0073e9SAndroid Build Coastguard Worker  set(BLAS_INFO "veclib")
223*da0073e9SAndroid Build Coastguard Worker  set(BLAS_FOUND 1)
224*da0073e9SAndroid Build Coastguard Worker  set(BLAS_LIBRARIES ${vecLib_LINKER_LIBS})
225*da0073e9SAndroid Build Coastguard Workerelseif(BLAS STREQUAL "FlexiBLAS")
226*da0073e9SAndroid Build Coastguard Worker  find_package(FlexiBLAS REQUIRED)
227*da0073e9SAndroid Build Coastguard Worker  include_directories(SYSTEM ${FlexiBLAS_INCLUDE_DIR})
228*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS ${FlexiBLAS_LIB})
229*da0073e9SAndroid Build Coastguard Workerelseif(BLAS STREQUAL "Generic")
230*da0073e9SAndroid Build Coastguard Worker  # On Debian family, the CBLAS ABIs have been merged into libblas.so
231*da0073e9SAndroid Build Coastguard Worker  if(ENV{GENERIC_BLAS_LIBRARIES} STREQUAL "")
232*da0073e9SAndroid Build Coastguard Worker    set(GENERIC_BLAS "blas")
233*da0073e9SAndroid Build Coastguard Worker  else()
234*da0073e9SAndroid Build Coastguard Worker    set(GENERIC_BLAS $ENV{GENERIC_BLAS_LIBRARIES})
235*da0073e9SAndroid Build Coastguard Worker  endif()
236*da0073e9SAndroid Build Coastguard Worker  find_library(BLAS_LIBRARIES NAMES ${GENERIC_BLAS})
237*da0073e9SAndroid Build Coastguard Worker  message("-- Using BLAS: ${BLAS_LIBRARIES}")
238*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS ${BLAS_LIBRARIES})
239*da0073e9SAndroid Build Coastguard Worker  set(GENERIC_BLAS_FOUND TRUE)
240*da0073e9SAndroid Build Coastguard Worker  set(BLAS_INFO "generic")
241*da0073e9SAndroid Build Coastguard Worker  set(BLAS_FOUND 1)
242*da0073e9SAndroid Build Coastguard Workerelse()
243*da0073e9SAndroid Build Coastguard Worker  message(FATAL_ERROR "Unrecognized BLAS option: " ${BLAS})
244*da0073e9SAndroid Build Coastguard Workerendif()
245*da0073e9SAndroid Build Coastguard Worker
246*da0073e9SAndroid Build Coastguard Workerif(NOT INTERN_BUILD_MOBILE)
247*da0073e9SAndroid Build Coastguard Worker  set(AT_MKL_SEQUENTIAL 0)
248*da0073e9SAndroid Build Coastguard Worker  set(USE_BLAS 1)
249*da0073e9SAndroid Build Coastguard Worker  if(NOT (ATLAS_FOUND OR BLIS_FOUND OR GENERIC_BLAS_FOUND OR MKL_FOUND OR OpenBLAS_FOUND OR VECLIB_FOUND OR FlexiBLAS_FOUND OR NVPL_BLAS_FOUND))
250*da0073e9SAndroid Build Coastguard Worker    message(WARNING "Preferred BLAS (" ${BLAS} ") cannot be found, now searching for a general BLAS library")
251*da0073e9SAndroid Build Coastguard Worker    find_package(BLAS)
252*da0073e9SAndroid Build Coastguard Worker    if(NOT BLAS_FOUND)
253*da0073e9SAndroid Build Coastguard Worker      set(USE_BLAS 0)
254*da0073e9SAndroid Build Coastguard Worker    endif()
255*da0073e9SAndroid Build Coastguard Worker  endif()
256*da0073e9SAndroid Build Coastguard Worker
257*da0073e9SAndroid Build Coastguard Worker  if(MKL_FOUND)
258*da0073e9SAndroid Build Coastguard Worker    if("${MKL_THREADING}" STREQUAL "SEQ")
259*da0073e9SAndroid Build Coastguard Worker      set(AT_MKL_SEQUENTIAL 1)
260*da0073e9SAndroid Build Coastguard Worker    endif()
261*da0073e9SAndroid Build Coastguard Worker    set(AT_MKL_ENABLED 1)
262*da0073e9SAndroid Build Coastguard Worker  endif()
263*da0073e9SAndroid Build Coastguard Workerelseif(INTERN_USE_EIGEN_BLAS)
264*da0073e9SAndroid Build Coastguard Worker  # Eigen BLAS for Mobile
265*da0073e9SAndroid Build Coastguard Worker  set(USE_BLAS 1)
266*da0073e9SAndroid Build Coastguard Worker  include(${CMAKE_CURRENT_LIST_DIR}/External/EigenBLAS.cmake)
267*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS eigen_blas)
268*da0073e9SAndroid Build Coastguard Workerendif()
269*da0073e9SAndroid Build Coastguard Worker
270*da0073e9SAndroid Build Coastguard Worker# --- [ PocketFFT
271*da0073e9SAndroid Build Coastguard Workerset(AT_POCKETFFT_ENABLED 0)
272*da0073e9SAndroid Build Coastguard Workerif(NOT AT_MKL_ENABLED)
273*da0073e9SAndroid Build Coastguard Worker  set(POCKETFFT_INCLUDE_DIR "${Torch_SOURCE_DIR}/third_party/pocketfft/")
274*da0073e9SAndroid Build Coastguard Worker  if(NOT EXISTS "${POCKETFFT_INCLUDE_DIR}")
275*da0073e9SAndroid Build Coastguard Worker    message(FATAL_ERROR "pocketfft directory not found, expected ${POCKETFFT_INCLUDE_DIR}")
276*da0073e9SAndroid Build Coastguard Worker  elif(NOT EXISTS "${POCKETFFT_INCLUDE_DIR}/pocketfft_hdronly.h")
277*da0073e9SAndroid Build Coastguard Worker    message(FATAL_ERROR "pocketfft headers not found in ${POCKETFFT_INCLUDE_DIR}")
278*da0073e9SAndroid Build Coastguard Worker  endif()
279*da0073e9SAndroid Build Coastguard Worker
280*da0073e9SAndroid Build Coastguard Worker  set(AT_POCKETFFT_ENABLED 1)
281*da0073e9SAndroid Build Coastguard Worker  message(STATUS "Using pocketfft in directory: ${POCKETFFT_INCLUDE_DIR}")
282*da0073e9SAndroid Build Coastguard Workerendif()
283*da0073e9SAndroid Build Coastguard Worker
284*da0073e9SAndroid Build Coastguard Worker# ---[ Dependencies
285*da0073e9SAndroid Build Coastguard Worker# NNPACK and family (QNNPACK, PYTORCH_QNNPACK, and XNNPACK) can download and
286*da0073e9SAndroid Build Coastguard Worker# compile their dependencies in isolation as part of their build.  These dependencies
287*da0073e9SAndroid Build Coastguard Worker# are then linked statically with PyTorch.  To avoid the possibility of a version
288*da0073e9SAndroid Build Coastguard Worker# mismatch between these shared dependencies, explicitly declare our intent to these
289*da0073e9SAndroid Build Coastguard Worker# libraries that we are interested in using the exact same source dependencies for all.
290*da0073e9SAndroid Build Coastguard Worker
291*da0073e9SAndroid Build Coastguard Workerif(USE_NNPACK OR USE_PYTORCH_QNNPACK OR USE_XNNPACK)
292*da0073e9SAndroid Build Coastguard Worker  set(DISABLE_NNPACK_AND_FAMILY OFF)
293*da0073e9SAndroid Build Coastguard Worker
294*da0073e9SAndroid Build Coastguard Worker  # Sanity checks - Can we actually build NNPACK and family given the configuration provided?
295*da0073e9SAndroid Build Coastguard Worker  # Disable them and warn the user if not.
296*da0073e9SAndroid Build Coastguard Worker
297*da0073e9SAndroid Build Coastguard Worker  if(IOS)
298*da0073e9SAndroid Build Coastguard Worker    list(LENGTH IOS_ARCH IOS_ARCH_COUNT)
299*da0073e9SAndroid Build Coastguard Worker    if(IOS_ARCH_COUNT GREATER 1)
300*da0073e9SAndroid Build Coastguard Worker      message(WARNING
301*da0073e9SAndroid Build Coastguard Worker        "Multi-architecture (${IOS_ARCH}) builds are not supported in {Q/X}NNPACK. "
302*da0073e9SAndroid Build Coastguard Worker        "Specify a single architecture in IOS_ARCH and re-configure, or "
303*da0073e9SAndroid Build Coastguard Worker        "turn this warning off by USE_{Q/X}NNPACK=OFF.")
304*da0073e9SAndroid Build Coastguard Worker      set(DISABLE_NNPACK_AND_FAMILY ON)
305*da0073e9SAndroid Build Coastguard Worker    endif()
306*da0073e9SAndroid Build Coastguard Worker    if(NOT IOS_ARCH MATCHES "^(i386|x86_64|armv7.*|arm64.*)$")
307*da0073e9SAndroid Build Coastguard Worker      message(WARNING
308*da0073e9SAndroid Build Coastguard Worker        "Target architecture \"${IOS_ARCH}\" is not supported in {Q/X}NNPACK. "
309*da0073e9SAndroid Build Coastguard Worker        "Supported architectures are x86, x86-64, ARM, and ARM64. "
310*da0073e9SAndroid Build Coastguard Worker        "Turn this warning off by USE_{Q/X}NNPACK=OFF.")
311*da0073e9SAndroid Build Coastguard Worker      set(DISABLE_NNPACK_AND_FAMILY ON)
312*da0073e9SAndroid Build Coastguard Worker    endif()
313*da0073e9SAndroid Build Coastguard Worker  else()
314*da0073e9SAndroid Build Coastguard Worker    if(NOT IOS AND NOT (CMAKE_SYSTEM_NAME MATCHES "^(Android|Linux|Darwin|Windows)$"))
315*da0073e9SAndroid Build Coastguard Worker      message(WARNING
316*da0073e9SAndroid Build Coastguard Worker        "Target platform \"${CMAKE_SYSTEM_NAME}\" is not supported in {Q/X}NNPACK. "
317*da0073e9SAndroid Build Coastguard Worker        "Supported platforms are Android, iOS, Linux, and macOS. "
318*da0073e9SAndroid Build Coastguard Worker        "Turn this warning off by USE_{Q/X}NNPACK=OFF.")
319*da0073e9SAndroid Build Coastguard Worker      set(DISABLE_NNPACK_AND_FAMILY ON)
320*da0073e9SAndroid Build Coastguard Worker    endif()
321*da0073e9SAndroid Build Coastguard Worker    if(NOT IOS AND NOT (CMAKE_SYSTEM_PROCESSOR MATCHES "^(i686|AMD64|x86_64|armv[0-9].*|arm64|aarch64)$"))
322*da0073e9SAndroid Build Coastguard Worker      message(WARNING
323*da0073e9SAndroid Build Coastguard Worker        "Target architecture \"${CMAKE_SYSTEM_PROCESSOR}\" is not supported in {Q/X}NNPACK. "
324*da0073e9SAndroid Build Coastguard Worker        "Supported architectures are x86, x86-64, ARM, and ARM64. "
325*da0073e9SAndroid Build Coastguard Worker        "Turn this warning off by USE_{Q/X}NNPACK=OFF.")
326*da0073e9SAndroid Build Coastguard Worker      set(DISABLE_NNPACK_AND_FAMILY ON)
327*da0073e9SAndroid Build Coastguard Worker    endif()
328*da0073e9SAndroid Build Coastguard Worker  endif()
329*da0073e9SAndroid Build Coastguard Worker
330*da0073e9SAndroid Build Coastguard Worker  if(DISABLE_NNPACK_AND_FAMILY)
331*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_NNPACK OFF)
332*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_PYTORCH_QNNPACK OFF)
333*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_XNNPACK OFF)
334*da0073e9SAndroid Build Coastguard Worker  else()
335*da0073e9SAndroid Build Coastguard Worker    # Disable unsupported NNPack combinations with MSVC
336*da0073e9SAndroid Build Coastguard Worker    if(MSVC)
337*da0073e9SAndroid Build Coastguard Worker      caffe2_update_option(USE_NNPACK OFF)
338*da0073e9SAndroid Build Coastguard Worker      caffe2_update_option(USE_PYTORCH_QNNPACK OFF)
339*da0073e9SAndroid Build Coastguard Worker    endif()
340*da0073e9SAndroid Build Coastguard Worker
341*da0073e9SAndroid Build Coastguard Worker    set(CAFFE2_THIRD_PARTY_ROOT "${PROJECT_SOURCE_DIR}/third_party")
342*da0073e9SAndroid Build Coastguard Worker
343*da0073e9SAndroid Build Coastguard Worker    if(NOT DEFINED CPUINFO_SOURCE_DIR)
344*da0073e9SAndroid Build Coastguard Worker      set(CPUINFO_SOURCE_DIR "${CAFFE2_THIRD_PARTY_ROOT}/cpuinfo" CACHE STRING "cpuinfo source directory")
345*da0073e9SAndroid Build Coastguard Worker    endif()
346*da0073e9SAndroid Build Coastguard Worker    if(NOT DEFINED FP16_SOURCE_DIR)
347*da0073e9SAndroid Build Coastguard Worker      set(FP16_SOURCE_DIR "${CAFFE2_THIRD_PARTY_ROOT}/FP16" CACHE STRING "FP16 source directory")
348*da0073e9SAndroid Build Coastguard Worker    endif()
349*da0073e9SAndroid Build Coastguard Worker    if(NOT DEFINED FXDIV_SOURCE_DIR)
350*da0073e9SAndroid Build Coastguard Worker      set(FXDIV_SOURCE_DIR "${CAFFE2_THIRD_PARTY_ROOT}/FXdiv" CACHE STRING "FXdiv source directory")
351*da0073e9SAndroid Build Coastguard Worker    endif()
352*da0073e9SAndroid Build Coastguard Worker    if(NOT DEFINED PSIMD_SOURCE_DIR)
353*da0073e9SAndroid Build Coastguard Worker      set(PSIMD_SOURCE_DIR "${CAFFE2_THIRD_PARTY_ROOT}/psimd" CACHE STRING "PSimd source directory")
354*da0073e9SAndroid Build Coastguard Worker    endif()
355*da0073e9SAndroid Build Coastguard Worker    if(NOT DEFINED PTHREADPOOL_SOURCE_DIR)
356*da0073e9SAndroid Build Coastguard Worker      set(PTHREADPOOL_SOURCE_DIR "${CAFFE2_THIRD_PARTY_ROOT}/pthreadpool" CACHE STRING "pthreadpool source directory")
357*da0073e9SAndroid Build Coastguard Worker    endif()
358*da0073e9SAndroid Build Coastguard Worker  endif()
359*da0073e9SAndroid Build Coastguard Workerelse()
360*da0073e9SAndroid Build Coastguard Worker  set(DISABLE_NNPACK_AND_FAMILY ON)
361*da0073e9SAndroid Build Coastguard Workerendif()
362*da0073e9SAndroid Build Coastguard Worker
363*da0073e9SAndroid Build Coastguard Workerset(CONFU_DEPENDENCIES_SOURCE_DIR ${PROJECT_BINARY_DIR}/confu-srcs
364*da0073e9SAndroid Build Coastguard Worker  CACHE PATH "Confu-style dependencies source directory")
365*da0073e9SAndroid Build Coastguard Workerset(CONFU_DEPENDENCIES_BINARY_DIR ${PROJECT_BINARY_DIR}/confu-deps
366*da0073e9SAndroid Build Coastguard Worker  CACHE PATH "Confu-style dependencies binary directory")
367*da0073e9SAndroid Build Coastguard Worker
368*da0073e9SAndroid Build Coastguard Worker# ---[ pthreadpool
369*da0073e9SAndroid Build Coastguard Worker# Only add a dependency on pthreadpool if we are on a mobile build
370*da0073e9SAndroid Build Coastguard Worker# or are building any of the libraries in the {Q/X}NNPACK family.
371*da0073e9SAndroid Build Coastguard Workerif(INTERN_BUILD_MOBILE OR NOT DISABLE_NNPACK_AND_FAMILY)
372*da0073e9SAndroid Build Coastguard Worker  set(USE_PTHREADPOOL ON CACHE BOOL "" FORCE)
373*da0073e9SAndroid Build Coastguard Worker  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_PTHREADPOOL")
374*da0073e9SAndroid Build Coastguard Worker
375*da0073e9SAndroid Build Coastguard Worker  # Always use third_party/pthreadpool.
376*da0073e9SAndroid Build Coastguard Worker  set(USE_INTERNAL_PTHREADPOOL_IMPL OFF CACHE BOOL "" FORCE)
377*da0073e9SAndroid Build Coastguard Worker
378*da0073e9SAndroid Build Coastguard Worker  if(NOT TARGET pthreadpool)
379*da0073e9SAndroid Build Coastguard Worker    if(USE_SYSTEM_PTHREADPOOL)
380*da0073e9SAndroid Build Coastguard Worker      add_library(pthreadpool SHARED IMPORTED)
381*da0073e9SAndroid Build Coastguard Worker      find_library(PTHREADPOOL_LIBRARY pthreadpool)
382*da0073e9SAndroid Build Coastguard Worker      set_property(TARGET pthreadpool PROPERTY IMPORTED_LOCATION "${PTHREADPOOL_LIBRARY}")
383*da0073e9SAndroid Build Coastguard Worker      if(NOT PTHREADPOOL_LIBRARY)
384*da0073e9SAndroid Build Coastguard Worker        message(FATAL_ERROR "Cannot find pthreadpool")
385*da0073e9SAndroid Build Coastguard Worker      endif()
386*da0073e9SAndroid Build Coastguard Worker      message("-- Found pthreadpool: ${PTHREADPOOL_LIBRARY}")
387*da0073e9SAndroid Build Coastguard Worker    elseif(NOT USE_INTERNAL_PTHREADPOOL_IMPL)
388*da0073e9SAndroid Build Coastguard Worker      if(NOT DEFINED PTHREADPOOL_SOURCE_DIR)
389*da0073e9SAndroid Build Coastguard Worker        set(CAFFE2_THIRD_PARTY_ROOT "${PROJECT_SOURCE_DIR}/third_party")
390*da0073e9SAndroid Build Coastguard Worker        set(PTHREADPOOL_SOURCE_DIR "${CAFFE2_THIRD_PARTY_ROOT}/pthreadpool" CACHE STRING "pthreadpool source directory")
391*da0073e9SAndroid Build Coastguard Worker      endif()
392*da0073e9SAndroid Build Coastguard Worker
393*da0073e9SAndroid Build Coastguard Worker      set(PTHREADPOOL_BUILD_TESTS OFF CACHE BOOL "")
394*da0073e9SAndroid Build Coastguard Worker      set(PTHREADPOOL_BUILD_BENCHMARKS OFF CACHE BOOL "")
395*da0073e9SAndroid Build Coastguard Worker      set(PTHREADPOOL_LIBRARY_TYPE "static" CACHE STRING "")
396*da0073e9SAndroid Build Coastguard Worker      set(PTHREADPOOL_ALLOW_DEPRECATED_API ON CACHE BOOL "")
397*da0073e9SAndroid Build Coastguard Worker      add_subdirectory(
398*da0073e9SAndroid Build Coastguard Worker        "${PTHREADPOOL_SOURCE_DIR}"
399*da0073e9SAndroid Build Coastguard Worker        "${CONFU_DEPENDENCIES_BINARY_DIR}/pthreadpool")
400*da0073e9SAndroid Build Coastguard Worker      set_property(TARGET pthreadpool PROPERTY POSITION_INDEPENDENT_CODE ON)
401*da0073e9SAndroid Build Coastguard Worker    endif()
402*da0073e9SAndroid Build Coastguard Worker
403*da0073e9SAndroid Build Coastguard Worker    if(USE_INTERNAL_PTHREADPOOL_IMPL)
404*da0073e9SAndroid Build Coastguard Worker      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_INTERNAL_PTHREADPOOL_IMPL")
405*da0073e9SAndroid Build Coastguard Worker    else()
406*da0073e9SAndroid Build Coastguard Worker      list(APPEND Caffe2_DEPENDENCY_LIBS pthreadpool)
407*da0073e9SAndroid Build Coastguard Worker    endif()
408*da0073e9SAndroid Build Coastguard Worker  endif()
409*da0073e9SAndroid Build Coastguard Workerelse()
410*da0073e9SAndroid Build Coastguard Worker  set(USE_PTHREADPOOL OFF CACHE BOOL "" FORCE)
411*da0073e9SAndroid Build Coastguard Workerendif()
412*da0073e9SAndroid Build Coastguard Worker
413*da0073e9SAndroid Build Coastguard Workerif(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "^(s390x|ppc64le)$")
414*da0073e9SAndroid Build Coastguard Worker  # ---[ Caffe2 uses cpuinfo library in the thread pool
415*da0073e9SAndroid Build Coastguard Worker  # ---[ But it doesn't support s390x/powerpc and thus not used on s390x/powerpc
416*da0073e9SAndroid Build Coastguard Worker  if(NOT TARGET cpuinfo AND USE_SYSTEM_CPUINFO)
417*da0073e9SAndroid Build Coastguard Worker    add_library(cpuinfo SHARED IMPORTED)
418*da0073e9SAndroid Build Coastguard Worker    find_library(CPUINFO_LIBRARY cpuinfo)
419*da0073e9SAndroid Build Coastguard Worker    if(NOT CPUINFO_LIBRARY)
420*da0073e9SAndroid Build Coastguard Worker      message(FATAL_ERROR "Cannot find cpuinfo")
421*da0073e9SAndroid Build Coastguard Worker    endif()
422*da0073e9SAndroid Build Coastguard Worker    message("Found cpuinfo: ${CPUINFO_LIBRARY}")
423*da0073e9SAndroid Build Coastguard Worker    set_target_properties(cpuinfo PROPERTIES IMPORTED_LOCATION "${CPUINFO_LIBRARY}")
424*da0073e9SAndroid Build Coastguard Worker  elseif(NOT TARGET cpuinfo)
425*da0073e9SAndroid Build Coastguard Worker    if(NOT DEFINED CPUINFO_SOURCE_DIR)
426*da0073e9SAndroid Build Coastguard Worker      set(CPUINFO_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../third_party/cpuinfo" CACHE STRING "cpuinfo source directory")
427*da0073e9SAndroid Build Coastguard Worker    endif()
428*da0073e9SAndroid Build Coastguard Worker
429*da0073e9SAndroid Build Coastguard Worker    set(CPUINFO_BUILD_TOOLS OFF CACHE BOOL "")
430*da0073e9SAndroid Build Coastguard Worker    set(CPUINFO_BUILD_UNIT_TESTS OFF CACHE BOOL "")
431*da0073e9SAndroid Build Coastguard Worker    set(CPUINFO_BUILD_MOCK_TESTS OFF CACHE BOOL "")
432*da0073e9SAndroid Build Coastguard Worker    set(CPUINFO_BUILD_BENCHMARKS OFF CACHE BOOL "")
433*da0073e9SAndroid Build Coastguard Worker    set(CPUINFO_LIBRARY_TYPE "static" CACHE STRING "")
434*da0073e9SAndroid Build Coastguard Worker    set(CPUINFO_LOG_LEVEL "error" CACHE STRING "")
435*da0073e9SAndroid Build Coastguard Worker    if(MSVC)
436*da0073e9SAndroid Build Coastguard Worker      if(CAFFE2_USE_MSVC_STATIC_RUNTIME)
437*da0073e9SAndroid Build Coastguard Worker        set(CPUINFO_RUNTIME_TYPE "static" CACHE STRING "")
438*da0073e9SAndroid Build Coastguard Worker      else()
439*da0073e9SAndroid Build Coastguard Worker        set(CPUINFO_RUNTIME_TYPE "shared" CACHE STRING "")
440*da0073e9SAndroid Build Coastguard Worker      endif()
441*da0073e9SAndroid Build Coastguard Worker    endif()
442*da0073e9SAndroid Build Coastguard Worker    add_subdirectory(
443*da0073e9SAndroid Build Coastguard Worker      "${CPUINFO_SOURCE_DIR}"
444*da0073e9SAndroid Build Coastguard Worker      "${CONFU_DEPENDENCIES_BINARY_DIR}/cpuinfo")
445*da0073e9SAndroid Build Coastguard Worker    # We build static version of cpuinfo but link
446*da0073e9SAndroid Build Coastguard Worker    # them into a shared library for Caffe2, so they need PIC.
447*da0073e9SAndroid Build Coastguard Worker    set_property(TARGET cpuinfo PROPERTY POSITION_INDEPENDENT_CODE ON)
448*da0073e9SAndroid Build Coastguard Worker  endif()
449*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS cpuinfo)
450*da0073e9SAndroid Build Coastguard Workerendif()
451*da0073e9SAndroid Build Coastguard Worker
452*da0073e9SAndroid Build Coastguard Worker
453*da0073e9SAndroid Build Coastguard Worker# ---[ PYTORCH_QNNPACK
454*da0073e9SAndroid Build Coastguard Workerset(CAFFE2_THIRD_PARTY_ROOT "${PROJECT_SOURCE_DIR}/third_party")
455*da0073e9SAndroid Build Coastguard Workerif(USE_PYTORCH_QNNPACK)
456*da0073e9SAndroid Build Coastguard Worker    if(NOT DEFINED PYTORCH_QNNPACK_SOURCE_DIR)
457*da0073e9SAndroid Build Coastguard Worker      set(PYTORCH_QNNPACK_SOURCE_DIR "${PROJECT_SOURCE_DIR}/aten/src/ATen/native/quantized/cpu/qnnpack" CACHE STRING "QNNPACK source directory")
458*da0073e9SAndroid Build Coastguard Worker    endif()
459*da0073e9SAndroid Build Coastguard Worker
460*da0073e9SAndroid Build Coastguard Worker    if(NOT TARGET pytorch_qnnpack)
461*da0073e9SAndroid Build Coastguard Worker      if(NOT USE_SYSTEM_PTHREADPOOL AND USE_INTERNAL_PTHREADPOOL_IMPL)
462*da0073e9SAndroid Build Coastguard Worker        set(PYTORCH_QNNPACK_CUSTOM_THREADPOOL ON CACHE BOOL "")
463*da0073e9SAndroid Build Coastguard Worker      endif()
464*da0073e9SAndroid Build Coastguard Worker
465*da0073e9SAndroid Build Coastguard Worker      set(PYTORCH_QNNPACK_BUILD_TESTS OFF CACHE BOOL "")
466*da0073e9SAndroid Build Coastguard Worker      set(PYTORCH_QNNPACK_BUILD_BENCHMARKS OFF CACHE BOOL "")
467*da0073e9SAndroid Build Coastguard Worker      set(PYTORCH_QNNPACK_LIBRARY_TYPE "static" CACHE STRING "")
468*da0073e9SAndroid Build Coastguard Worker      add_subdirectory(
469*da0073e9SAndroid Build Coastguard Worker        "${PYTORCH_QNNPACK_SOURCE_DIR}"
470*da0073e9SAndroid Build Coastguard Worker        "${CONFU_DEPENDENCIES_BINARY_DIR}/pytorch_qnnpack")
471*da0073e9SAndroid Build Coastguard Worker      # We build static versions of QNNPACK and pthreadpool but link
472*da0073e9SAndroid Build Coastguard Worker      # them into a shared library for Caffe2, so they need PIC.
473*da0073e9SAndroid Build Coastguard Worker      set_property(TARGET pytorch_qnnpack PROPERTY POSITION_INDEPENDENT_CODE ON)
474*da0073e9SAndroid Build Coastguard Worker      set_property(TARGET cpuinfo PROPERTY POSITION_INDEPENDENT_CODE ON)
475*da0073e9SAndroid Build Coastguard Worker      # QNNPACK depends on gemmlowp headers
476*da0073e9SAndroid Build Coastguard Worker      target_include_directories(pytorch_qnnpack PRIVATE "${CAFFE2_THIRD_PARTY_ROOT}/gemmlowp")
477*da0073e9SAndroid Build Coastguard Worker
478*da0073e9SAndroid Build Coastguard Worker      if(PYTORCH_QNNPACK_CUSTOM_THREADPOOL)
479*da0073e9SAndroid Build Coastguard Worker        target_compile_definitions(
480*da0073e9SAndroid Build Coastguard Worker          pytorch_qnnpack PRIVATE
481*da0073e9SAndroid Build Coastguard Worker          pthreadpool_t=legacy_pthreadpool_t
482*da0073e9SAndroid Build Coastguard Worker          pthreadpool_function_1d_t=legacy_pthreadpool_function_1d_t
483*da0073e9SAndroid Build Coastguard Worker          pthreadpool_function_1d_tiled_t=legacy_pthreadpool_function_1d_tiled_t
484*da0073e9SAndroid Build Coastguard Worker          pthreadpool_function_2d_t=legacy_pthreadpool_function_2d_t
485*da0073e9SAndroid Build Coastguard Worker          pthreadpool_function_2d_tiled_t=legacy_pthreadpool_function_2d_tiled_t
486*da0073e9SAndroid Build Coastguard Worker          pthreadpool_function_3d_tiled_t=legacy_pthreadpool_function_3d_tiled_t
487*da0073e9SAndroid Build Coastguard Worker          pthreadpool_function_4d_tiled_t=legacy_pthreadpool_function_4d_tiled_t
488*da0073e9SAndroid Build Coastguard Worker          pthreadpool_create=legacy_pthreadpool_create
489*da0073e9SAndroid Build Coastguard Worker          pthreadpool_destroy=legacy_pthreadpool_destroy
490*da0073e9SAndroid Build Coastguard Worker          pthreadpool_get_threads_count=legacy_pthreadpool_get_threads_count
491*da0073e9SAndroid Build Coastguard Worker          pthreadpool_compute_1d=legacy_pthreadpool_compute_1d
492*da0073e9SAndroid Build Coastguard Worker          pthreadpool_parallelize_1d=legacy_pthreadpool_parallelize_1d
493*da0073e9SAndroid Build Coastguard Worker          pthreadpool_compute_1d_tiled=legacy_pthreadpool_compute_1d_tiled
494*da0073e9SAndroid Build Coastguard Worker          pthreadpool_compute_2d=legacy_pthreadpool_compute_2d
495*da0073e9SAndroid Build Coastguard Worker          pthreadpool_compute_2d_tiled=legacy_pthreadpool_compute_2d_tiled
496*da0073e9SAndroid Build Coastguard Worker          pthreadpool_compute_3d_tiled=legacy_pthreadpool_compute_3d_tiled
497*da0073e9SAndroid Build Coastguard Worker          pthreadpool_compute_4d_tiled=legacy_pthreadpool_compute_4d_tiled)
498*da0073e9SAndroid Build Coastguard Worker      endif()
499*da0073e9SAndroid Build Coastguard Worker    endif()
500*da0073e9SAndroid Build Coastguard Worker
501*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_DEPENDENCY_LIBS pytorch_qnnpack)
502*da0073e9SAndroid Build Coastguard Workerendif()
503*da0073e9SAndroid Build Coastguard Worker
504*da0073e9SAndroid Build Coastguard Worker# ---[ NNPACK
505*da0073e9SAndroid Build Coastguard Workerif(USE_NNPACK)
506*da0073e9SAndroid Build Coastguard Worker  include(${CMAKE_CURRENT_LIST_DIR}/External/nnpack.cmake)
507*da0073e9SAndroid Build Coastguard Worker  if(NNPACK_FOUND)
508*da0073e9SAndroid Build Coastguard Worker    if(TARGET nnpack)
509*da0073e9SAndroid Build Coastguard Worker      # ---[ NNPACK is being built together with Caffe2: explicitly specify dependency
510*da0073e9SAndroid Build Coastguard Worker      list(APPEND Caffe2_DEPENDENCY_LIBS nnpack)
511*da0073e9SAndroid Build Coastguard Worker    else()
512*da0073e9SAndroid Build Coastguard Worker      include_directories(SYSTEM ${NNPACK_INCLUDE_DIRS})
513*da0073e9SAndroid Build Coastguard Worker      list(APPEND Caffe2_DEPENDENCY_LIBS ${NNPACK_LIBRARIES})
514*da0073e9SAndroid Build Coastguard Worker    endif()
515*da0073e9SAndroid Build Coastguard Worker  else()
516*da0073e9SAndroid Build Coastguard Worker    message(WARNING "Not compiling with NNPACK. Suppress this warning with -DUSE_NNPACK=OFF")
517*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_NNPACK OFF)
518*da0073e9SAndroid Build Coastguard Worker  endif()
519*da0073e9SAndroid Build Coastguard Workerendif()
520*da0073e9SAndroid Build Coastguard Worker
521*da0073e9SAndroid Build Coastguard Worker# ---[ XNNPACK
522*da0073e9SAndroid Build Coastguard Workerif(USE_XNNPACK AND NOT USE_SYSTEM_XNNPACK)
523*da0073e9SAndroid Build Coastguard Worker  if(NOT DEFINED XNNPACK_SOURCE_DIR)
524*da0073e9SAndroid Build Coastguard Worker    set(XNNPACK_SOURCE_DIR "${CAFFE2_THIRD_PARTY_ROOT}/XNNPACK" CACHE STRING "XNNPACK source directory")
525*da0073e9SAndroid Build Coastguard Worker  endif()
526*da0073e9SAndroid Build Coastguard Worker
527*da0073e9SAndroid Build Coastguard Worker  if(NOT DEFINED XNNPACK_INCLUDE_DIR)
528*da0073e9SAndroid Build Coastguard Worker    set(XNNPACK_INCLUDE_DIR "${XNNPACK_SOURCE_DIR}/include" CACHE STRING "XNNPACK include directory")
529*da0073e9SAndroid Build Coastguard Worker  endif()
530*da0073e9SAndroid Build Coastguard Worker
531*da0073e9SAndroid Build Coastguard Worker  if(NOT TARGET XNNPACK)
532*da0073e9SAndroid Build Coastguard Worker    set(XNNPACK_LIBRARY_TYPE "static" CACHE STRING "")
533*da0073e9SAndroid Build Coastguard Worker    set(XNNPACK_BUILD_BENCHMARKS OFF CACHE BOOL "")
534*da0073e9SAndroid Build Coastguard Worker    set(XNNPACK_BUILD_TESTS OFF CACHE BOOL "")
535*da0073e9SAndroid Build Coastguard Worker
536*da0073e9SAndroid Build Coastguard Worker    # Disable ARM BF16 and FP16 vector for now; unused and causes build failures because
537*da0073e9SAndroid Build Coastguard Worker    # these new ISA features may not be supported on older compilers
538*da0073e9SAndroid Build Coastguard Worker    set(XNNPACK_ENABLE_ARM_BF16 OFF CACHE BOOL "")
539*da0073e9SAndroid Build Coastguard Worker
540*da0073e9SAndroid Build Coastguard Worker    # Disable AVXVNNI for now, older clang versions seem not to support it
541*da0073e9SAndroid Build Coastguard Worker    # (clang 12 is where avx-vnni support is added)
542*da0073e9SAndroid Build Coastguard Worker    set(XNNPACK_ENABLE_AVXVNNI OFF CACHE BOOL "")
543*da0073e9SAndroid Build Coastguard Worker
544*da0073e9SAndroid Build Coastguard Worker    # Disable I8MM For CI since clang 9 does not support neon i8mm.
545*da0073e9SAndroid Build Coastguard Worker    set(XNNPACK_ENABLE_ARM_I8MM OFF CACHE BOOL "")
546*da0073e9SAndroid Build Coastguard Worker
547*da0073e9SAndroid Build Coastguard Worker    # Conditionally disable AVX512AMX, as it requires Clang 11 or later. Note that
548*da0073e9SAndroid Build Coastguard Worker    # XNNPACK does conditionally compile this based on GCC version. Once it also does
549*da0073e9SAndroid Build Coastguard Worker    # so based on Clang version, this logic can be removed.
550*da0073e9SAndroid Build Coastguard Worker    IF(CMAKE_C_COMPILER_ID STREQUAL "Clang")
551*da0073e9SAndroid Build Coastguard Worker      IF(CMAKE_C_COMPILER_VERSION VERSION_LESS "11")
552*da0073e9SAndroid Build Coastguard Worker        set(XNNPACK_ENABLE_AVX512AMX OFF CACHE BOOL "")
553*da0073e9SAndroid Build Coastguard Worker      ENDIF()
554*da0073e9SAndroid Build Coastguard Worker    ENDIF()
555*da0073e9SAndroid Build Coastguard Worker
556*da0073e9SAndroid Build Coastguard Worker    # Setting this global PIC flag for all XNNPACK targets.
557*da0073e9SAndroid Build Coastguard Worker    # This is needed for Object libraries within XNNPACK which must
558*da0073e9SAndroid Build Coastguard Worker    # be PIC to successfully link this static libXNNPACK with pytorch
559*da0073e9SAndroid Build Coastguard Worker    set(__caffe2_CMAKE_POSITION_INDEPENDENT_CODE_FLAG ${CMAKE_POSITION_INDEPENDENT_CODE})
560*da0073e9SAndroid Build Coastguard Worker    set(CMAKE_POSITION_INDEPENDENT_CODE ON)
561*da0073e9SAndroid Build Coastguard Worker
562*da0073e9SAndroid Build Coastguard Worker    add_subdirectory(
563*da0073e9SAndroid Build Coastguard Worker      "${XNNPACK_SOURCE_DIR}"
564*da0073e9SAndroid Build Coastguard Worker      "${CONFU_DEPENDENCIES_BINARY_DIR}/XNNPACK")
565*da0073e9SAndroid Build Coastguard Worker
566*da0073e9SAndroid Build Coastguard Worker    # Revert to whatever it was before
567*da0073e9SAndroid Build Coastguard Worker    set(CMAKE_POSITION_INDEPENDENT_CODE ${__caffe2_CMAKE_POSITION_INDEPENDENT_CODE_FLAG})
568*da0073e9SAndroid Build Coastguard Worker  endif()
569*da0073e9SAndroid Build Coastguard Worker
570*da0073e9SAndroid Build Coastguard Worker  include_directories(SYSTEM ${XNNPACK_INCLUDE_DIR})
571*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS XNNPACK)
572*da0073e9SAndroid Build Coastguard Workerelseif(NOT TARGET XNNPACK AND USE_SYSTEM_XNNPACK)
573*da0073e9SAndroid Build Coastguard Worker  add_library(XNNPACK SHARED IMPORTED)
574*da0073e9SAndroid Build Coastguard Worker  find_library(XNNPACK_LIBRARY XNNPACK)
575*da0073e9SAndroid Build Coastguard Worker  set_property(TARGET XNNPACK PROPERTY IMPORTED_LOCATION "${XNNPACK_LIBRARY}")
576*da0073e9SAndroid Build Coastguard Worker  if(NOT XNNPACK_LIBRARY)
577*da0073e9SAndroid Build Coastguard Worker    message(FATAL_ERROR "Cannot find XNNPACK")
578*da0073e9SAndroid Build Coastguard Worker  endif()
579*da0073e9SAndroid Build Coastguard Worker  message("-- Found XNNPACK: ${XNNPACK_LIBRARY}")
580*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS XNNPACK)
581*da0073e9SAndroid Build Coastguard Workerendif()
582*da0073e9SAndroid Build Coastguard Worker
583*da0073e9SAndroid Build Coastguard Worker# ---[ Vulkan deps
584*da0073e9SAndroid Build Coastguard Workerif(USE_VULKAN)
585*da0073e9SAndroid Build Coastguard Worker  set(Vulkan_DEFINES)
586*da0073e9SAndroid Build Coastguard Worker  set(Vulkan_INCLUDES)
587*da0073e9SAndroid Build Coastguard Worker  set(Vulkan_LIBS)
588*da0073e9SAndroid Build Coastguard Worker  include(${CMAKE_CURRENT_LIST_DIR}/VulkanDependencies.cmake)
589*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS ${Vulkan_DEFINES})
590*da0073e9SAndroid Build Coastguard Worker  include_directories(SYSTEM ${Vulkan_INCLUDES})
591*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS ${Vulkan_LIBS})
592*da0073e9SAndroid Build Coastguard Workerendif()
593*da0073e9SAndroid Build Coastguard Worker
594*da0073e9SAndroid Build Coastguard Worker# ---[ gflags
595*da0073e9SAndroid Build Coastguard Workerif(USE_GFLAGS)
596*da0073e9SAndroid Build Coastguard Worker  include(${CMAKE_CURRENT_LIST_DIR}/public/gflags.cmake)
597*da0073e9SAndroid Build Coastguard Worker  if(NOT TARGET gflags)
598*da0073e9SAndroid Build Coastguard Worker    message(WARNING
599*da0073e9SAndroid Build Coastguard Worker        "gflags is not found. Caffe2 will build without gflags support but "
600*da0073e9SAndroid Build Coastguard Worker        "it is strongly recommended that you install gflags. Suppress this "
601*da0073e9SAndroid Build Coastguard Worker        "warning with -DUSE_GFLAGS=OFF")
602*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_GFLAGS OFF)
603*da0073e9SAndroid Build Coastguard Worker  endif()
604*da0073e9SAndroid Build Coastguard Workerendif()
605*da0073e9SAndroid Build Coastguard Worker
606*da0073e9SAndroid Build Coastguard Worker# ---[ Google-glog
607*da0073e9SAndroid Build Coastguard Workerif(USE_GLOG)
608*da0073e9SAndroid Build Coastguard Worker  include(${CMAKE_CURRENT_LIST_DIR}/public/glog.cmake)
609*da0073e9SAndroid Build Coastguard Worker  if(TARGET glog::glog)
610*da0073e9SAndroid Build Coastguard Worker    set(CAFFE2_USE_GOOGLE_GLOG 1)
611*da0073e9SAndroid Build Coastguard Worker  else()
612*da0073e9SAndroid Build Coastguard Worker    message(WARNING
613*da0073e9SAndroid Build Coastguard Worker        "glog is not found. Caffe2 will build without glog support but it is "
614*da0073e9SAndroid Build Coastguard Worker        "strongly recommended that you install glog. Suppress this warning "
615*da0073e9SAndroid Build Coastguard Worker        "with -DUSE_GLOG=OFF")
616*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_GLOG OFF)
617*da0073e9SAndroid Build Coastguard Worker  endif()
618*da0073e9SAndroid Build Coastguard Workerendif()
619*da0073e9SAndroid Build Coastguard Worker
620*da0073e9SAndroid Build Coastguard Worker
621*da0073e9SAndroid Build Coastguard Worker# ---[ Googletest and benchmark
622*da0073e9SAndroid Build Coastguard Workerif(BUILD_TEST OR BUILD_MOBILE_BENCHMARK OR BUILD_MOBILE_TEST)
623*da0073e9SAndroid Build Coastguard Worker  # Preserve build options.
624*da0073e9SAndroid Build Coastguard Worker  set(TEMP_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
625*da0073e9SAndroid Build Coastguard Worker
626*da0073e9SAndroid Build Coastguard Worker  # We will build gtest as static libs and embed it directly into the binary.
627*da0073e9SAndroid Build Coastguard Worker  set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libs" FORCE)
628*da0073e9SAndroid Build Coastguard Worker
629*da0073e9SAndroid Build Coastguard Worker  # For gtest, we will simply embed it into our test binaries, so we won't
630*da0073e9SAndroid Build Coastguard Worker  # need to install it.
631*da0073e9SAndroid Build Coastguard Worker  set(INSTALL_GTEST OFF CACHE BOOL "Install gtest." FORCE)
632*da0073e9SAndroid Build Coastguard Worker  set(BUILD_GMOCK ON CACHE BOOL "Build gmock." FORCE)
633*da0073e9SAndroid Build Coastguard Worker  # For Windows, we will check the runtime used is correctly passed in.
634*da0073e9SAndroid Build Coastguard Worker  if(NOT CAFFE2_USE_MSVC_STATIC_RUNTIME)
635*da0073e9SAndroid Build Coastguard Worker      set(gtest_force_shared_crt ON CACHE BOOL "force shared crt on gtest" FORCE)
636*da0073e9SAndroid Build Coastguard Worker  endif()
637*da0073e9SAndroid Build Coastguard Worker  # We need to replace googletest cmake scripts too.
638*da0073e9SAndroid Build Coastguard Worker  # Otherwise, it will sometimes break the build.
639*da0073e9SAndroid Build Coastguard Worker  # To make the git clean after the build, we make a backup first.
640*da0073e9SAndroid Build Coastguard Worker  if((MSVC AND MSVC_Z7_OVERRIDE) OR USE_CUDA)
641*da0073e9SAndroid Build Coastguard Worker    execute_process(
642*da0073e9SAndroid Build Coastguard Worker      COMMAND ${CMAKE_COMMAND}
643*da0073e9SAndroid Build Coastguard Worker              "-DFILENAME=${CMAKE_CURRENT_LIST_DIR}/../third_party/googletest/googletest/cmake/internal_utils.cmake"
644*da0073e9SAndroid Build Coastguard Worker              "-DBACKUP=${CMAKE_CURRENT_LIST_DIR}/../third_party/googletest/googletest/cmake/internal_utils.cmake.bak"
645*da0073e9SAndroid Build Coastguard Worker              "-DREVERT=0"
646*da0073e9SAndroid Build Coastguard Worker              "-P"
647*da0073e9SAndroid Build Coastguard Worker              "${CMAKE_CURRENT_LIST_DIR}/GoogleTestPatch.cmake"
648*da0073e9SAndroid Build Coastguard Worker      RESULT_VARIABLE _exitcode)
649*da0073e9SAndroid Build Coastguard Worker    if(NOT _exitcode EQUAL 0)
650*da0073e9SAndroid Build Coastguard Worker      message(WARNING "Patching failed for Google Test. The build may fail.")
651*da0073e9SAndroid Build Coastguard Worker    endif()
652*da0073e9SAndroid Build Coastguard Worker  endif()
653*da0073e9SAndroid Build Coastguard Worker
654*da0073e9SAndroid Build Coastguard Worker  # Add googletest subdirectory but make sure our INCLUDE_DIRECTORIES
655*da0073e9SAndroid Build Coastguard Worker  # don't bleed into it. This is because libraries installed into the root conda
656*da0073e9SAndroid Build Coastguard Worker  # env (e.g. MKL) add a global /opt/conda/include directory, and if there's
657*da0073e9SAndroid Build Coastguard Worker  # gtest installed in conda, the third_party/googletest/**.cc source files
658*da0073e9SAndroid Build Coastguard Worker  # would try to include headers from /opt/conda/include/gtest/**.h instead of
659*da0073e9SAndroid Build Coastguard Worker  # its own. Once we have proper target-based include directories,
660*da0073e9SAndroid Build Coastguard Worker  # this shouldn't be necessary anymore.
661*da0073e9SAndroid Build Coastguard Worker  get_property(INC_DIR_temp DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
662*da0073e9SAndroid Build Coastguard Worker  set_property(DIRECTORY PROPERTY INCLUDE_DIRECTORIES "")
663*da0073e9SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../third_party/googletest)
664*da0073e9SAndroid Build Coastguard Worker  set_property(DIRECTORY PROPERTY INCLUDE_DIRECTORIES ${INC_DIR_temp})
665*da0073e9SAndroid Build Coastguard Worker
666*da0073e9SAndroid Build Coastguard Worker  include_directories(BEFORE SYSTEM ${CMAKE_CURRENT_LIST_DIR}/../third_party/googletest/googletest/include)
667*da0073e9SAndroid Build Coastguard Worker  include_directories(BEFORE SYSTEM ${CMAKE_CURRENT_LIST_DIR}/../third_party/googletest/googlemock/include)
668*da0073e9SAndroid Build Coastguard Worker
669*da0073e9SAndroid Build Coastguard Worker  # We will not need to test benchmark lib itself.
670*da0073e9SAndroid Build Coastguard Worker  set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "Disable benchmark testing as we don't need it.")
671*da0073e9SAndroid Build Coastguard Worker  # We will not need to install benchmark since we link it statically.
672*da0073e9SAndroid Build Coastguard Worker  set(BENCHMARK_ENABLE_INSTALL OFF CACHE BOOL "Disable benchmark install to avoid overwriting vendor install.")
673*da0073e9SAndroid Build Coastguard Worker  if(NOT USE_SYSTEM_BENCHMARK)
674*da0073e9SAndroid Build Coastguard Worker    add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../third_party/benchmark)
675*da0073e9SAndroid Build Coastguard Worker  else()
676*da0073e9SAndroid Build Coastguard Worker    add_library(benchmark SHARED IMPORTED)
677*da0073e9SAndroid Build Coastguard Worker    find_library(BENCHMARK_LIBRARY benchmark)
678*da0073e9SAndroid Build Coastguard Worker    if(NOT BENCHMARK_LIBRARY)
679*da0073e9SAndroid Build Coastguard Worker      message(FATAL_ERROR "Cannot find google benchmark library")
680*da0073e9SAndroid Build Coastguard Worker    endif()
681*da0073e9SAndroid Build Coastguard Worker    message("-- Found benchmark: ${BENCHMARK_LIBRARY}")
682*da0073e9SAndroid Build Coastguard Worker    set_property(TARGET benchmark PROPERTY IMPORTED_LOCATION ${BENCHMARK_LIBRARY})
683*da0073e9SAndroid Build Coastguard Worker  endif()
684*da0073e9SAndroid Build Coastguard Worker  include_directories(${CMAKE_CURRENT_LIST_DIR}/../third_party/benchmark/include)
685*da0073e9SAndroid Build Coastguard Worker
686*da0073e9SAndroid Build Coastguard Worker  # Recover build options.
687*da0073e9SAndroid Build Coastguard Worker  set(BUILD_SHARED_LIBS ${TEMP_BUILD_SHARED_LIBS} CACHE BOOL "Build shared libs" FORCE)
688*da0073e9SAndroid Build Coastguard Worker
689*da0073e9SAndroid Build Coastguard Worker  # To make the git clean after the build, we revert the changes here.
690*da0073e9SAndroid Build Coastguard Worker  if(MSVC AND MSVC_Z7_OVERRIDE)
691*da0073e9SAndroid Build Coastguard Worker    execute_process(
692*da0073e9SAndroid Build Coastguard Worker      COMMAND ${CMAKE_COMMAND}
693*da0073e9SAndroid Build Coastguard Worker              "-DFILENAME=${CMAKE_CURRENT_LIST_DIR}/../third_party/googletest/googletest/cmake/internal_utils.cmake"
694*da0073e9SAndroid Build Coastguard Worker              "-DBACKUP=${CMAKE_CURRENT_LIST_DIR}/../third_party/googletest/googletest/cmake/internal_utils.cmake.bak"
695*da0073e9SAndroid Build Coastguard Worker              "-DREVERT=1"
696*da0073e9SAndroid Build Coastguard Worker              "-P"
697*da0073e9SAndroid Build Coastguard Worker              "${CMAKE_CURRENT_LIST_DIR}/GoogleTestPatch.cmake"
698*da0073e9SAndroid Build Coastguard Worker      RESULT_VARIABLE _exitcode)
699*da0073e9SAndroid Build Coastguard Worker    if(NOT _exitcode EQUAL 0)
700*da0073e9SAndroid Build Coastguard Worker      message(WARNING "Reverting changes failed for Google Test. The build may fail.")
701*da0073e9SAndroid Build Coastguard Worker    endif()
702*da0073e9SAndroid Build Coastguard Worker  endif()
703*da0073e9SAndroid Build Coastguard Worker
704*da0073e9SAndroid Build Coastguard Worker  # Cacheing variables to enable incremental build.
705*da0073e9SAndroid Build Coastguard Worker  # Without this is cross compiling we end up having to blow build directory
706*da0073e9SAndroid Build Coastguard Worker  # and rebuild from scratch.
707*da0073e9SAndroid Build Coastguard Worker  if(CMAKE_CROSSCOMPILING)
708*da0073e9SAndroid Build Coastguard Worker    if(COMPILE_HAVE_STD_REGEX)
709*da0073e9SAndroid Build Coastguard Worker      set(RUN_HAVE_STD_REGEX 0 CACHE INTERNAL "Cache RUN_HAVE_STD_REGEX output for cross-compile.")
710*da0073e9SAndroid Build Coastguard Worker    endif()
711*da0073e9SAndroid Build Coastguard Worker  endif()
712*da0073e9SAndroid Build Coastguard Workerendif()
713*da0073e9SAndroid Build Coastguard Worker
714*da0073e9SAndroid Build Coastguard Worker# ---[ FBGEMM
715*da0073e9SAndroid Build Coastguard Workerif(USE_FBGEMM)
716*da0073e9SAndroid Build Coastguard Worker  set(CAFFE2_THIRD_PARTY_ROOT "${PROJECT_SOURCE_DIR}/third_party")
717*da0073e9SAndroid Build Coastguard Worker  if(NOT DEFINED FBGEMM_SOURCE_DIR)
718*da0073e9SAndroid Build Coastguard Worker    set(FBGEMM_SOURCE_DIR "${CAFFE2_THIRD_PARTY_ROOT}/fbgemm" CACHE STRING "FBGEMM source directory")
719*da0073e9SAndroid Build Coastguard Worker  endif()
720*da0073e9SAndroid Build Coastguard Worker  if(NOT CAFFE2_COMPILER_SUPPORTS_AVX512_EXTENSIONS)
721*da0073e9SAndroid Build Coastguard Worker    message(WARNING
722*da0073e9SAndroid Build Coastguard Worker      "A compiler with AVX512 support is required for FBGEMM. "
723*da0073e9SAndroid Build Coastguard Worker      "Not compiling with FBGEMM. "
724*da0073e9SAndroid Build Coastguard Worker      "Turn this warning off by USE_FBGEMM=OFF.")
725*da0073e9SAndroid Build Coastguard Worker    set(USE_FBGEMM OFF)
726*da0073e9SAndroid Build Coastguard Worker  endif()
727*da0073e9SAndroid Build Coastguard Worker  if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
728*da0073e9SAndroid Build Coastguard Worker    message(WARNING
729*da0073e9SAndroid Build Coastguard Worker      "x64 operating system is required for FBGEMM. "
730*da0073e9SAndroid Build Coastguard Worker      "Not compiling with FBGEMM. "
731*da0073e9SAndroid Build Coastguard Worker      "Turn this warning off by USE_FBGEMM=OFF.")
732*da0073e9SAndroid Build Coastguard Worker    set(USE_FBGEMM OFF)
733*da0073e9SAndroid Build Coastguard Worker  endif()
734*da0073e9SAndroid Build Coastguard Worker  if(USE_FBGEMM AND NOT TARGET fbgemm)
735*da0073e9SAndroid Build Coastguard Worker    set(FBGEMM_BUILD_TESTS OFF CACHE BOOL "")
736*da0073e9SAndroid Build Coastguard Worker    set(FBGEMM_BUILD_BENCHMARKS OFF CACHE BOOL "")
737*da0073e9SAndroid Build Coastguard Worker    if(MSVC AND BUILD_SHARED_LIBS)
738*da0073e9SAndroid Build Coastguard Worker      set(FBGEMM_LIBRARY_TYPE "shared" CACHE STRING "")
739*da0073e9SAndroid Build Coastguard Worker    else()
740*da0073e9SAndroid Build Coastguard Worker      set(FBGEMM_LIBRARY_TYPE "static" CACHE STRING "")
741*da0073e9SAndroid Build Coastguard Worker    endif()
742*da0073e9SAndroid Build Coastguard Worker    if(USE_ASAN)
743*da0073e9SAndroid Build Coastguard Worker      set(USE_SANITIZER "address,undefined" CACHE STRING "-fsanitize options for FBGEMM")
744*da0073e9SAndroid Build Coastguard Worker    endif()
745*da0073e9SAndroid Build Coastguard Worker    add_subdirectory("${FBGEMM_SOURCE_DIR}")
746*da0073e9SAndroid Build Coastguard Worker    set_property(TARGET fbgemm_generic PROPERTY POSITION_INDEPENDENT_CODE ON)
747*da0073e9SAndroid Build Coastguard Worker    set_property(TARGET fbgemm_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON)
748*da0073e9SAndroid Build Coastguard Worker    set_property(TARGET fbgemm_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON)
749*da0073e9SAndroid Build Coastguard Worker    set_property(TARGET fbgemm PROPERTY POSITION_INDEPENDENT_CODE ON)
750*da0073e9SAndroid Build Coastguard Worker    if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 13.0.0)
751*da0073e9SAndroid Build Coastguard Worker      # See https://github.com/pytorch/pytorch/issues/74352
752*da0073e9SAndroid Build Coastguard Worker      target_compile_options_if_supported(asmjit -Wno-deprecated-copy)
753*da0073e9SAndroid Build Coastguard Worker      target_compile_options_if_supported(asmjit -Wno-unused-but-set-variable)
754*da0073e9SAndroid Build Coastguard Worker    endif()
755*da0073e9SAndroid Build Coastguard Worker  endif()
756*da0073e9SAndroid Build Coastguard Worker
757*da0073e9SAndroid Build Coastguard Worker  if(USE_FBGEMM)
758*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_DEPENDENCY_LIBS fbgemm)
759*da0073e9SAndroid Build Coastguard Worker  endif()
760*da0073e9SAndroid Build Coastguard Workerendif()
761*da0073e9SAndroid Build Coastguard Worker
762*da0073e9SAndroid Build Coastguard Workerif(USE_FBGEMM)
763*da0073e9SAndroid Build Coastguard Worker  caffe2_update_option(USE_FBGEMM ON)
764*da0073e9SAndroid Build Coastguard Workerelse()
765*da0073e9SAndroid Build Coastguard Worker  caffe2_update_option(USE_FBGEMM OFF)
766*da0073e9SAndroid Build Coastguard Worker  message(WARNING
767*da0073e9SAndroid Build Coastguard Worker    "Turning USE_FAKELOWP off as it depends on USE_FBGEMM.")
768*da0073e9SAndroid Build Coastguard Worker  caffe2_update_option(USE_FAKELOWP OFF)
769*da0073e9SAndroid Build Coastguard Workerendif()
770*da0073e9SAndroid Build Coastguard Worker
771*da0073e9SAndroid Build Coastguard Workerif(USE_OPENCL)
772*da0073e9SAndroid Build Coastguard Worker  message(INFO "USING OPENCL")
773*da0073e9SAndroid Build Coastguard Worker  find_package(OpenCL REQUIRED)
774*da0073e9SAndroid Build Coastguard Worker  include_directories(SYSTEM ${OpenCL_INCLUDE_DIRS})
775*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS ${OpenCL_LIBRARIES})
776*da0073e9SAndroid Build Coastguard Workerendif()
777*da0073e9SAndroid Build Coastguard Worker
778*da0073e9SAndroid Build Coastguard Worker# ---[ NUMA
779*da0073e9SAndroid Build Coastguard Workerif(USE_NUMA)
780*da0073e9SAndroid Build Coastguard Worker  if(LINUX)
781*da0073e9SAndroid Build Coastguard Worker    find_package(Numa)
782*da0073e9SAndroid Build Coastguard Worker    if(NOT NUMA_FOUND)
783*da0073e9SAndroid Build Coastguard Worker      message(WARNING "Not compiling with NUMA. Suppress this warning with -DUSE_NUMA=OFF")
784*da0073e9SAndroid Build Coastguard Worker      caffe2_update_option(USE_NUMA OFF)
785*da0073e9SAndroid Build Coastguard Worker    endif()
786*da0073e9SAndroid Build Coastguard Worker  else()
787*da0073e9SAndroid Build Coastguard Worker    message(WARNING "NUMA is currently only supported under Linux.")
788*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_NUMA OFF)
789*da0073e9SAndroid Build Coastguard Worker  endif()
790*da0073e9SAndroid Build Coastguard Workerendif()
791*da0073e9SAndroid Build Coastguard Worker
792*da0073e9SAndroid Build Coastguard Workerif(USE_ITT)
793*da0073e9SAndroid Build Coastguard Worker  find_package(ITT)
794*da0073e9SAndroid Build Coastguard Worker  if(ITT_FOUND)
795*da0073e9SAndroid Build Coastguard Worker    include_directories(SYSTEM ${ITT_INCLUDE_DIR})
796*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_DEPENDENCY_LIBS ${ITT_LIBRARIES})
797*da0073e9SAndroid Build Coastguard Worker    list(APPEND TORCH_PYTHON_LINK_LIBRARIES ${ITT_LIBRARIES})
798*da0073e9SAndroid Build Coastguard Worker  else()
799*da0073e9SAndroid Build Coastguard Worker    message(WARNING "Not compiling with ITT. Suppress this warning with -DUSE_ITT=OFF")
800*da0073e9SAndroid Build Coastguard Worker    set(USE_ITT OFF CACHE BOOL "" FORCE)
801*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_ITT OFF)
802*da0073e9SAndroid Build Coastguard Worker  endif()
803*da0073e9SAndroid Build Coastguard Workerendif()
804*da0073e9SAndroid Build Coastguard Worker
805*da0073e9SAndroid Build Coastguard Worker# ---[ Caffe2 depends on FP16 library for half-precision conversions
806*da0073e9SAndroid Build Coastguard Workerif(NOT TARGET fp16 AND NOT USE_SYSTEM_FP16)
807*da0073e9SAndroid Build Coastguard Worker  set(CAFFE2_THIRD_PARTY_ROOT "${PROJECT_SOURCE_DIR}/third_party")
808*da0073e9SAndroid Build Coastguard Worker  # PSIMD is required by FP16
809*da0073e9SAndroid Build Coastguard Worker  if(NOT DEFINED PSIMD_SOURCE_DIR)
810*da0073e9SAndroid Build Coastguard Worker    set(PSIMD_SOURCE_DIR "${CAFFE2_THIRD_PARTY_ROOT}/psimd" CACHE STRING "PSimd source directory")
811*da0073e9SAndroid Build Coastguard Worker  endif()
812*da0073e9SAndroid Build Coastguard Worker  if(NOT DEFINED FP16_SOURCE_DIR)
813*da0073e9SAndroid Build Coastguard Worker    set(FP16_SOURCE_DIR "${CAFFE2_THIRD_PARTY_ROOT}/FP16" CACHE STRING "FP16 source directory")
814*da0073e9SAndroid Build Coastguard Worker  endif()
815*da0073e9SAndroid Build Coastguard Worker
816*da0073e9SAndroid Build Coastguard Worker  set(FP16_BUILD_TESTS OFF CACHE BOOL "")
817*da0073e9SAndroid Build Coastguard Worker  set(FP16_BUILD_BENCHMARKS OFF CACHE BOOL "")
818*da0073e9SAndroid Build Coastguard Worker  add_subdirectory(
819*da0073e9SAndroid Build Coastguard Worker    "${FP16_SOURCE_DIR}"
820*da0073e9SAndroid Build Coastguard Worker    "${CONFU_DEPENDENCIES_BINARY_DIR}/FP16")
821*da0073e9SAndroid Build Coastguard Workerelseif(NOT TARGET fp16 AND USE_SYSTEM_FP16)
822*da0073e9SAndroid Build Coastguard Worker  add_library(fp16 STATIC "/usr/include/fp16.h")
823*da0073e9SAndroid Build Coastguard Worker  set_target_properties(fp16 PROPERTIES LINKER_LANGUAGE C)
824*da0073e9SAndroid Build Coastguard Workerendif()
825*da0073e9SAndroid Build Coastguard Workerlist(APPEND Caffe2_DEPENDENCY_LIBS fp16)
826*da0073e9SAndroid Build Coastguard Worker
827*da0073e9SAndroid Build Coastguard Worker# ---[ EIGEN
828*da0073e9SAndroid Build Coastguard Worker# Due to license considerations, we will only use the MPL2 parts of Eigen.
829*da0073e9SAndroid Build Coastguard Workerset(EIGEN_MPL2_ONLY 1)
830*da0073e9SAndroid Build Coastguard Workerif(USE_SYSTEM_EIGEN_INSTALL)
831*da0073e9SAndroid Build Coastguard Worker  find_package(Eigen3)
832*da0073e9SAndroid Build Coastguard Worker  if(EIGEN3_FOUND)
833*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Found system Eigen at " ${EIGEN3_INCLUDE_DIR})
834*da0073e9SAndroid Build Coastguard Worker  else()
835*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Did not find system Eigen. Using third party subdirectory.")
836*da0073e9SAndroid Build Coastguard Worker    set(EIGEN3_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/../third_party/eigen)
837*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_SYSTEM_EIGEN_INSTALL OFF)
838*da0073e9SAndroid Build Coastguard Worker  endif()
839*da0073e9SAndroid Build Coastguard Workerelse()
840*da0073e9SAndroid Build Coastguard Worker  message(STATUS "Using third party subdirectory Eigen.")
841*da0073e9SAndroid Build Coastguard Worker  set(EIGEN3_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/../third_party/eigen)
842*da0073e9SAndroid Build Coastguard Workerendif()
843*da0073e9SAndroid Build Coastguard Workerinclude_directories(SYSTEM ${EIGEN3_INCLUDE_DIR})
844*da0073e9SAndroid Build Coastguard Worker
845*da0073e9SAndroid Build Coastguard Worker
846*da0073e9SAndroid Build Coastguard Worker# ---[ Python Interpreter
847*da0073e9SAndroid Build Coastguard Worker# If not given a Python installation, then use the current active Python
848*da0073e9SAndroid Build Coastguard Workerif(NOT Python_EXECUTABLE)
849*da0073e9SAndroid Build Coastguard Worker  execute_process(
850*da0073e9SAndroid Build Coastguard Worker    COMMAND "which" "python3" RESULT_VARIABLE _exitcode OUTPUT_VARIABLE _py_exe)
851*da0073e9SAndroid Build Coastguard Worker  if(${_exitcode} EQUAL 0)
852*da0073e9SAndroid Build Coastguard Worker    if(NOT MSVC)
853*da0073e9SAndroid Build Coastguard Worker      string(STRIP ${_py_exe} Python_EXECUTABLE)
854*da0073e9SAndroid Build Coastguard Worker    endif()
855*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Setting Python to ${Python_EXECUTABLE}")
856*da0073e9SAndroid Build Coastguard Worker  endif()
857*da0073e9SAndroid Build Coastguard Workerendif()
858*da0073e9SAndroid Build Coastguard Worker
859*da0073e9SAndroid Build Coastguard Workerif(BUILD_PYTHON)
860*da0073e9SAndroid Build Coastguard Worker  set(PYTHON_COMPONENTS Development.Module)
861*da0073e9SAndroid Build Coastguard Worker  if(USE_NUMPY)
862*da0073e9SAndroid Build Coastguard Worker    list(APPEND PYTHON_COMPONENTS NumPy)
863*da0073e9SAndroid Build Coastguard Worker  endif()
864*da0073e9SAndroid Build Coastguard Worker  find_package(Python COMPONENTS Interpreter OPTIONAL_COMPONENTS ${PYTHON_COMPONENTS})
865*da0073e9SAndroid Build Coastguard Workerelse()
866*da0073e9SAndroid Build Coastguard Worker  find_package(Python COMPONENTS Interpreter)
867*da0073e9SAndroid Build Coastguard Workerendif()
868*da0073e9SAndroid Build Coastguard Worker
869*da0073e9SAndroid Build Coastguard Workerif(NOT Python_Interpreter_FOUND)
870*da0073e9SAndroid Build Coastguard Worker  message(FATAL_ERROR "Python3 could not be found.")
871*da0073e9SAndroid Build Coastguard Workerendif()
872*da0073e9SAndroid Build Coastguard Worker
873*da0073e9SAndroid Build Coastguard Workerif(${Python_VERSION} VERSION_LESS 3.8)
874*da0073e9SAndroid Build Coastguard Worker  message(FATAL_ERROR
875*da0073e9SAndroid Build Coastguard Worker    "Found Python libraries version ${Python_VERSION}. Python < 3.8 is no longer supported by PyTorch.")
876*da0073e9SAndroid Build Coastguard Workerendif()
877*da0073e9SAndroid Build Coastguard Worker
878*da0073e9SAndroid Build Coastguard Worker# ---[ Python + Numpy
879*da0073e9SAndroid Build Coastguard Workerif(BUILD_PYTHON)
880*da0073e9SAndroid Build Coastguard Worker  if(Python_Development.Module_FOUND)
881*da0073e9SAndroid Build Coastguard Worker    if(USE_NUMPY)
882*da0073e9SAndroid Build Coastguard Worker      if(NOT Python_NumPy_FOUND)
883*da0073e9SAndroid Build Coastguard Worker        message(WARNING "NumPy could not be found. Not building with NumPy. Suppress this warning with -DUSE_NUMPY=OFF")
884*da0073e9SAndroid Build Coastguard Worker        caffe2_update_option(USE_NUMPY OFF)
885*da0073e9SAndroid Build Coastguard Worker      else()
886*da0073e9SAndroid Build Coastguard Worker        caffe2_update_option(USE_NUMPY ON)
887*da0073e9SAndroid Build Coastguard Worker      endif()
888*da0073e9SAndroid Build Coastguard Worker    endif()
889*da0073e9SAndroid Build Coastguard Worker    # Observers are required in the python build
890*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_OBSERVERS ON)
891*da0073e9SAndroid Build Coastguard Worker  else()
892*da0073e9SAndroid Build Coastguard Worker    message(WARNING "Python dependencies not met. Not compiling with python. Suppress this warning with -DBUILD_PYTHON=OFF")
893*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(BUILD_PYTHON OFF)
894*da0073e9SAndroid Build Coastguard Worker  endif()
895*da0073e9SAndroid Build Coastguard Workerendif()
896*da0073e9SAndroid Build Coastguard Worker
897*da0073e9SAndroid Build Coastguard Worker# ---[ pybind11
898*da0073e9SAndroid Build Coastguard Workerif(USE_SYSTEM_PYBIND11)
899*da0073e9SAndroid Build Coastguard Worker  find_package(pybind11 CONFIG)
900*da0073e9SAndroid Build Coastguard Worker  if(NOT pybind11_FOUND)
901*da0073e9SAndroid Build Coastguard Worker    find_package(pybind11)
902*da0073e9SAndroid Build Coastguard Worker  endif()
903*da0073e9SAndroid Build Coastguard Worker  if(NOT pybind11_FOUND)
904*da0073e9SAndroid Build Coastguard Worker    message(FATAL "Cannot find system pybind11")
905*da0073e9SAndroid Build Coastguard Worker  endif()
906*da0073e9SAndroid Build Coastguard Workerelse()
907*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Using third_party/pybind11.")
908*da0073e9SAndroid Build Coastguard Worker    set(pybind11_INCLUDE_DIRS ${CMAKE_CURRENT_LIST_DIR}/../third_party/pybind11/include)
909*da0073e9SAndroid Build Coastguard Worker    install(DIRECTORY ${pybind11_INCLUDE_DIRS}
910*da0073e9SAndroid Build Coastguard Worker            DESTINATION ${CMAKE_INSTALL_PREFIX}
911*da0073e9SAndroid Build Coastguard Worker            FILES_MATCHING PATTERN "*.h")
912*da0073e9SAndroid Build Coastguard Workerendif()
913*da0073e9SAndroid Build Coastguard Workermessage(STATUS "pybind11 include dirs: " "${pybind11_INCLUDE_DIRS}")
914*da0073e9SAndroid Build Coastguard Workeradd_library(pybind::pybind11 INTERFACE IMPORTED)
915*da0073e9SAndroid Build Coastguard Workertarget_include_directories(pybind::pybind11 SYSTEM INTERFACE ${pybind11_INCLUDE_DIRS})
916*da0073e9SAndroid Build Coastguard Workertarget_link_libraries(pybind::pybind11 INTERFACE Python::Module)
917*da0073e9SAndroid Build Coastguard Worker
918*da0073e9SAndroid Build Coastguard Worker# ---[ OpenTelemetry API headers
919*da0073e9SAndroid Build Coastguard Workerfind_package(OpenTelemetryApi)
920*da0073e9SAndroid Build Coastguard Workerif(NOT OpenTelemetryApi_FOUND)
921*da0073e9SAndroid Build Coastguard Worker  message(STATUS "Using third_party/opentelemetry-cpp.")
922*da0073e9SAndroid Build Coastguard Worker  set(OpenTelemetryApi_INCLUDE_DIRS ${CMAKE_CURRENT_LIST_DIR}/../third_party/opentelemetry-cpp/api/include)
923*da0073e9SAndroid Build Coastguard Workerendif()
924*da0073e9SAndroid Build Coastguard Workermessage(STATUS "opentelemetry api include dirs: " "${OpenTelemetryApi_INCLUDE_DIRS}")
925*da0073e9SAndroid Build Coastguard Workeradd_library(opentelemetry::api INTERFACE IMPORTED)
926*da0073e9SAndroid Build Coastguard Workertarget_include_directories(opentelemetry::api SYSTEM INTERFACE ${OpenTelemetryApi_INCLUDE_DIRS})
927*da0073e9SAndroid Build Coastguard Worker
928*da0073e9SAndroid Build Coastguard Worker# ---[ MPI
929*da0073e9SAndroid Build Coastguard Workerif(USE_MPI)
930*da0073e9SAndroid Build Coastguard Worker  find_package(MPI)
931*da0073e9SAndroid Build Coastguard Worker  if(MPI_CXX_FOUND)
932*da0073e9SAndroid Build Coastguard Worker    message(STATUS "MPI support found")
933*da0073e9SAndroid Build Coastguard Worker    message(STATUS "MPI compile flags: " ${MPI_CXX_COMPILE_FLAGS})
934*da0073e9SAndroid Build Coastguard Worker    message(STATUS "MPI include path: " ${MPI_CXX_INCLUDE_PATH})
935*da0073e9SAndroid Build Coastguard Worker    message(STATUS "MPI LINK flags path: " ${MPI_CXX_LINK_FLAGS})
936*da0073e9SAndroid Build Coastguard Worker    message(STATUS "MPI libraries: " ${MPI_CXX_LIBRARIES})
937*da0073e9SAndroid Build Coastguard Worker    find_program(OMPI_INFO
938*da0073e9SAndroid Build Coastguard Worker      NAMES ompi_info
939*da0073e9SAndroid Build Coastguard Worker      HINTS ${MPI_CXX_LIBRARIES}/../bin)
940*da0073e9SAndroid Build Coastguard Worker    if(OMPI_INFO)
941*da0073e9SAndroid Build Coastguard Worker      execute_process(COMMAND ${OMPI_INFO}
942*da0073e9SAndroid Build Coastguard Worker                      OUTPUT_VARIABLE _output)
943*da0073e9SAndroid Build Coastguard Worker      if(_output MATCHES "smcuda")
944*da0073e9SAndroid Build Coastguard Worker        message(STATUS "Found OpenMPI with CUDA support built.")
945*da0073e9SAndroid Build Coastguard Worker      else()
946*da0073e9SAndroid Build Coastguard Worker        message(WARNING "OpenMPI found, but it is not built with CUDA support.")
947*da0073e9SAndroid Build Coastguard Worker        set(CAFFE2_FORCE_FALLBACK_CUDA_MPI 1)
948*da0073e9SAndroid Build Coastguard Worker      endif()
949*da0073e9SAndroid Build Coastguard Worker    endif()
950*da0073e9SAndroid Build Coastguard Worker  else()
951*da0073e9SAndroid Build Coastguard Worker    message(WARNING "Not compiling with MPI. Suppress this warning with -DUSE_MPI=OFF")
952*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_MPI OFF)
953*da0073e9SAndroid Build Coastguard Worker  endif()
954*da0073e9SAndroid Build Coastguard Workerendif()
955*da0073e9SAndroid Build Coastguard Worker
956*da0073e9SAndroid Build Coastguard Worker# ---[ OpenMP
957*da0073e9SAndroid Build Coastguard Workerif(USE_OPENMP AND NOT TARGET caffe2::openmp)
958*da0073e9SAndroid Build Coastguard Worker  include(${CMAKE_CURRENT_LIST_DIR}/Modules/FindOpenMP.cmake)
959*da0073e9SAndroid Build Coastguard Worker  if(OPENMP_FOUND)
960*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Adding OpenMP CXX_FLAGS: " ${OpenMP_CXX_FLAGS})
961*da0073e9SAndroid Build Coastguard Worker    if(APPLE AND USE_MPS)
962*da0073e9SAndroid Build Coastguard Worker      string(APPEND CMAKE_OBJCXX_FLAGS " ${OpenMP_CXX_FLAGS}")
963*da0073e9SAndroid Build Coastguard Worker    endif()
964*da0073e9SAndroid Build Coastguard Worker    if(OpenMP_CXX_LIBRARIES)
965*da0073e9SAndroid Build Coastguard Worker      message(STATUS "Will link against OpenMP libraries: ${OpenMP_CXX_LIBRARIES}")
966*da0073e9SAndroid Build Coastguard Worker    endif()
967*da0073e9SAndroid Build Coastguard Worker    add_library(caffe2::openmp INTERFACE IMPORTED)
968*da0073e9SAndroid Build Coastguard Worker    target_link_libraries(caffe2::openmp INTERFACE OpenMP::OpenMP_CXX)
969*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_DEPENDENCY_LIBS caffe2::openmp)
970*da0073e9SAndroid Build Coastguard Worker    if(MSVC AND OpenMP_CXX_LIBRARIES MATCHES ".*libiomp5md\\.lib.*")
971*da0073e9SAndroid Build Coastguard Worker      target_compile_definitions(caffe2::openmp INTERFACE _OPENMP_NOFORCE_MANIFEST)
972*da0073e9SAndroid Build Coastguard Worker      target_link_options(caffe2::openmp INTERFACE "/NODEFAULTLIB:vcomp")
973*da0073e9SAndroid Build Coastguard Worker    endif()
974*da0073e9SAndroid Build Coastguard Worker  else()
975*da0073e9SAndroid Build Coastguard Worker    message(WARNING "Not compiling with OpenMP. Suppress this warning with -DUSE_OPENMP=OFF")
976*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_OPENMP OFF)
977*da0073e9SAndroid Build Coastguard Worker  endif()
978*da0073e9SAndroid Build Coastguard Workerendif()
979*da0073e9SAndroid Build Coastguard Worker
980*da0073e9SAndroid Build Coastguard Worker
981*da0073e9SAndroid Build Coastguard Worker
982*da0073e9SAndroid Build Coastguard Worker# ---[ Android specific ones
983*da0073e9SAndroid Build Coastguard Workerif(ANDROID)
984*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS log)
985*da0073e9SAndroid Build Coastguard Workerendif()
986*da0073e9SAndroid Build Coastguard Worker
987*da0073e9SAndroid Build Coastguard Worker# ---[ LLVM
988*da0073e9SAndroid Build Coastguard Workerif(USE_LLVM)
989*da0073e9SAndroid Build Coastguard Worker  message(STATUS "Looking for LLVM in ${USE_LLVM}")
990*da0073e9SAndroid Build Coastguard Worker  find_package(LLVM PATHS ${USE_LLVM} NO_DEFAULT_PATH)
991*da0073e9SAndroid Build Coastguard Worker
992*da0073e9SAndroid Build Coastguard Worker  if(LLVM_FOUND)
993*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
994*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
995*da0073e9SAndroid Build Coastguard Worker
996*da0073e9SAndroid Build Coastguard Worker    include_directories(${LLVM_INCLUDE_DIRS})
997*da0073e9SAndroid Build Coastguard Worker    add_definitions(-DTORCH_ENABLE_LLVM)
998*da0073e9SAndroid Build Coastguard Worker  endif(LLVM_FOUND)
999*da0073e9SAndroid Build Coastguard Workerendif(USE_LLVM)
1000*da0073e9SAndroid Build Coastguard Worker
1001*da0073e9SAndroid Build Coastguard Worker# ---[ cuDNN
1002*da0073e9SAndroid Build Coastguard Workerif(USE_CUDNN)
1003*da0073e9SAndroid Build Coastguard Worker  if(CUDNN_VERSION VERSION_LESS 8.5)
1004*da0073e9SAndroid Build Coastguard Worker    message(FATAL_ERROR "PyTorch needs CuDNN-8.5 or above, but found ${CUDNN_VERSION}. Builds are still possible with `USE_CUDNN=0`")
1005*da0073e9SAndroid Build Coastguard Worker  endif()
1006*da0073e9SAndroid Build Coastguard Worker  set(CUDNN_FRONTEND_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/../third_party/cudnn_frontend/include)
1007*da0073e9SAndroid Build Coastguard Worker  target_include_directories(torch::cudnn INTERFACE ${CUDNN_FRONTEND_INCLUDE_DIR})
1008*da0073e9SAndroid Build Coastguard Workerendif()
1009*da0073e9SAndroid Build Coastguard Worker
1010*da0073e9SAndroid Build Coastguard Worker# ---[ HIP
1011*da0073e9SAndroid Build Coastguard Workerif(USE_ROCM)
1012*da0073e9SAndroid Build Coastguard Worker  # This prevents linking in the libtinfo from /opt/conda/lib which conflicts with ROCm libtinfo.
1013*da0073e9SAndroid Build Coastguard Worker  # Currently only active for Ubuntu 20.04 and greater versions.
1014*da0073e9SAndroid Build Coastguard Worker  if(UNIX AND EXISTS "/etc/os-release")
1015*da0073e9SAndroid Build Coastguard Worker    file(STRINGS /etc/os-release OS_RELEASE)
1016*da0073e9SAndroid Build Coastguard Worker    set(DISTRO_NAME "")
1017*da0073e9SAndroid Build Coastguard Worker    set(DISTRO_VERSION "")
1018*da0073e9SAndroid Build Coastguard Worker    foreach(line ${OS_RELEASE})
1019*da0073e9SAndroid Build Coastguard Worker      string(REGEX MATCH "^NAME=" DISTRO_NAME_MATCH ${line})
1020*da0073e9SAndroid Build Coastguard Worker      if(NOT DISTRO_NAME_MATCH STREQUAL "")
1021*da0073e9SAndroid Build Coastguard Worker        string(REGEX REPLACE "^NAME=\"(.*)\"" "\\1" DISTRO_NAME ${line})
1022*da0073e9SAndroid Build Coastguard Worker      endif()
1023*da0073e9SAndroid Build Coastguard Worker      string(REGEX MATCH "^VERSION_ID=" DISTRO_VERSION_MATCH ${line})
1024*da0073e9SAndroid Build Coastguard Worker      if(NOT DISTRO_VERSION_MATCH STREQUAL "")
1025*da0073e9SAndroid Build Coastguard Worker        string(REGEX REPLACE "^VERSION_ID=\"(.*)\"" "\\1" DISTRO_VERSION ${line})
1026*da0073e9SAndroid Build Coastguard Worker      endif()
1027*da0073e9SAndroid Build Coastguard Worker    endforeach()
1028*da0073e9SAndroid Build Coastguard Worker    if(DISTRO_NAME STREQUAL "Ubuntu" AND DISTRO_VERSION VERSION_GREATER_EQUAL "20.04")
1029*da0073e9SAndroid Build Coastguard Worker      find_library(LIBTINFO_LOC tinfo NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH)
1030*da0073e9SAndroid Build Coastguard Worker      if(LIBTINFO_LOC)
1031*da0073e9SAndroid Build Coastguard Worker        get_filename_component(LIBTINFO_LOC_PARENT ${LIBTINFO_LOC} DIRECTORY)
1032*da0073e9SAndroid Build Coastguard Worker        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath-link,${LIBTINFO_LOC_PARENT}")
1033*da0073e9SAndroid Build Coastguard Worker      endif()
1034*da0073e9SAndroid Build Coastguard Worker    endif()
1035*da0073e9SAndroid Build Coastguard Worker  endif()
1036*da0073e9SAndroid Build Coastguard Worker
1037*da0073e9SAndroid Build Coastguard Worker  include(${CMAKE_CURRENT_LIST_DIR}/public/LoadHIP.cmake)
1038*da0073e9SAndroid Build Coastguard Worker  if(PYTORCH_FOUND_HIP)
1039*da0073e9SAndroid Build Coastguard Worker    message(INFO "Compiling with HIP for AMD.")
1040*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_ROCM ON)
1041*da0073e9SAndroid Build Coastguard Worker
1042*da0073e9SAndroid Build Coastguard Worker    if(USE_NCCL AND NOT USE_SYSTEM_NCCL)
1043*da0073e9SAndroid Build Coastguard Worker      message(INFO "Forcing USE_SYSTEM_NCCL to ON since it's required by using RCCL")
1044*da0073e9SAndroid Build Coastguard Worker      caffe2_update_option(USE_SYSTEM_NCCL ON)
1045*da0073e9SAndroid Build Coastguard Worker    endif()
1046*da0073e9SAndroid Build Coastguard Worker
1047*da0073e9SAndroid Build Coastguard Worker    list(APPEND HIP_CXX_FLAGS -fPIC)
1048*da0073e9SAndroid Build Coastguard Worker    list(APPEND HIP_CXX_FLAGS -D__HIP_PLATFORM_AMD__=1)
1049*da0073e9SAndroid Build Coastguard Worker    list(APPEND HIP_CXX_FLAGS -DCUDA_HAS_FP16=1)
1050*da0073e9SAndroid Build Coastguard Worker    list(APPEND HIP_CXX_FLAGS -DUSE_ROCM)
1051*da0073e9SAndroid Build Coastguard Worker    list(APPEND HIP_CXX_FLAGS -D__HIP_NO_HALF_OPERATORS__=1)
1052*da0073e9SAndroid Build Coastguard Worker    list(APPEND HIP_CXX_FLAGS -D__HIP_NO_HALF_CONVERSIONS__=1)
1053*da0073e9SAndroid Build Coastguard Worker    list(APPEND HIP_CXX_FLAGS -DTORCH_HIP_VERSION=${TORCH_HIP_VERSION})
1054*da0073e9SAndroid Build Coastguard Worker    list(APPEND HIP_CXX_FLAGS -Wno-shift-count-negative)
1055*da0073e9SAndroid Build Coastguard Worker    list(APPEND HIP_CXX_FLAGS -Wno-shift-count-overflow)
1056*da0073e9SAndroid Build Coastguard Worker    list(APPEND HIP_CXX_FLAGS -Wno-duplicate-decl-specifier)
1057*da0073e9SAndroid Build Coastguard Worker    list(APPEND HIP_CXX_FLAGS -DCAFFE2_USE_MIOPEN)
1058*da0073e9SAndroid Build Coastguard Worker    list(APPEND HIP_CXX_FLAGS -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_HIP)
1059*da0073e9SAndroid Build Coastguard Worker    list(APPEND HIP_CXX_FLAGS -std=c++17)
1060*da0073e9SAndroid Build Coastguard Worker    list(APPEND HIP_CXX_FLAGS -DHIPBLAS_V2)
1061*da0073e9SAndroid Build Coastguard Worker    if(HIP_NEW_TYPE_ENUMS)
1062*da0073e9SAndroid Build Coastguard Worker      list(APPEND HIP_CXX_FLAGS -DHIP_NEW_TYPE_ENUMS)
1063*da0073e9SAndroid Build Coastguard Worker    endif()
1064*da0073e9SAndroid Build Coastguard Worker    add_definitions(-DROCM_VERSION=${ROCM_VERSION_DEV_INT})
1065*da0073e9SAndroid Build Coastguard Worker    add_definitions(-DTORCH_HIP_VERSION=${TORCH_HIP_VERSION})
1066*da0073e9SAndroid Build Coastguard Worker    message("TORCH_HIP_VERSION=${TORCH_HIP_VERSION} is added as a compiler defines")
1067*da0073e9SAndroid Build Coastguard Worker
1068*da0073e9SAndroid Build Coastguard Worker    if(CMAKE_BUILD_TYPE MATCHES Debug)
1069*da0073e9SAndroid Build Coastguard Worker       list(APPEND HIP_CXX_FLAGS -g2)
1070*da0073e9SAndroid Build Coastguard Worker       list(APPEND HIP_CXX_FLAGS -O0)
1071*da0073e9SAndroid Build Coastguard Worker       list(APPEND HIP_HIPCC_FLAGS -fdebug-info-for-profiling)
1072*da0073e9SAndroid Build Coastguard Worker    endif(CMAKE_BUILD_TYPE MATCHES Debug)
1073*da0073e9SAndroid Build Coastguard Worker
1074*da0073e9SAndroid Build Coastguard Worker    # needed for compat with newer versions of hip-clang that introduced C++20 mangling rules
1075*da0073e9SAndroid Build Coastguard Worker    list(APPEND HIP_HIPCC_FLAGS -fclang-abi-compat=17)
1076*da0073e9SAndroid Build Coastguard Worker
1077*da0073e9SAndroid Build Coastguard Worker    set(HIP_CLANG_FLAGS ${HIP_CXX_FLAGS})
1078*da0073e9SAndroid Build Coastguard Worker    # Ask hcc to generate device code during compilation so we can use
1079*da0073e9SAndroid Build Coastguard Worker    # host linker to link.
1080*da0073e9SAndroid Build Coastguard Worker    list(APPEND HIP_CLANG_FLAGS -fno-gpu-rdc)
1081*da0073e9SAndroid Build Coastguard Worker    foreach(pytorch_rocm_arch ${PYTORCH_ROCM_ARCH})
1082*da0073e9SAndroid Build Coastguard Worker      list(APPEND HIP_CLANG_FLAGS --offload-arch=${pytorch_rocm_arch})
1083*da0073e9SAndroid Build Coastguard Worker    endforeach()
1084*da0073e9SAndroid Build Coastguard Worker
1085*da0073e9SAndroid Build Coastguard Worker    set(Caffe2_HIP_INCLUDE
1086*da0073e9SAndroid Build Coastguard Worker       $<INSTALL_INTERFACE:include> ${Caffe2_HIP_INCLUDE})
1087*da0073e9SAndroid Build Coastguard Worker    # This is needed for library added by hip_add_library (same for hip_add_executable)
1088*da0073e9SAndroid Build Coastguard Worker    hip_include_directories(${Caffe2_HIP_INCLUDE})
1089*da0073e9SAndroid Build Coastguard Worker
1090*da0073e9SAndroid Build Coastguard Worker    set(Caffe2_PUBLIC_HIP_DEPENDENCY_LIBS
1091*da0073e9SAndroid Build Coastguard Worker      hip::amdhip64 MIOpen hiprtc::hiprtc) # libroctx will be linked in with MIOpen
1092*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_PUBLIC_HIP_DEPENDENCY_LIBS roc::hipblaslt)
1093*da0073e9SAndroid Build Coastguard Worker
1094*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_PUBLIC_HIP_DEPENDENCY_LIBS
1095*da0073e9SAndroid Build Coastguard Worker      roc::hipblas hip::hipfft hip::hiprand roc::hipsparse roc::hipsolver)
1096*da0073e9SAndroid Build Coastguard Worker
1097*da0073e9SAndroid Build Coastguard Worker    # ---[ Kernel asserts
1098*da0073e9SAndroid Build Coastguard Worker    # Kernel asserts is disabled for ROCm by default.
1099*da0073e9SAndroid Build Coastguard Worker    # It can be turned on by turning on the env USE_ROCM_KERNEL_ASSERT to the build system.
1100*da0073e9SAndroid Build Coastguard Worker    if(USE_ROCM_KERNEL_ASSERT)
1101*da0073e9SAndroid Build Coastguard Worker      message(STATUS "Enabling Kernel Assert for ROCm")
1102*da0073e9SAndroid Build Coastguard Worker    else()
1103*da0073e9SAndroid Build Coastguard Worker      message(STATUS "Disabling Kernel Assert for ROCm")
1104*da0073e9SAndroid Build Coastguard Worker    endif()
1105*da0073e9SAndroid Build Coastguard Worker
1106*da0073e9SAndroid Build Coastguard Worker  else()
1107*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_ROCM OFF)
1108*da0073e9SAndroid Build Coastguard Worker  endif()
1109*da0073e9SAndroid Build Coastguard Workerendif()
1110*da0073e9SAndroid Build Coastguard Worker
1111*da0073e9SAndroid Build Coastguard Worker# ---[ NCCL
1112*da0073e9SAndroid Build Coastguard Workerif(USE_NCCL)
1113*da0073e9SAndroid Build Coastguard Worker  if(NOT (USE_CUDA OR USE_ROCM))
1114*da0073e9SAndroid Build Coastguard Worker    message(WARNING
1115*da0073e9SAndroid Build Coastguard Worker        "Not using CUDA/ROCM, so disabling USE_NCCL. Suppress this warning with "
1116*da0073e9SAndroid Build Coastguard Worker        "-DUSE_NCCL=OFF.")
1117*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_NCCL OFF)
1118*da0073e9SAndroid Build Coastguard Worker  elseif(NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
1119*da0073e9SAndroid Build Coastguard Worker    message(WARNING "NCCL is currently only supported under Linux.")
1120*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_NCCL OFF)
1121*da0073e9SAndroid Build Coastguard Worker  elseif(USE_CUDA)
1122*da0073e9SAndroid Build Coastguard Worker    include(${CMAKE_CURRENT_LIST_DIR}/External/nccl.cmake)
1123*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_CUDA_DEPENDENCY_LIBS __caffe2_nccl)
1124*da0073e9SAndroid Build Coastguard Worker  elseif(USE_ROCM)
1125*da0073e9SAndroid Build Coastguard Worker    include(${CMAKE_CURRENT_LIST_DIR}/External/rccl.cmake)
1126*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_CUDA_DEPENDENCY_LIBS __caffe2_nccl)
1127*da0073e9SAndroid Build Coastguard Worker  endif()
1128*da0073e9SAndroid Build Coastguard Workerendif()
1129*da0073e9SAndroid Build Coastguard Worker
1130*da0073e9SAndroid Build Coastguard Worker# ---[ UCC
1131*da0073e9SAndroid Build Coastguard Workerif(USE_UCC)
1132*da0073e9SAndroid Build Coastguard Worker  if(NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
1133*da0073e9SAndroid Build Coastguard Worker    message(WARNING "UCC is currently only supported under Linux.")
1134*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_UCC OFF)
1135*da0073e9SAndroid Build Coastguard Worker  else()
1136*da0073e9SAndroid Build Coastguard Worker    include(${CMAKE_CURRENT_LIST_DIR}/External/ucc.cmake)
1137*da0073e9SAndroid Build Coastguard Worker  endif()
1138*da0073e9SAndroid Build Coastguard Workerendif()
1139*da0073e9SAndroid Build Coastguard Worker
1140*da0073e9SAndroid Build Coastguard Worker# ---[ CUB
1141*da0073e9SAndroid Build Coastguard Workerif(USE_CUDA)
1142*da0073e9SAndroid Build Coastguard Worker  find_package(CUB)
1143*da0073e9SAndroid Build Coastguard Worker  if(NOT CUB_FOUND)
1144*da0073e9SAndroid Build Coastguard Worker    message(FATAL_ERROR "Cannot find CUB.")
1145*da0073e9SAndroid Build Coastguard Worker  endif()
1146*da0073e9SAndroid Build Coastguard Worker  include_directories(SYSTEM ${CUB_INCLUDE_DIRS})
1147*da0073e9SAndroid Build Coastguard Workerendif()
1148*da0073e9SAndroid Build Coastguard Worker
1149*da0073e9SAndroid Build Coastguard Workerif(USE_DISTRIBUTED AND USE_TENSORPIPE)
1150*da0073e9SAndroid Build Coastguard Worker  if(MSVC)
1151*da0073e9SAndroid Build Coastguard Worker    message(WARNING "Tensorpipe cannot be used on Windows.")
1152*da0073e9SAndroid Build Coastguard Worker  else()
1153*da0073e9SAndroid Build Coastguard Worker    if(USE_CUDA)
1154*da0073e9SAndroid Build Coastguard Worker      set(TP_USE_CUDA ON CACHE BOOL "" FORCE)
1155*da0073e9SAndroid Build Coastguard Worker      set(TP_ENABLE_CUDA_IPC ON CACHE BOOL "" FORCE)
1156*da0073e9SAndroid Build Coastguard Worker    endif()
1157*da0073e9SAndroid Build Coastguard Worker    set(TP_BUILD_LIBUV ON CACHE BOOL "" FORCE)
1158*da0073e9SAndroid Build Coastguard Worker    add_compile_options(-DTORCH_USE_LIBUV)
1159*da0073e9SAndroid Build Coastguard Worker    include_directories(BEFORE SYSTEM ${CMAKE_CURRENT_LIST_DIR}/../third_party/tensorpipe/third_party/libuv/include)
1160*da0073e9SAndroid Build Coastguard Worker    set(TP_STATIC_OR_SHARED STATIC CACHE STRING "" FORCE)
1161*da0073e9SAndroid Build Coastguard Worker
1162*da0073e9SAndroid Build Coastguard Worker    # Tensorpipe uses cuda_add_library
1163*da0073e9SAndroid Build Coastguard Worker    torch_update_find_cuda_flags()
1164*da0073e9SAndroid Build Coastguard Worker    add_subdirectory(${PROJECT_SOURCE_DIR}/third_party/tensorpipe)
1165*da0073e9SAndroid Build Coastguard Worker
1166*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_DEPENDENCY_LIBS tensorpipe)
1167*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_DEPENDENCY_LIBS nlohmann)
1168*da0073e9SAndroid Build Coastguard Worker    if(USE_CUDA)
1169*da0073e9SAndroid Build Coastguard Worker      list(APPEND Caffe2_CUDA_DEPENDENCY_LIBS tensorpipe_cuda)
1170*da0073e9SAndroid Build Coastguard Worker    elseif(USE_ROCM)
1171*da0073e9SAndroid Build Coastguard Worker      message(WARNING "TensorPipe doesn't yet support ROCm")
1172*da0073e9SAndroid Build Coastguard Worker      # Not yet...
1173*da0073e9SAndroid Build Coastguard Worker      # list(APPEND Caffe2_HIP_DEPENDENCY_LIBS tensorpipe_hip)
1174*da0073e9SAndroid Build Coastguard Worker    endif()
1175*da0073e9SAndroid Build Coastguard Worker  endif()
1176*da0073e9SAndroid Build Coastguard Workerendif()
1177*da0073e9SAndroid Build Coastguard Worker
1178*da0073e9SAndroid Build Coastguard Workerif(USE_GLOO)
1179*da0073e9SAndroid Build Coastguard Worker  if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
1180*da0073e9SAndroid Build Coastguard Worker    message(WARNING "Gloo can only be used on 64-bit systems.")
1181*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_GLOO OFF)
1182*da0073e9SAndroid Build Coastguard Worker  else()
1183*da0073e9SAndroid Build Coastguard Worker    # Don't install gloo
1184*da0073e9SAndroid Build Coastguard Worker    set(GLOO_INSTALL OFF CACHE BOOL "" FORCE)
1185*da0073e9SAndroid Build Coastguard Worker    set(GLOO_STATIC_OR_SHARED STATIC CACHE STRING "" FORCE)
1186*da0073e9SAndroid Build Coastguard Worker
1187*da0073e9SAndroid Build Coastguard Worker    # Temporarily override variables to avoid building Gloo tests/benchmarks
1188*da0073e9SAndroid Build Coastguard Worker    set(__BUILD_TEST ${BUILD_TEST})
1189*da0073e9SAndroid Build Coastguard Worker    set(__BUILD_BENCHMARK ${BUILD_BENCHMARK})
1190*da0073e9SAndroid Build Coastguard Worker    set(BUILD_TEST OFF)
1191*da0073e9SAndroid Build Coastguard Worker    set(BUILD_BENCHMARK OFF)
1192*da0073e9SAndroid Build Coastguard Worker    if(USE_ROCM)
1193*da0073e9SAndroid Build Coastguard Worker      set(ENV{GLOO_ROCM_ARCH} "${PYTORCH_ROCM_ARCH}")
1194*da0073e9SAndroid Build Coastguard Worker    endif()
1195*da0073e9SAndroid Build Coastguard Worker    if(NOT USE_SYSTEM_GLOO)
1196*da0073e9SAndroid Build Coastguard Worker      if(USE_DISTRIBUED AND USE_TENSORPIPE)
1197*da0073e9SAndroid Build Coastguard Worker        get_target_property(_include_dirs uv_a INCLUDE_DIRECTORIES)
1198*da0073e9SAndroid Build Coastguard Worker        set_target_properties(uv_a PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${_include_dirs}")
1199*da0073e9SAndroid Build Coastguard Worker      endif()
1200*da0073e9SAndroid Build Coastguard Worker      if(USE_NCCL AND NOT USE_SYSTEM_NCCL)
1201*da0073e9SAndroid Build Coastguard Worker        # Tell Gloo build system to use bundled NCCL, see
1202*da0073e9SAndroid Build Coastguard Worker        # https://github.com/facebookincubator/gloo/blob/950c0e23819779a9e0c70b861db4c52b31d1d1b2/cmake/Dependencies.cmake#L123
1203*da0073e9SAndroid Build Coastguard Worker        set(NCCL_EXTERNAL ON)
1204*da0073e9SAndroid Build Coastguard Worker      endif()
1205*da0073e9SAndroid Build Coastguard Worker      set(GLOO_USE_CUDA_TOOLKIT ON CACHE BOOL "" FORCE)
1206*da0073e9SAndroid Build Coastguard Worker      add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../third_party/gloo)
1207*da0073e9SAndroid Build Coastguard Worker    else()
1208*da0073e9SAndroid Build Coastguard Worker      add_library(gloo SHARED IMPORTED)
1209*da0073e9SAndroid Build Coastguard Worker      find_library(GLOO_LIBRARY gloo)
1210*da0073e9SAndroid Build Coastguard Worker      if(NOT GLOO_LIBRARY)
1211*da0073e9SAndroid Build Coastguard Worker        message(FATAL_ERROR "Cannot find gloo")
1212*da0073e9SAndroid Build Coastguard Worker      endif()
1213*da0073e9SAndroid Build Coastguard Worker      message("Found gloo: ${GLOO_LIBRARY}")
1214*da0073e9SAndroid Build Coastguard Worker      set_target_properties(gloo PROPERTIES IMPORTED_LOCATION ${GLOO_LIBRARY})
1215*da0073e9SAndroid Build Coastguard Worker    endif()
1216*da0073e9SAndroid Build Coastguard Worker    # Here is a little bit hacky. We have to put PROJECT_BINARY_DIR in front
1217*da0073e9SAndroid Build Coastguard Worker    # of PROJECT_SOURCE_DIR with/without conda system. The reason is that
1218*da0073e9SAndroid Build Coastguard Worker    # gloo generates a new config.h in the binary diretory.
1219*da0073e9SAndroid Build Coastguard Worker    include_directories(BEFORE SYSTEM ${CMAKE_CURRENT_LIST_DIR}/../third_party/gloo)
1220*da0073e9SAndroid Build Coastguard Worker    include_directories(BEFORE SYSTEM ${PROJECT_BINARY_DIR}/third_party/gloo)
1221*da0073e9SAndroid Build Coastguard Worker    set(BUILD_TEST ${__BUILD_TEST})
1222*da0073e9SAndroid Build Coastguard Worker    set(BUILD_BENCHMARK ${__BUILD_BENCHMARK})
1223*da0073e9SAndroid Build Coastguard Worker
1224*da0073e9SAndroid Build Coastguard Worker    # Add explicit dependency since NCCL is built from third_party.
1225*da0073e9SAndroid Build Coastguard Worker    # Without dependency, make -jN with N>1 can fail if the NCCL build
1226*da0073e9SAndroid Build Coastguard Worker    # hasn't finished when CUDA targets are linked.
1227*da0073e9SAndroid Build Coastguard Worker    if(NOT USE_SYSTEM_NCCL AND USE_NCCL AND NOT USE_ROCM)
1228*da0073e9SAndroid Build Coastguard Worker      add_dependencies(gloo_cuda nccl_external)
1229*da0073e9SAndroid Build Coastguard Worker    endif()
1230*da0073e9SAndroid Build Coastguard Worker    # Pick the right dependency depending on USE_CUDA
1231*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_DEPENDENCY_LIBS gloo)
1232*da0073e9SAndroid Build Coastguard Worker    if(USE_CUDA)
1233*da0073e9SAndroid Build Coastguard Worker      list(APPEND Caffe2_CUDA_DEPENDENCY_LIBS gloo_cuda)
1234*da0073e9SAndroid Build Coastguard Worker    elseif(USE_ROCM)
1235*da0073e9SAndroid Build Coastguard Worker      list(APPEND Caffe2_HIP_DEPENDENCY_LIBS gloo_hip)
1236*da0073e9SAndroid Build Coastguard Worker    endif()
1237*da0073e9SAndroid Build Coastguard Worker    add_compile_options(-DCAFFE2_USE_GLOO)
1238*da0073e9SAndroid Build Coastguard Worker  endif()
1239*da0073e9SAndroid Build Coastguard Workerendif()
1240*da0073e9SAndroid Build Coastguard Worker
1241*da0073e9SAndroid Build Coastguard Worker# ---[ profiling
1242*da0073e9SAndroid Build Coastguard Workerif(USE_PROF)
1243*da0073e9SAndroid Build Coastguard Worker  find_package(htrace)
1244*da0073e9SAndroid Build Coastguard Worker  if(htrace_FOUND)
1245*da0073e9SAndroid Build Coastguard Worker    set(USE_PROF_HTRACE ON)
1246*da0073e9SAndroid Build Coastguard Worker  else()
1247*da0073e9SAndroid Build Coastguard Worker    message(WARNING "htrace not found. Caffe2 will build without htrace prof")
1248*da0073e9SAndroid Build Coastguard Worker  endif()
1249*da0073e9SAndroid Build Coastguard Workerendif()
1250*da0073e9SAndroid Build Coastguard Worker
1251*da0073e9SAndroid Build Coastguard Workerif(USE_SNPE AND ANDROID)
1252*da0073e9SAndroid Build Coastguard Worker  if(SNPE_LOCATION AND SNPE_HEADERS)
1253*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Using SNPE location specified by -DSNPE_LOCATION: " ${SNPE_LOCATION})
1254*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Using SNPE headers specified by -DSNPE_HEADERS: " ${SNPE_HEADERS})
1255*da0073e9SAndroid Build Coastguard Worker    include_directories(SYSTEM ${SNPE_HEADERS})
1256*da0073e9SAndroid Build Coastguard Worker    add_library(snpe SHARED IMPORTED)
1257*da0073e9SAndroid Build Coastguard Worker    set_property(TARGET snpe PROPERTY IMPORTED_LOCATION ${SNPE_LOCATION})
1258*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_DEPENDENCY_LIBS snpe)
1259*da0073e9SAndroid Build Coastguard Worker  else()
1260*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_SNPE OFF)
1261*da0073e9SAndroid Build Coastguard Worker  endif()
1262*da0073e9SAndroid Build Coastguard Workerendif()
1263*da0073e9SAndroid Build Coastguard Worker
1264*da0073e9SAndroid Build Coastguard Workerif(USE_NNAPI AND NOT ANDROID)
1265*da0073e9SAndroid Build Coastguard Worker  message(WARNING "NNApi is only used in android builds.")
1266*da0073e9SAndroid Build Coastguard Worker  caffe2_update_option(USE_NNAPI OFF)
1267*da0073e9SAndroid Build Coastguard Workerendif()
1268*da0073e9SAndroid Build Coastguard Worker
1269*da0073e9SAndroid Build Coastguard Worker# ---[ Onnx
1270*da0073e9SAndroid Build Coastguard Workerif(CAFFE2_CMAKE_BUILDING_WITH_MAIN_REPO AND NOT INTERN_DISABLE_ONNX)
1271*da0073e9SAndroid Build Coastguard Worker  if(EXISTS "${CAFFE2_CUSTOM_PROTOC_EXECUTABLE}")
1272*da0073e9SAndroid Build Coastguard Worker    set(ONNX_CUSTOM_PROTOC_EXECUTABLE ${CAFFE2_CUSTOM_PROTOC_EXECUTABLE})
1273*da0073e9SAndroid Build Coastguard Worker  endif()
1274*da0073e9SAndroid Build Coastguard Worker  set(TEMP_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
1275*da0073e9SAndroid Build Coastguard Worker  set(BUILD_SHARED_LIBS OFF)
1276*da0073e9SAndroid Build Coastguard Worker  set(ONNX_USE_MSVC_STATIC_RUNTIME ${CAFFE2_USE_MSVC_STATIC_RUNTIME})
1277*da0073e9SAndroid Build Coastguard Worker  set(ONNX_USE_LITE_PROTO ${CAFFE2_USE_LITE_PROTO})
1278*da0073e9SAndroid Build Coastguard Worker  # If linking local protobuf, make sure ONNX has the same protobuf
1279*da0073e9SAndroid Build Coastguard Worker  # patches as Caffe2 and Caffe proto. This forces some functions to
1280*da0073e9SAndroid Build Coastguard Worker  # not be inline and instead route back to the statically-linked protobuf.
1281*da0073e9SAndroid Build Coastguard Worker  if(CAFFE2_LINK_LOCAL_PROTOBUF)
1282*da0073e9SAndroid Build Coastguard Worker    set(ONNX_PROTO_POST_BUILD_SCRIPT ${PROJECT_SOURCE_DIR}/cmake/ProtoBufPatch.cmake)
1283*da0073e9SAndroid Build Coastguard Worker  endif()
1284*da0073e9SAndroid Build Coastguard Worker  if(ONNX_ML)
1285*da0073e9SAndroid Build Coastguard Worker    add_definitions(-DONNX_ML=1)
1286*da0073e9SAndroid Build Coastguard Worker  endif()
1287*da0073e9SAndroid Build Coastguard Worker  add_definitions(-DONNXIFI_ENABLE_EXT=1)
1288*da0073e9SAndroid Build Coastguard Worker  if(NOT USE_SYSTEM_ONNX)
1289*da0073e9SAndroid Build Coastguard Worker    add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../third_party/onnx EXCLUDE_FROM_ALL)
1290*da0073e9SAndroid Build Coastguard Worker    if(NOT MSVC)
1291*da0073e9SAndroid Build Coastguard Worker      set_target_properties(onnx_proto PROPERTIES CXX_STANDARD 17)
1292*da0073e9SAndroid Build Coastguard Worker    endif()
1293*da0073e9SAndroid Build Coastguard Worker  endif()
1294*da0073e9SAndroid Build Coastguard Worker
1295*da0073e9SAndroid Build Coastguard Worker  add_definitions(-DONNX_NAMESPACE=${ONNX_NAMESPACE})
1296*da0073e9SAndroid Build Coastguard Worker  if(NOT USE_SYSTEM_ONNX)
1297*da0073e9SAndroid Build Coastguard Worker    include_directories(${ONNX_INCLUDE_DIRS})
1298*da0073e9SAndroid Build Coastguard Worker    # In mobile build we care about code size, and so we need drop
1299*da0073e9SAndroid Build Coastguard Worker    # everything (e.g. checker) in onnx but the pb definition.
1300*da0073e9SAndroid Build Coastguard Worker    if(ANDROID OR IOS)
1301*da0073e9SAndroid Build Coastguard Worker      caffe2_interface_library(onnx_proto onnx_library)
1302*da0073e9SAndroid Build Coastguard Worker    else()
1303*da0073e9SAndroid Build Coastguard Worker      caffe2_interface_library(onnx onnx_library)
1304*da0073e9SAndroid Build Coastguard Worker    endif()
1305*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_DEPENDENCY_WHOLE_LINK_LIBS onnx_library)
1306*da0073e9SAndroid Build Coastguard Worker  else()
1307*da0073e9SAndroid Build Coastguard Worker    add_library(onnx SHARED IMPORTED)
1308*da0073e9SAndroid Build Coastguard Worker    find_library(ONNX_LIBRARY onnx)
1309*da0073e9SAndroid Build Coastguard Worker    if(NOT ONNX_LIBRARY)
1310*da0073e9SAndroid Build Coastguard Worker      message(FATAL_ERROR "Cannot find onnx")
1311*da0073e9SAndroid Build Coastguard Worker    endif()
1312*da0073e9SAndroid Build Coastguard Worker    set_property(TARGET onnx PROPERTY IMPORTED_LOCATION ${ONNX_LIBRARY})
1313*da0073e9SAndroid Build Coastguard Worker    add_library(onnx_proto SHARED IMPORTED)
1314*da0073e9SAndroid Build Coastguard Worker    find_library(ONNX_PROTO_LIBRARY onnx_proto)
1315*da0073e9SAndroid Build Coastguard Worker    if(NOT ONNX_PROTO_LIBRARY)
1316*da0073e9SAndroid Build Coastguard Worker      message(FATAL_ERROR "Cannot find onnx")
1317*da0073e9SAndroid Build Coastguard Worker    endif()
1318*da0073e9SAndroid Build Coastguard Worker    set_property(TARGET onnx_proto PROPERTY IMPORTED_LOCATION ${ONNX_PROTO_LIBRARY})
1319*da0073e9SAndroid Build Coastguard Worker    message("-- Found onnx: ${ONNX_LIBRARY} ${ONNX_PROTO_LIBRARY}")
1320*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_DEPENDENCY_LIBS onnx_proto onnx)
1321*da0073e9SAndroid Build Coastguard Worker  endif()
1322*da0073e9SAndroid Build Coastguard Worker  # Recover the build shared libs option.
1323*da0073e9SAndroid Build Coastguard Worker  set(BUILD_SHARED_LIBS ${TEMP_BUILD_SHARED_LIBS})
1324*da0073e9SAndroid Build Coastguard Workerendif()
1325*da0073e9SAndroid Build Coastguard Worker
1326*da0073e9SAndroid Build Coastguard Worker# --[ ATen checks
1327*da0073e9SAndroid Build Coastguard Workerset(USE_LAPACK 0)
1328*da0073e9SAndroid Build Coastguard Worker
1329*da0073e9SAndroid Build Coastguard Worker# we need to build all targets to be linked with PIC
1330*da0073e9SAndroid Build Coastguard Workerif(USE_KINETO AND INTERN_BUILD_MOBILE AND USE_LITE_INTERPRETER_PROFILER)
1331*da0073e9SAndroid Build Coastguard Worker  set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
1332*da0073e9SAndroid Build Coastguard Workerendif()
1333*da0073e9SAndroid Build Coastguard Worker
1334*da0073e9SAndroid Build Coastguard Workerif(NOT INTERN_BUILD_MOBILE)
1335*da0073e9SAndroid Build Coastguard Worker  set(TORCH_CUDA_ARCH_LIST $ENV{TORCH_CUDA_ARCH_LIST})
1336*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CUDA_FLAGS " $ENV{TORCH_NVCC_FLAGS}")
1337*da0073e9SAndroid Build Coastguard Worker  set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
1338*da0073e9SAndroid Build Coastguard Worker
1339*da0073e9SAndroid Build Coastguard Worker  # Top-level build config
1340*da0073e9SAndroid Build Coastguard Worker  ############################################
1341*da0073e9SAndroid Build Coastguard Worker  # Flags
1342*da0073e9SAndroid Build Coastguard Worker  # When using MSVC
1343*da0073e9SAndroid Build Coastguard Worker  # Detect CUDA architecture and get best NVCC flags
1344*da0073e9SAndroid Build Coastguard Worker  # finding cuda must be first because other things depend on the result
1345*da0073e9SAndroid Build Coastguard Worker  #
1346*da0073e9SAndroid Build Coastguard Worker  # NB: We MUST NOT run this find_package if NOT USE_CUDA is set, because upstream
1347*da0073e9SAndroid Build Coastguard Worker  # FindCUDA has a bug where it will still attempt to make use of NOTFOUND
1348*da0073e9SAndroid Build Coastguard Worker  # compiler variables to run various probe tests.  We could try to fix
1349*da0073e9SAndroid Build Coastguard Worker  # this, but since FindCUDA upstream is subsumed by first-class support
1350*da0073e9SAndroid Build Coastguard Worker  # for CUDA language, it seemed not worth fixing.
1351*da0073e9SAndroid Build Coastguard Worker
1352*da0073e9SAndroid Build Coastguard Worker  if(MSVC)
1353*da0073e9SAndroid Build Coastguard Worker    # we want to respect the standard, and we are bored of those **** .
1354*da0073e9SAndroid Build Coastguard Worker    add_definitions(-D_CRT_SECURE_NO_DEPRECATE=1)
1355*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CUDA_FLAGS " -Xcompiler=/wd4819,/wd4503,/wd4190,/wd4244,/wd4251,/wd4275,/wd4522")
1356*da0073e9SAndroid Build Coastguard Worker  endif()
1357*da0073e9SAndroid Build Coastguard Worker
1358*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CUDA_FLAGS " -Wno-deprecated-gpu-targets --expt-extended-lambda")
1359*da0073e9SAndroid Build Coastguard Worker
1360*da0073e9SAndroid Build Coastguard Worker  # use cub in a safe manner, see:
1361*da0073e9SAndroid Build Coastguard Worker  # https://github.com/pytorch/pytorch/pull/55292
1362*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CUDA_FLAGS " -DCUB_WRAPPED_NAMESPACE=at_cuda_detail")
1363*da0073e9SAndroid Build Coastguard Worker
1364*da0073e9SAndroid Build Coastguard Worker  message(STATUS "Found CUDA with FP16 support, compiling with torch.cuda.HalfTensor")
1365*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CUDA_FLAGS " -DCUDA_HAS_FP16=1"
1366*da0073e9SAndroid Build Coastguard Worker                                 " -D__CUDA_NO_HALF_OPERATORS__"
1367*da0073e9SAndroid Build Coastguard Worker                                 " -D__CUDA_NO_HALF_CONVERSIONS__"
1368*da0073e9SAndroid Build Coastguard Worker                                 " -D__CUDA_NO_HALF2_OPERATORS__"
1369*da0073e9SAndroid Build Coastguard Worker                                 " -D__CUDA_NO_BFLOAT16_CONVERSIONS__")
1370*da0073e9SAndroid Build Coastguard Worker
1371*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_C_FLAGS_RELEASE " -DNDEBUG")
1372*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS_RELEASE " -DNDEBUG")
1373*da0073e9SAndroid Build Coastguard Worker  if(NOT GENERATOR_IS_MULTI_CONFIG)
1374*da0073e9SAndroid Build Coastguard Worker    if(${CMAKE_BUILD_TYPE} STREQUAL "Release")
1375*da0073e9SAndroid Build Coastguard Worker      message(STATUS "Adding -DNDEBUG to compile flags")
1376*da0073e9SAndroid Build Coastguard Worker      string(APPEND CMAKE_C_FLAGS " -DNDEBUG")
1377*da0073e9SAndroid Build Coastguard Worker      string(APPEND CMAKE_CXX_FLAGS " -DNDEBUG")
1378*da0073e9SAndroid Build Coastguard Worker    else()
1379*da0073e9SAndroid Build Coastguard Worker      message(STATUS "Removing -DNDEBUG from compile flags")
1380*da0073e9SAndroid Build Coastguard Worker      string(REGEX REPLACE "[-/]DNDEBUG" "" CMAKE_C_FLAGS "" ${CMAKE_C_FLAGS})
1381*da0073e9SAndroid Build Coastguard Worker      string(REGEX REPLACE "[-/]DNDEBUG" "" CMAKE_CXX_FLAGS "" ${CMAKE_CXX_FLAGS})
1382*da0073e9SAndroid Build Coastguard Worker    endif()
1383*da0073e9SAndroid Build Coastguard Worker  endif()
1384*da0073e9SAndroid Build Coastguard Worker  string(REGEX REPLACE "[-/]DNDEBUG" "" CMAKE_C_FLAGS_DEBUG "" ${CMAKE_C_FLAGS_DEBUG})
1385*da0073e9SAndroid Build Coastguard Worker  string(REGEX REPLACE "[-/]DNDEBUG" "" CMAKE_CXX_FLAGS_DEBUG "" ${CMAKE_CXX_FLAGS_DEBUG})
1386*da0073e9SAndroid Build Coastguard Worker
1387*da0073e9SAndroid Build Coastguard Worker  set(CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE OFF)
1388*da0073e9SAndroid Build Coastguard Worker
1389*da0073e9SAndroid Build Coastguard Worker  if(USE_CUDA OR USE_ROCM)
1390*da0073e9SAndroid Build Coastguard Worker    if(USE_MAGMA)
1391*da0073e9SAndroid Build Coastguard Worker      find_package(MAGMA)
1392*da0073e9SAndroid Build Coastguard Worker      if(MAGMA_FOUND)
1393*da0073e9SAndroid Build Coastguard Worker        message(STATUS "Compiling with MAGMA support")
1394*da0073e9SAndroid Build Coastguard Worker        message(STATUS "MAGMA INCLUDE DIRECTORIES: ${MAGMA_INCLUDE_DIR}")
1395*da0073e9SAndroid Build Coastguard Worker        message(STATUS "MAGMA LIBRARIES: ${MAGMA_LIBRARIES}")
1396*da0073e9SAndroid Build Coastguard Worker        message(STATUS "MAGMA V2 check: ${MAGMA_V2}")
1397*da0073e9SAndroid Build Coastguard Worker      else()
1398*da0073e9SAndroid Build Coastguard Worker        message(STATUS "MAGMA not found. Compiling without MAGMA support")
1399*da0073e9SAndroid Build Coastguard Worker        caffe2_update_option(USE_MAGMA OFF)
1400*da0073e9SAndroid Build Coastguard Worker      endif()
1401*da0073e9SAndroid Build Coastguard Worker    endif()
1402*da0073e9SAndroid Build Coastguard Worker  elseif(USE_MAGMA)
1403*da0073e9SAndroid Build Coastguard Worker    message(WARNING
1404*da0073e9SAndroid Build Coastguard Worker      "Not compiling with MAGMA. Suppress this warning with "
1405*da0073e9SAndroid Build Coastguard Worker      "-DUSE_MAGMA=OFF.")
1406*da0073e9SAndroid Build Coastguard Worker    caffe2_update_option(USE_MAGMA OFF)
1407*da0073e9SAndroid Build Coastguard Worker  endif()
1408*da0073e9SAndroid Build Coastguard Worker
1409*da0073e9SAndroid Build Coastguard Worker  # ARM specific flags
1410*da0073e9SAndroid Build Coastguard Worker  find_package(ARM)
1411*da0073e9SAndroid Build Coastguard Worker  if(ASIMD_FOUND)
1412*da0073e9SAndroid Build Coastguard Worker    message(STATUS "asimd/Neon found with compiler flag : -D__NEON__")
1413*da0073e9SAndroid Build Coastguard Worker    add_compile_options(-D__NEON__)
1414*da0073e9SAndroid Build Coastguard Worker  elseif(NEON_FOUND)
1415*da0073e9SAndroid Build Coastguard Worker    if(APPLE)
1416*da0073e9SAndroid Build Coastguard Worker      message(STATUS "Neon found with compiler flag : -D__NEON__")
1417*da0073e9SAndroid Build Coastguard Worker      add_compile_options(-D__NEON__)
1418*da0073e9SAndroid Build Coastguard Worker    else()
1419*da0073e9SAndroid Build Coastguard Worker      message(STATUS "Neon found with compiler flag : -mfpu=neon -D__NEON__")
1420*da0073e9SAndroid Build Coastguard Worker      add_compile_options(-mfpu=neon -D__NEON__)
1421*da0073e9SAndroid Build Coastguard Worker    endif()
1422*da0073e9SAndroid Build Coastguard Worker  endif()
1423*da0073e9SAndroid Build Coastguard Worker  if(CORTEXA8_FOUND)
1424*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Cortex-A8 Found with compiler flag : -mcpu=cortex-a8")
1425*da0073e9SAndroid Build Coastguard Worker    add_compile_options(-mcpu=cortex-a8 -fprefetch-loop-arrays)
1426*da0073e9SAndroid Build Coastguard Worker  endif()
1427*da0073e9SAndroid Build Coastguard Worker  if(CORTEXA9_FOUND)
1428*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Cortex-A9 Found with compiler flag : -mcpu=cortex-a9")
1429*da0073e9SAndroid Build Coastguard Worker    add_compile_options(-mcpu=cortex-a9)
1430*da0073e9SAndroid Build Coastguard Worker  endif()
1431*da0073e9SAndroid Build Coastguard Worker
1432*da0073e9SAndroid Build Coastguard Worker  find_package(LAPACK)
1433*da0073e9SAndroid Build Coastguard Worker  if(LAPACK_FOUND)
1434*da0073e9SAndroid Build Coastguard Worker    set(USE_LAPACK 1)
1435*da0073e9SAndroid Build Coastguard Worker    list(APPEND Caffe2_PRIVATE_DEPENDENCY_LIBS ${LAPACK_LIBRARIES})
1436*da0073e9SAndroid Build Coastguard Worker  endif()
1437*da0073e9SAndroid Build Coastguard Worker
1438*da0073e9SAndroid Build Coastguard Worker  if(NOT USE_CUDA)
1439*da0073e9SAndroid Build Coastguard Worker    message("disabling CUDA because NOT USE_CUDA is set")
1440*da0073e9SAndroid Build Coastguard Worker    set(AT_CUDA_ENABLED 0)
1441*da0073e9SAndroid Build Coastguard Worker  else()
1442*da0073e9SAndroid Build Coastguard Worker    set(AT_CUDA_ENABLED 1)
1443*da0073e9SAndroid Build Coastguard Worker  endif()
1444*da0073e9SAndroid Build Coastguard Worker
1445*da0073e9SAndroid Build Coastguard Worker  if(NOT USE_ROCM)
1446*da0073e9SAndroid Build Coastguard Worker    message("disabling ROCM because NOT USE_ROCM is set")
1447*da0073e9SAndroid Build Coastguard Worker    message(STATUS "MIOpen not found. Compiling without MIOpen support")
1448*da0073e9SAndroid Build Coastguard Worker    set(AT_ROCM_ENABLED 0)
1449*da0073e9SAndroid Build Coastguard Worker  else()
1450*da0073e9SAndroid Build Coastguard Worker    include_directories(BEFORE ${MIOPEN_INCLUDE_DIRS})
1451*da0073e9SAndroid Build Coastguard Worker    set(AT_ROCM_ENABLED 1)
1452*da0073e9SAndroid Build Coastguard Worker  endif()
1453*da0073e9SAndroid Build Coastguard Worker
1454*da0073e9SAndroid Build Coastguard Worker  if(USE_MKLDNN)
1455*da0073e9SAndroid Build Coastguard Worker    if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
1456*da0073e9SAndroid Build Coastguard Worker      message(WARNING
1457*da0073e9SAndroid Build Coastguard Worker        "x64 operating system is required for MKLDNN. "
1458*da0073e9SAndroid Build Coastguard Worker        "Not compiling with MKLDNN. "
1459*da0073e9SAndroid Build Coastguard Worker        "Turn this warning off by USE_MKLDNN=OFF.")
1460*da0073e9SAndroid Build Coastguard Worker      set(USE_MKLDNN OFF)
1461*da0073e9SAndroid Build Coastguard Worker    endif()
1462*da0073e9SAndroid Build Coastguard Worker    if(USE_MKLDNN_ACL)
1463*da0073e9SAndroid Build Coastguard Worker      set(AT_MKLDNN_ACL_ENABLED 1)
1464*da0073e9SAndroid Build Coastguard Worker    endif()
1465*da0073e9SAndroid Build Coastguard Worker  endif()
1466*da0073e9SAndroid Build Coastguard Worker  if(USE_MKLDNN)
1467*da0073e9SAndroid Build Coastguard Worker    include(${CMAKE_CURRENT_LIST_DIR}/public/mkldnn.cmake)
1468*da0073e9SAndroid Build Coastguard Worker    if(MKLDNN_FOUND)
1469*da0073e9SAndroid Build Coastguard Worker      set(AT_MKLDNN_ENABLED 1)
1470*da0073e9SAndroid Build Coastguard Worker      include_directories(AFTER SYSTEM ${MKLDNN_INCLUDE_DIR})
1471*da0073e9SAndroid Build Coastguard Worker    else()
1472*da0073e9SAndroid Build Coastguard Worker      message(WARNING "MKLDNN could not be found.")
1473*da0073e9SAndroid Build Coastguard Worker      caffe2_update_option(USE_MKLDNN OFF)
1474*da0073e9SAndroid Build Coastguard Worker    endif()
1475*da0073e9SAndroid Build Coastguard Worker  else()
1476*da0073e9SAndroid Build Coastguard Worker    message("disabling MKLDNN because USE_MKLDNN is not set")
1477*da0073e9SAndroid Build Coastguard Worker  endif()
1478*da0073e9SAndroid Build Coastguard Worker
1479*da0073e9SAndroid Build Coastguard Worker  if(UNIX AND NOT APPLE)
1480*da0073e9SAndroid Build Coastguard Worker     include(CheckLibraryExists)
1481*da0073e9SAndroid Build Coastguard Worker     # https://github.com/libgit2/libgit2/issues/2128#issuecomment-35649830
1482*da0073e9SAndroid Build Coastguard Worker     CHECK_LIBRARY_EXISTS(rt clock_gettime "time.h" NEED_LIBRT)
1483*da0073e9SAndroid Build Coastguard Worker     if(NEED_LIBRT)
1484*da0073e9SAndroid Build Coastguard Worker       list(APPEND Caffe2_DEPENDENCY_LIBS rt)
1485*da0073e9SAndroid Build Coastguard Worker       set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} rt)
1486*da0073e9SAndroid Build Coastguard Worker     endif(NEED_LIBRT)
1487*da0073e9SAndroid Build Coastguard Worker  endif(UNIX AND NOT APPLE)
1488*da0073e9SAndroid Build Coastguard Worker
1489*da0073e9SAndroid Build Coastguard Worker  if(UNIX)
1490*da0073e9SAndroid Build Coastguard Worker    set(CMAKE_EXTRA_INCLUDE_FILES "sys/mman.h")
1491*da0073e9SAndroid Build Coastguard Worker    CHECK_FUNCTION_EXISTS(mmap HAVE_MMAP)
1492*da0073e9SAndroid Build Coastguard Worker    if(HAVE_MMAP)
1493*da0073e9SAndroid Build Coastguard Worker      add_definitions(-DHAVE_MMAP=1)
1494*da0073e9SAndroid Build Coastguard Worker    endif(HAVE_MMAP)
1495*da0073e9SAndroid Build Coastguard Worker    # done for lseek: https://www.gnu.org/software/libc/manual/html_node/File-Position-Primitive.html
1496*da0073e9SAndroid Build Coastguard Worker    add_definitions(-D_FILE_OFFSET_BITS=64)
1497*da0073e9SAndroid Build Coastguard Worker    CHECK_FUNCTION_EXISTS(shm_open HAVE_SHM_OPEN)
1498*da0073e9SAndroid Build Coastguard Worker    if(HAVE_SHM_OPEN)
1499*da0073e9SAndroid Build Coastguard Worker      add_definitions(-DHAVE_SHM_OPEN=1)
1500*da0073e9SAndroid Build Coastguard Worker    endif(HAVE_SHM_OPEN)
1501*da0073e9SAndroid Build Coastguard Worker    CHECK_FUNCTION_EXISTS(shm_unlink HAVE_SHM_UNLINK)
1502*da0073e9SAndroid Build Coastguard Worker    if(HAVE_SHM_UNLINK)
1503*da0073e9SAndroid Build Coastguard Worker      add_definitions(-DHAVE_SHM_UNLINK=1)
1504*da0073e9SAndroid Build Coastguard Worker    endif(HAVE_SHM_UNLINK)
1505*da0073e9SAndroid Build Coastguard Worker    CHECK_FUNCTION_EXISTS(malloc_usable_size HAVE_MALLOC_USABLE_SIZE)
1506*da0073e9SAndroid Build Coastguard Worker    if(HAVE_MALLOC_USABLE_SIZE)
1507*da0073e9SAndroid Build Coastguard Worker      add_definitions(-DHAVE_MALLOC_USABLE_SIZE=1)
1508*da0073e9SAndroid Build Coastguard Worker    endif(HAVE_MALLOC_USABLE_SIZE)
1509*da0073e9SAndroid Build Coastguard Worker  endif(UNIX)
1510*da0073e9SAndroid Build Coastguard Worker
1511*da0073e9SAndroid Build Coastguard Worker  add_definitions(-DUSE_EXTERNAL_MZCRC)
1512*da0073e9SAndroid Build Coastguard Worker  add_definitions(-DMINIZ_DISABLE_ZIP_READER_CRC32_CHECKS)
1513*da0073e9SAndroid Build Coastguard Worker
1514*da0073e9SAndroid Build Coastguard Worker  find_package(ZVECTOR) # s390x simd support
1515*da0073e9SAndroid Build Coastguard Workerendif()
1516*da0073e9SAndroid Build Coastguard Worker
1517*da0073e9SAndroid Build Coastguard Worker#
1518*da0073e9SAndroid Build Coastguard Worker# End ATen checks
1519*da0073e9SAndroid Build Coastguard Worker#
1520*da0073e9SAndroid Build Coastguard Workerset(TEMP_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
1521*da0073e9SAndroid Build Coastguard Workerset(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libs" FORCE)
1522*da0073e9SAndroid Build Coastguard Workeradd_subdirectory(${PROJECT_SOURCE_DIR}/third_party/fmt)
1523*da0073e9SAndroid Build Coastguard Worker
1524*da0073e9SAndroid Build Coastguard Worker# Disable compiler feature checks for `fmt`.
1525*da0073e9SAndroid Build Coastguard Worker#
1526*da0073e9SAndroid Build Coastguard Worker# CMake compiles a little program to check compiler features. Some of our build
1527*da0073e9SAndroid Build Coastguard Worker# configurations (notably the mobile build analyzer) will populate
1528*da0073e9SAndroid Build Coastguard Worker# CMAKE_CXX_FLAGS in ways that break feature checks. Since we already know
1529*da0073e9SAndroid Build Coastguard Worker# `fmt` is compatible with a superset of the compilers that PyTorch is, it
1530*da0073e9SAndroid Build Coastguard Worker# shouldn't be too bad to just disable the checks.
1531*da0073e9SAndroid Build Coastguard Workerset_target_properties(fmt-header-only PROPERTIES INTERFACE_COMPILE_FEATURES "")
1532*da0073e9SAndroid Build Coastguard Worker
1533*da0073e9SAndroid Build Coastguard Workerlist(APPEND Caffe2_DEPENDENCY_LIBS fmt::fmt-header-only)
1534*da0073e9SAndroid Build Coastguard Workerset(BUILD_SHARED_LIBS ${TEMP_BUILD_SHARED_LIBS} CACHE BOOL "Build shared libs" FORCE)
1535*da0073e9SAndroid Build Coastguard Worker
1536*da0073e9SAndroid Build Coastguard Worker# ---[ Kineto
1537*da0073e9SAndroid Build Coastguard Worker# edge profiler depends on KinetoProfiler but it only does cpu
1538*da0073e9SAndroid Build Coastguard Worker# profiling. Thus we dont need USE_CUDA/USE_ROCM
1539*da0073e9SAndroid Build Coastguard Workerif(USE_KINETO AND INTERN_BUILD_MOBILE AND NOT (BUILD_LITE_INTERPRETER AND USE_LITE_INTERPRETER_PROFILER))
1540*da0073e9SAndroid Build Coastguard Worker  message(STATUS "Not using libkineto in a mobile build.")
1541*da0073e9SAndroid Build Coastguard Worker  set(USE_KINETO OFF)
1542*da0073e9SAndroid Build Coastguard Workerendif()
1543*da0073e9SAndroid Build Coastguard Worker
1544*da0073e9SAndroid Build Coastguard Workerif(USE_KINETO AND INTERN_BUILD_MOBILE AND USE_LITE_INTERPRETER_PROFILER AND (USE_CUDA OR USE_ROCM))
1545*da0073e9SAndroid Build Coastguard Worker  message(FATAL_ERROR "Mobile build with profiler does not support CUDA or ROCM")
1546*da0073e9SAndroid Build Coastguard Workerendif()
1547*da0073e9SAndroid Build Coastguard Worker
1548*da0073e9SAndroid Build Coastguard Workerif(USE_KINETO)
1549*da0073e9SAndroid Build Coastguard Worker  if((NOT USE_CUDA) OR MSVC)
1550*da0073e9SAndroid Build Coastguard Worker    set(LIBKINETO_NOCUPTI ON CACHE STRING "" FORCE)
1551*da0073e9SAndroid Build Coastguard Worker  else()
1552*da0073e9SAndroid Build Coastguard Worker    set(LIBKINETO_NOCUPTI OFF CACHE STRING "")
1553*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Using Kineto with CUPTI support")
1554*da0073e9SAndroid Build Coastguard Worker  endif()
1555*da0073e9SAndroid Build Coastguard Worker
1556*da0073e9SAndroid Build Coastguard Worker  if(NOT USE_ROCM)
1557*da0073e9SAndroid Build Coastguard Worker    set(LIBKINETO_NOROCTRACER ON CACHE STRING "" FORCE)
1558*da0073e9SAndroid Build Coastguard Worker  else()
1559*da0073e9SAndroid Build Coastguard Worker    set(LIBKINETO_NOROCTRACER OFF CACHE STRING "")
1560*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Using Kineto with Roctracer support")
1561*da0073e9SAndroid Build Coastguard Worker  endif()
1562*da0073e9SAndroid Build Coastguard Worker
1563*da0073e9SAndroid Build Coastguard Worker  if((NOT USE_XPU) OR WIN32)
1564*da0073e9SAndroid Build Coastguard Worker    set(LIBKINETO_NOXPUPTI ON CACHE STRING "" FORCE)
1565*da0073e9SAndroid Build Coastguard Worker  else()
1566*da0073e9SAndroid Build Coastguard Worker    set(LIBKINETO_NOXPUPTI OFF CACHE STRING "")
1567*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Using Kineto with XPUPTI support")
1568*da0073e9SAndroid Build Coastguard Worker  endif()
1569*da0073e9SAndroid Build Coastguard Worker
1570*da0073e9SAndroid Build Coastguard Worker  if(LIBKINETO_NOCUPTI AND LIBKINETO_NOROCTRACER AND LIBKINETO_NOXPUPTI)
1571*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Using CPU-only version of Kineto")
1572*da0073e9SAndroid Build Coastguard Worker  endif()
1573*da0073e9SAndroid Build Coastguard Worker
1574*da0073e9SAndroid Build Coastguard Worker  set(CAFFE2_THIRD_PARTY_ROOT "${PROJECT_SOURCE_DIR}/third_party" CACHE STRING "")
1575*da0073e9SAndroid Build Coastguard Worker  set(KINETO_SOURCE_DIR "${CAFFE2_THIRD_PARTY_ROOT}/kineto/libkineto" CACHE STRING "")
1576*da0073e9SAndroid Build Coastguard Worker  set(KINETO_BUILD_TESTS OFF CACHE BOOL "")
1577*da0073e9SAndroid Build Coastguard Worker  set(KINETO_LIBRARY_TYPE "static" CACHE STRING "")
1578*da0073e9SAndroid Build Coastguard Worker
1579*da0073e9SAndroid Build Coastguard Worker  message(STATUS "Configuring Kineto dependency:")
1580*da0073e9SAndroid Build Coastguard Worker  message(STATUS "  KINETO_SOURCE_DIR = ${KINETO_SOURCE_DIR}")
1581*da0073e9SAndroid Build Coastguard Worker  message(STATUS "  KINETO_BUILD_TESTS = ${KINETO_BUILD_TESTS}")
1582*da0073e9SAndroid Build Coastguard Worker  message(STATUS "  KINETO_LIBRARY_TYPE = ${KINETO_LIBRARY_TYPE}")
1583*da0073e9SAndroid Build Coastguard Worker
1584*da0073e9SAndroid Build Coastguard Worker  if(NOT LIBKINETO_NOCUPTI)
1585*da0073e9SAndroid Build Coastguard Worker    set(CUDA_SOURCE_DIR "${CUDA_TOOLKIT_ROOT_DIR}" CACHE STRING "")
1586*da0073e9SAndroid Build Coastguard Worker    message(STATUS "  CUDA_SOURCE_DIR = ${CUDA_SOURCE_DIR}")
1587*da0073e9SAndroid Build Coastguard Worker    message(STATUS "  CUDA_INCLUDE_DIRS = ${CUDA_INCLUDE_DIRS}")
1588*da0073e9SAndroid Build Coastguard Worker
1589*da0073e9SAndroid Build Coastguard Worker    if(NOT MSVC)
1590*da0073e9SAndroid Build Coastguard Worker      if(USE_CUPTI_SO)
1591*da0073e9SAndroid Build Coastguard Worker        set(CUPTI_LIB_NAME "libcupti.so")
1592*da0073e9SAndroid Build Coastguard Worker      else()
1593*da0073e9SAndroid Build Coastguard Worker        set(CUPTI_LIB_NAME "libcupti_static.a")
1594*da0073e9SAndroid Build Coastguard Worker      endif()
1595*da0073e9SAndroid Build Coastguard Worker    else()
1596*da0073e9SAndroid Build Coastguard Worker      set(CUPTI_LIB_NAME "cupti.lib")
1597*da0073e9SAndroid Build Coastguard Worker    endif()
1598*da0073e9SAndroid Build Coastguard Worker
1599*da0073e9SAndroid Build Coastguard Worker    find_library(CUPTI_LIBRARY_PATH ${CUPTI_LIB_NAME} PATHS
1600*da0073e9SAndroid Build Coastguard Worker        ${CUDA_SOURCE_DIR}
1601*da0073e9SAndroid Build Coastguard Worker        ${CUDA_SOURCE_DIR}/extras/CUPTI/lib64
1602*da0073e9SAndroid Build Coastguard Worker        ${CUDA_SOURCE_DIR}/lib
1603*da0073e9SAndroid Build Coastguard Worker        ${CUDA_SOURCE_DIR}/lib64
1604*da0073e9SAndroid Build Coastguard Worker        NO_DEFAULT_PATH)
1605*da0073e9SAndroid Build Coastguard Worker
1606*da0073e9SAndroid Build Coastguard Worker    find_path(CUPTI_INCLUDE_DIR cupti.h PATHS
1607*da0073e9SAndroid Build Coastguard Worker        ${CUDA_SOURCE_DIR}/extras/CUPTI/include
1608*da0073e9SAndroid Build Coastguard Worker        ${CUDA_INCLUDE_DIRS}
1609*da0073e9SAndroid Build Coastguard Worker        ${CUDA_SOURCE_DIR}
1610*da0073e9SAndroid Build Coastguard Worker        ${CUDA_SOURCE_DIR}/include
1611*da0073e9SAndroid Build Coastguard Worker        NO_DEFAULT_PATH)
1612*da0073e9SAndroid Build Coastguard Worker
1613*da0073e9SAndroid Build Coastguard Worker    if(CUPTI_LIBRARY_PATH AND CUPTI_INCLUDE_DIR)
1614*da0073e9SAndroid Build Coastguard Worker      message(STATUS "  CUPTI_INCLUDE_DIR = ${CUPTI_INCLUDE_DIR}")
1615*da0073e9SAndroid Build Coastguard Worker      set(CUDA_cupti_LIBRARY ${CUPTI_LIBRARY_PATH})
1616*da0073e9SAndroid Build Coastguard Worker      message(STATUS "  CUDA_cupti_LIBRARY = ${CUDA_cupti_LIBRARY}")
1617*da0073e9SAndroid Build Coastguard Worker      message(STATUS "Found CUPTI")
1618*da0073e9SAndroid Build Coastguard Worker      set(LIBKINETO_NOCUPTI OFF CACHE STRING "" FORCE)
1619*da0073e9SAndroid Build Coastguard Worker
1620*da0073e9SAndroid Build Coastguard Worker      # I've only tested this sanity check on Linux; if someone
1621*da0073e9SAndroid Build Coastguard Worker      # runs into this bug on another platform feel free to
1622*da0073e9SAndroid Build Coastguard Worker      # generalize it accordingly
1623*da0073e9SAndroid Build Coastguard Worker      if(NOT USE_CUPTI_SO AND UNIX)
1624*da0073e9SAndroid Build Coastguard Worker        include(CheckCXXSourceRuns)
1625*da0073e9SAndroid Build Coastguard Worker        # rt is handled by the CMAKE_REQUIRED_LIBRARIES set above
1626*da0073e9SAndroid Build Coastguard Worker        if(NOT APPLE)
1627*da0073e9SAndroid Build Coastguard Worker          set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} "dl" "pthread")
1628*da0073e9SAndroid Build Coastguard Worker        endif()
1629*da0073e9SAndroid Build Coastguard Worker        set(CMAKE_REQUIRED_LINK_OPTIONS "-Wl,--whole-archive,${CUPTI_LIBRARY_PATH},--no-whole-archive")
1630*da0073e9SAndroid Build Coastguard Worker        check_cxx_source_runs("#include <stdexcept>
1631*da0073e9SAndroid Build Coastguard Worker  int main() {
1632*da0073e9SAndroid Build Coastguard Worker    try {
1633*da0073e9SAndroid Build Coastguard Worker      throw std::runtime_error(\"error\");
1634*da0073e9SAndroid Build Coastguard Worker    } catch (...) {
1635*da0073e9SAndroid Build Coastguard Worker      return 0;
1636*da0073e9SAndroid Build Coastguard Worker    }
1637*da0073e9SAndroid Build Coastguard Worker    return 1;
1638*da0073e9SAndroid Build Coastguard Worker  }" EXCEPTIONS_WORK)
1639*da0073e9SAndroid Build Coastguard Worker        set(CMAKE_REQUIRED_LINK_OPTIONS "")
1640*da0073e9SAndroid Build Coastguard Worker        if(NOT EXCEPTIONS_WORK)
1641*da0073e9SAndroid Build Coastguard Worker          message(FATAL_ERROR "Detected that statically linking against CUPTI causes exceptions to stop working.  See https://github.com/pytorch/pytorch/issues/57744 for more details.  Perhaps try: USE_CUPTI_SO=1 python setup.py develop --cmake")
1642*da0073e9SAndroid Build Coastguard Worker        endif()
1643*da0073e9SAndroid Build Coastguard Worker      endif()
1644*da0073e9SAndroid Build Coastguard Worker
1645*da0073e9SAndroid Build Coastguard Worker    else()
1646*da0073e9SAndroid Build Coastguard Worker      message(STATUS "Could not find CUPTI library, using CPU-only Kineto build")
1647*da0073e9SAndroid Build Coastguard Worker      set(LIBKINETO_NOCUPTI ON CACHE STRING "" FORCE)
1648*da0073e9SAndroid Build Coastguard Worker    endif()
1649*da0073e9SAndroid Build Coastguard Worker  endif()
1650*da0073e9SAndroid Build Coastguard Worker
1651*da0073e9SAndroid Build Coastguard Worker  if(NOT LIBKINETO_NOROCTRACER)
1652*da0073e9SAndroid Build Coastguard Worker    if("$ENV{ROCM_SOURCE_DIR}" STREQUAL "")
1653*da0073e9SAndroid Build Coastguard Worker      set(ENV{ROCM_SOURCE_DIR} "/opt/rocm")
1654*da0073e9SAndroid Build Coastguard Worker    endif()
1655*da0073e9SAndroid Build Coastguard Worker  endif()
1656*da0073e9SAndroid Build Coastguard Worker
1657*da0073e9SAndroid Build Coastguard Worker  if(NOT TARGET kineto)
1658*da0073e9SAndroid Build Coastguard Worker    add_subdirectory("${KINETO_SOURCE_DIR}")
1659*da0073e9SAndroid Build Coastguard Worker    set_property(TARGET kineto PROPERTY POSITION_INDEPENDENT_CODE ON)
1660*da0073e9SAndroid Build Coastguard Worker  endif()
1661*da0073e9SAndroid Build Coastguard Worker  list(APPEND Caffe2_DEPENDENCY_LIBS kineto)
1662*da0073e9SAndroid Build Coastguard Worker  string(APPEND CMAKE_CXX_FLAGS " -DUSE_KINETO")
1663*da0073e9SAndroid Build Coastguard Worker  if(LIBKINETO_NOCUPTI)
1664*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -DLIBKINETO_NOCUPTI")
1665*da0073e9SAndroid Build Coastguard Worker  endif()
1666*da0073e9SAndroid Build Coastguard Worker  if(LIBKINETO_NOROCTRACER)
1667*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -DLIBKINETO_NOROCTRACER")
1668*da0073e9SAndroid Build Coastguard Worker  endif()
1669*da0073e9SAndroid Build Coastguard Worker  if(LIBKINETO_NOXPUPTI)
1670*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -DLIBKINETO_NOXPUPTI=ON")
1671*da0073e9SAndroid Build Coastguard Worker  else()
1672*da0073e9SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " -DLIBKINETO_NOXPUPTI=OFF")
1673*da0073e9SAndroid Build Coastguard Worker  endif()
1674*da0073e9SAndroid Build Coastguard Worker  if(LIBKINETO_NOCUPTI AND LIBKINETO_NOROCTRACER AND LIBKINETO_NOXPUPTI)
1675*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Configured Kineto (CPU)")
1676*da0073e9SAndroid Build Coastguard Worker  else()
1677*da0073e9SAndroid Build Coastguard Worker    message(STATUS "Configured Kineto")
1678*da0073e9SAndroid Build Coastguard Worker  endif()
1679*da0073e9SAndroid Build Coastguard Workerendif()
1680*da0073e9SAndroid Build Coastguard Worker
1681*da0073e9SAndroid Build Coastguard Worker# Include google/FlatBuffers
1682*da0073e9SAndroid Build Coastguard Workerinclude(${CMAKE_CURRENT_LIST_DIR}/FlatBuffers.cmake)
1683*da0073e9SAndroid Build Coastguard Worker
1684*da0073e9SAndroid Build Coastguard Worker# Include cpp-httplib
1685*da0073e9SAndroid Build Coastguard Workeradd_library(httplib INTERFACE IMPORTED)
1686*da0073e9SAndroid Build Coastguard Workertarget_include_directories(httplib SYSTEM INTERFACE ${PROJECT_SOURCE_DIR}/third_party/cpp-httplib)
1687*da0073e9SAndroid Build Coastguard Worker
1688*da0073e9SAndroid Build Coastguard Worker# Include nlohmann-json
1689*da0073e9SAndroid Build Coastguard Workeradd_library(nlohmann INTERFACE IMPORTED)
1690*da0073e9SAndroid Build Coastguard Workerinclude_directories(nlohmann SYSTEM INTERFACE ${PROJECT_SOURCE_DIR}/third_party/nlohmann/include)
1691