xref: /aosp_15_r20/external/executorch/CMakeLists.txt (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker# Copyright (c) Meta Platforms, Inc. and affiliates.
2*523fa7a6SAndroid Build Coastguard Worker# All rights reserved.
3*523fa7a6SAndroid Build Coastguard Worker#
4*523fa7a6SAndroid Build Coastguard Worker# This source code is licensed under the BSD-style license found in the
5*523fa7a6SAndroid Build Coastguard Worker# LICENSE file in the root directory of this source tree.
6*523fa7a6SAndroid Build Coastguard Worker
7*523fa7a6SAndroid Build Coastguard Worker#
8*523fa7a6SAndroid Build Coastguard Worker# Simple CMake build system for runtime components.
9*523fa7a6SAndroid Build Coastguard Worker#
10*523fa7a6SAndroid Build Coastguard Worker# ### One-time setup ###
11*523fa7a6SAndroid Build Coastguard Worker#
12*523fa7a6SAndroid Build Coastguard Worker# Configure the CMake build system. It's good practice to do this whenever
13*523fa7a6SAndroid Build Coastguard Worker# cloning or pulling the upstream repo. Once this is done, you don't need to do
14*523fa7a6SAndroid Build Coastguard Worker# it again until you pull from the upstream repo again.
15*523fa7a6SAndroid Build Coastguard Worker#
16*523fa7a6SAndroid Build Coastguard Worker# NOTE: Build options can be configured by passing arguments to cmake. For
17*523fa7a6SAndroid Build Coastguard Worker# example, to enable the EXECUTORCH_BUILD_XNNPACK option, change the cmake
18*523fa7a6SAndroid Build Coastguard Worker# command to 'cmake -DEXECUTORCH_BUILD_XNNPACK=ON ..'.
19*523fa7a6SAndroid Build Coastguard Worker#[[
20*523fa7a6SAndroid Build Coastguard Worker  (rm -rf cmake-out \
21*523fa7a6SAndroid Build Coastguard Worker    && mkdir cmake-out \
22*523fa7a6SAndroid Build Coastguard Worker    && cd cmake-out \
23*523fa7a6SAndroid Build Coastguard Worker    && cmake ..)
24*523fa7a6SAndroid Build Coastguard Worker]]
25*523fa7a6SAndroid Build Coastguard Worker#
26*523fa7a6SAndroid Build Coastguard Worker# ### Build ###
27*523fa7a6SAndroid Build Coastguard Worker#
28*523fa7a6SAndroid Build Coastguard Worker# NOTE: The `-j` argument specifies how many jobs/processes to use when
29*523fa7a6SAndroid Build Coastguard Worker# building, and tends to speed up the build significantly. It's typical to use
30*523fa7a6SAndroid Build Coastguard Worker# "core count + 1" as the `-j` value.
31*523fa7a6SAndroid Build Coastguard Worker# ~~~
32*523fa7a6SAndroid Build Coastguard Worker# cmake --build cmake-out -j9
33*523fa7a6SAndroid Build Coastguard Worker# ~~~
34*523fa7a6SAndroid Build Coastguard Worker#
35*523fa7a6SAndroid Build Coastguard Worker# ### Editing this file ###
36*523fa7a6SAndroid Build Coastguard Worker#
37*523fa7a6SAndroid Build Coastguard Worker# This file should be formatted with
38*523fa7a6SAndroid Build Coastguard Worker# ~~~
39*523fa7a6SAndroid Build Coastguard Worker# cmake-format -i CMakeLists.txt
40*523fa7a6SAndroid Build Coastguard Worker# ~~~
41*523fa7a6SAndroid Build Coastguard Worker# It should also be cmake-lint clean.
42*523fa7a6SAndroid Build Coastguard Worker#
43*523fa7a6SAndroid Build Coastguard Worker
44*523fa7a6SAndroid Build Coastguard Workercmake_minimum_required(VERSION 3.19)
45*523fa7a6SAndroid Build Coastguard Workerproject(executorch)
46*523fa7a6SAndroid Build Coastguard Workerinclude(build/Utils.cmake)
47*523fa7a6SAndroid Build Coastguard Workerinclude(CMakeDependentOption)
48*523fa7a6SAndroid Build Coastguard Worker
49*523fa7a6SAndroid Build Coastguard Workerset(CMAKE_EXPORT_COMPILE_COMMANDS ON)
50*523fa7a6SAndroid Build Coastguard Worker
51*523fa7a6SAndroid Build Coastguard Workerif(NOT CMAKE_CXX_STANDARD)
52*523fa7a6SAndroid Build Coastguard Worker  set(CMAKE_CXX_STANDARD 17)
53*523fa7a6SAndroid Build Coastguard Workerendif()
54*523fa7a6SAndroid Build Coastguard Worker
55*523fa7a6SAndroid Build Coastguard Workerif(NOT CMAKE_BUILD_TYPE)
56*523fa7a6SAndroid Build Coastguard Worker  set(CMAKE_BUILD_TYPE Debug)
57*523fa7a6SAndroid Build Coastguard Workerendif()
58*523fa7a6SAndroid Build Coastguard Worker
59*523fa7a6SAndroid Build Coastguard Worker# ------------------------------ OPTIONS -------------------------------------
60*523fa7a6SAndroid Build Coastguard Worker# WARNING: Please don't add example specific options in this CMakeLists.txt.
61*523fa7a6SAndroid Build Coastguard Worker# Instead please use `find_package(executorch REQUIRED)` in the example
62*523fa7a6SAndroid Build Coastguard Worker# directory and add a new executable in the example `CMakeLists.txt`.
63*523fa7a6SAndroid Build Coastguard Worker
64*523fa7a6SAndroid Build Coastguard Worker# _default_release_disabled_options: default value for options that should be
65*523fa7a6SAndroid Build Coastguard Worker# disabled in Release mode by default. Users can still manually enable them,
66*523fa7a6SAndroid Build Coastguard Worker# though.
67*523fa7a6SAndroid Build Coastguard Workerif(CMAKE_BUILD_TYPE STREQUAL "Release")
68*523fa7a6SAndroid Build Coastguard Worker  set(_default_release_disabled_options OFF)
69*523fa7a6SAndroid Build Coastguard Workerelse()
70*523fa7a6SAndroid Build Coastguard Worker  set(_default_release_disabled_options ON)
71*523fa7a6SAndroid Build Coastguard Workerendif()
72*523fa7a6SAndroid Build Coastguard Worker
73*523fa7a6SAndroid Build Coastguard Worker# Let users override which PAL defaults to use.
74*523fa7a6SAndroid Build Coastguard Worker#
75*523fa7a6SAndroid Build Coastguard Worker# TODO(dbort): Add another option that lets users point to a specific source
76*523fa7a6SAndroid Build Coastguard Worker# file; if set, would override the default option.
77*523fa7a6SAndroid Build Coastguard Workerset(EXECUTORCH_PAL_DEFAULT
78*523fa7a6SAndroid Build Coastguard Worker    "posix"
79*523fa7a6SAndroid Build Coastguard Worker    CACHE STRING
80*523fa7a6SAndroid Build Coastguard Worker          "Which PAL default implementation to use: one of {posix, minimal}"
81*523fa7a6SAndroid Build Coastguard Worker)
82*523fa7a6SAndroid Build Coastguard Worker
83*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_ENABLE_LOGGING "Build with ET_LOG_ENABLED"
84*523fa7a6SAndroid Build Coastguard Worker       ${_default_release_disabled_options}
85*523fa7a6SAndroid Build Coastguard Worker)
86*523fa7a6SAndroid Build Coastguard Workerif(NOT EXECUTORCH_ENABLE_LOGGING)
87*523fa7a6SAndroid Build Coastguard Worker  # Avoid pulling in the logging strings, which can be large. Note that this
88*523fa7a6SAndroid Build Coastguard Worker  # will set the compiler flag for all targets in this directory, and for all
89*523fa7a6SAndroid Build Coastguard Worker  # subdirectories included after this point.
90*523fa7a6SAndroid Build Coastguard Worker  add_definitions(-DET_LOG_ENABLED=0)
91*523fa7a6SAndroid Build Coastguard Workerendif()
92*523fa7a6SAndroid Build Coastguard Worker
93*523fa7a6SAndroid Build Coastguard Worker# Configure log level. Must be one of debug, info, error, fatal.
94*523fa7a6SAndroid Build Coastguard Workerset(EXECUTORCH_LOG_LEVEL
95*523fa7a6SAndroid Build Coastguard Worker    "Info"
96*523fa7a6SAndroid Build Coastguard Worker    CACHE STRING "Build with the given ET_MIN_LOG_LEVEL value"
97*523fa7a6SAndroid Build Coastguard Worker)
98*523fa7a6SAndroid Build Coastguard Workerstring(TOLOWER "${EXECUTORCH_LOG_LEVEL}" LOG_LEVEL_LOWER)
99*523fa7a6SAndroid Build Coastguard Workerif(LOG_LEVEL_LOWER STREQUAL "debug")
100*523fa7a6SAndroid Build Coastguard Worker  add_definitions(-DET_MIN_LOG_LEVEL=Debug)
101*523fa7a6SAndroid Build Coastguard Workerelseif(LOG_LEVEL_LOWER STREQUAL "info")
102*523fa7a6SAndroid Build Coastguard Worker  add_definitions(-DET_MIN_LOG_LEVEL=Info)
103*523fa7a6SAndroid Build Coastguard Workerelseif(LOG_LEVEL_LOWER STREQUAL "error")
104*523fa7a6SAndroid Build Coastguard Worker  add_definitions(-DET_MIN_LOG_LEVEL=Error)
105*523fa7a6SAndroid Build Coastguard Workerelseif(LOG_LEVEL_LOWER STREQUAL "fatal")
106*523fa7a6SAndroid Build Coastguard Worker  add_definitions(-DET_MIN_LOG_LEVEL=Fatal)
107*523fa7a6SAndroid Build Coastguard Workerelse()
108*523fa7a6SAndroid Build Coastguard Worker  message(
109*523fa7a6SAndroid Build Coastguard Worker    SEND_ERROR
110*523fa7a6SAndroid Build Coastguard Worker      "Unknown log level \"${EXECUTORCH_LOG_LEVEL}\". Expected one of Debug, "
111*523fa7a6SAndroid Build Coastguard Worker      + "Info, Error, or Fatal."
112*523fa7a6SAndroid Build Coastguard Worker  )
113*523fa7a6SAndroid Build Coastguard Workerendif()
114*523fa7a6SAndroid Build Coastguard Worker
115*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_ENABLE_PROGRAM_VERIFICATION
116*523fa7a6SAndroid Build Coastguard Worker       "Build with ET_ENABLE_PROGRAM_VERIFICATION"
117*523fa7a6SAndroid Build Coastguard Worker       ${_default_release_disabled_options}
118*523fa7a6SAndroid Build Coastguard Worker)
119*523fa7a6SAndroid Build Coastguard Workerif(NOT EXECUTORCH_ENABLE_PROGRAM_VERIFICATION)
120*523fa7a6SAndroid Build Coastguard Worker  # Avoid pulling in the flatbuffer data verification logic, which can add about
121*523fa7a6SAndroid Build Coastguard Worker  # 20kB. Note that this will set the compiler flag for all targets in this
122*523fa7a6SAndroid Build Coastguard Worker  # directory, and for all subdirectories included after this point.
123*523fa7a6SAndroid Build Coastguard Worker  add_definitions(-DET_ENABLE_PROGRAM_VERIFICATION=0)
124*523fa7a6SAndroid Build Coastguard Workerendif()
125*523fa7a6SAndroid Build Coastguard Worker
126*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_ENABLE_EVENT_TRACER "Build with ET_EVENT_TRACER_ENABLED=ON"
127*523fa7a6SAndroid Build Coastguard Worker       OFF
128*523fa7a6SAndroid Build Coastguard Worker)
129*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_ENABLE_EVENT_TRACER)
130*523fa7a6SAndroid Build Coastguard Worker  add_definitions(-DET_EVENT_TRACER_ENABLED)
131*523fa7a6SAndroid Build Coastguard Workerendif()
132*523fa7a6SAndroid Build Coastguard Worker
133*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_DO_NOT_USE_CXX11_ABI "Define _GLIBCXX_USE_CXX11_ABI=0 if ON"
134*523fa7a6SAndroid Build Coastguard Worker       OFF
135*523fa7a6SAndroid Build Coastguard Worker)
136*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_DO_NOT_USE_CXX11_ABI)
137*523fa7a6SAndroid Build Coastguard Worker  add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
138*523fa7a6SAndroid Build Coastguard Workerendif()
139*523fa7a6SAndroid Build Coastguard Worker# -ffunction-sections -fdata-sections: breaks function and data into sections so
140*523fa7a6SAndroid Build Coastguard Worker# they can be properly gc'd. -s: strip symbol. -fno-exceptions -fno-rtti:
141*523fa7a6SAndroid Build Coastguard Worker# disables exceptions and runtime type.
142*523fa7a6SAndroid Build Coastguard Workerset(CMAKE_CXX_FLAGS_RELEASE
143*523fa7a6SAndroid Build Coastguard Worker    "-ffunction-sections -fdata-sections -fno-exceptions -fno-rtti"
144*523fa7a6SAndroid Build Coastguard Worker)
145*523fa7a6SAndroid Build Coastguard Workerif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
146*523fa7a6SAndroid Build Coastguard Worker  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
147*523fa7a6SAndroid Build Coastguard Workerendif()
148*523fa7a6SAndroid Build Coastguard Worker
149*523fa7a6SAndroid Build Coastguard Workeroption(OPTIMIZE_SIZE "Build executorch runtime optimizing for binary size" OFF)
150*523fa7a6SAndroid Build Coastguard Workerif(OPTIMIZE_SIZE)
151*523fa7a6SAndroid Build Coastguard Worker  # -Os: Optimize for size
152*523fa7a6SAndroid Build Coastguard Worker  set(CMAKE_CXX_FLAGS_RELEASE "-Os ${CMAKE_CXX_FLAGS_RELEASE}")
153*523fa7a6SAndroid Build Coastguard Workerelse()
154*523fa7a6SAndroid Build Coastguard Worker  # -O2: Moderate opt.
155*523fa7a6SAndroid Build Coastguard Worker  set(CMAKE_CXX_FLAGS_RELEASE "-O2 ${CMAKE_CXX_FLAGS_RELEASE}")
156*523fa7a6SAndroid Build Coastguard Workerendif()
157*523fa7a6SAndroid Build Coastguard Worker
158*523fa7a6SAndroid Build Coastguard Workerset(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
159*523fa7a6SAndroid Build Coastguard Worker
160*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_ANDROID_JNI "Build Android JNI" OFF)
161*523fa7a6SAndroid Build Coastguard Worker
162*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_ARM_BAREMETAL
163*523fa7a6SAndroid Build Coastguard Worker       "Build the Arm Baremetal flow for Cortex-M and Ethos-U" OFF
164*523fa7a6SAndroid Build Coastguard Worker)
165*523fa7a6SAndroid Build Coastguard Worker
166*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_COREML "Build the Core ML backend" OFF)
167*523fa7a6SAndroid Build Coastguard Worker
168*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_KERNELS_CUSTOM "Build the custom kernels" OFF)
169*523fa7a6SAndroid Build Coastguard Worker
170*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_KERNELS_CUSTOM_AOT "Build the custom ops lib for AOT"
171*523fa7a6SAndroid Build Coastguard Worker       OFF
172*523fa7a6SAndroid Build Coastguard Worker)
173*523fa7a6SAndroid Build Coastguard Worker
174*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_EXTENSION_DATA_LOADER "Build the Data Loader extension"
175*523fa7a6SAndroid Build Coastguard Worker       OFF
176*523fa7a6SAndroid Build Coastguard Worker)
177*523fa7a6SAndroid Build Coastguard Worker
178*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_EXTENSION_MODULE "Build the Module extension" OFF)
179*523fa7a6SAndroid Build Coastguard Worker
180*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_EXTENSION_RUNNER_UTIL "Build the Runner Util extension"
181*523fa7a6SAndroid Build Coastguard Worker       OFF
182*523fa7a6SAndroid Build Coastguard Worker)
183*523fa7a6SAndroid Build Coastguard Worker
184*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_EXTENSION_TENSOR "Build the Tensor extension" OFF)
185*523fa7a6SAndroid Build Coastguard Worker
186*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_EXTENSION_TRAINING "Build the training extension" OFF)
187*523fa7a6SAndroid Build Coastguard Worker
188*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_GTESTS "Build googletest based test binaries" OFF)
189*523fa7a6SAndroid Build Coastguard Worker
190*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_MPS "Build the MPS backend" OFF)
191*523fa7a6SAndroid Build Coastguard Worker
192*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_NEURON "Build the backends/mediatek directory" OFF)
193*523fa7a6SAndroid Build Coastguard Worker
194*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_PYBIND "Build the Python Bindings" OFF)
195*523fa7a6SAndroid Build Coastguard Worker
196*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_QNN "Build the Qualcomm backend" OFF)
197*523fa7a6SAndroid Build Coastguard Worker
198*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_KERNELS_OPTIMIZED "Build the optimized kernels" OFF)
199*523fa7a6SAndroid Build Coastguard Worker
200*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_KERNELS_QUANTIZED "Build the quantized kernels" OFF)
201*523fa7a6SAndroid Build Coastguard Worker
202*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_DEVTOOLS "Build the ExecuTorch Developer Tools")
203*523fa7a6SAndroid Build Coastguard Worker
204*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_NNLIB_OPT "Build Cadence backend Hifi nnlib kernel" OFF)
205*523fa7a6SAndroid Build Coastguard Worker
206*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_CADENCE_CPU_RUNNER "Build Cadence backend CPU runner" OFF)
207*523fa7a6SAndroid Build Coastguard Worker
208*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_SIZE_TEST "Build the size test" OFF)
209*523fa7a6SAndroid Build Coastguard Worker
210*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_XNNPACK "Build the XNNPACK backend" OFF)
211*523fa7a6SAndroid Build Coastguard Worker
212*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_VULKAN "Build the Vulkan backend" OFF)
213*523fa7a6SAndroid Build Coastguard Worker
214*523fa7a6SAndroid Build Coastguard Workeroption(BUILD_EXECUTORCH_PORTABLE_OPS "Build portable_ops library" ON)
215*523fa7a6SAndroid Build Coastguard Worker
216*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_USE_DL "Use libdl library" ON)
217*523fa7a6SAndroid Build Coastguard Worker
218*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_BUILD_CADENCE "Build the Cadence DSP backend" OFF)
219*523fa7a6SAndroid Build Coastguard Worker
220*523fa7a6SAndroid Build Coastguard Worker#
221*523fa7a6SAndroid Build Coastguard Worker# pthreadpool: build pthreadpool library. Disable on unsupported platforms
222*523fa7a6SAndroid Build Coastguard Worker#
223*523fa7a6SAndroid Build Coastguard Workercmake_dependent_option(
224*523fa7a6SAndroid Build Coastguard Worker  EXECUTORCH_BUILD_PTHREADPOOL "Build pthreadpool library." ON
225*523fa7a6SAndroid Build Coastguard Worker  "NOT EXECUTORCH_BUILD_ARM_BAREMETAL" OFF
226*523fa7a6SAndroid Build Coastguard Worker)
227*523fa7a6SAndroid Build Coastguard Worker
228*523fa7a6SAndroid Build Coastguard Worker#
229*523fa7a6SAndroid Build Coastguard Worker# cpuinfo: build cpuinfo library. Disable on unsupported platforms
230*523fa7a6SAndroid Build Coastguard Worker#
231*523fa7a6SAndroid Build Coastguard Workercmake_dependent_option(
232*523fa7a6SAndroid Build Coastguard Worker  EXECUTORCH_BUILD_CPUINFO "Build cpuinfo library." ON
233*523fa7a6SAndroid Build Coastguard Worker  "NOT EXECUTORCH_BUILD_ARM_BAREMETAL" OFF
234*523fa7a6SAndroid Build Coastguard Worker)
235*523fa7a6SAndroid Build Coastguard Worker
236*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_KERNELS_CUSTOM_AOT)
237*523fa7a6SAndroid Build Coastguard Worker  set(EXECUTORCH_BUILD_EXTENSION_TENSOR ON)
238*523fa7a6SAndroid Build Coastguard Worker  set(EXECUTORCH_BUILD_KERNELS_CUSTOM ON)
239*523fa7a6SAndroid Build Coastguard Workerendif()
240*523fa7a6SAndroid Build Coastguard Worker
241*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_KERNELS_CUSTOM)
242*523fa7a6SAndroid Build Coastguard Worker  set(EXECUTORCH_BUILD_KERNELS_OPTIMIZED ON)
243*523fa7a6SAndroid Build Coastguard Workerendif()
244*523fa7a6SAndroid Build Coastguard Worker
245*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_CPUINFO)
246*523fa7a6SAndroid Build Coastguard Worker  # --- cpuinfo
247*523fa7a6SAndroid Build Coastguard Worker  set(ORIGINAL_CMAKE_POSITION_INDEPENDENT_CODE_FLAG
248*523fa7a6SAndroid Build Coastguard Worker      ${CMAKE_POSITION_INDEPENDENT_CODE}
249*523fa7a6SAndroid Build Coastguard Worker  )
250*523fa7a6SAndroid Build Coastguard Worker  set(CMAKE_POSITION_INDEPENDENT_CODE ON)
251*523fa7a6SAndroid Build Coastguard Worker  set(CPUINFO_SOURCE_DIR "backends/xnnpack/third-party/cpuinfo")
252*523fa7a6SAndroid Build Coastguard Worker  set(CPUINFO_BUILD_TOOLS
253*523fa7a6SAndroid Build Coastguard Worker      OFF
254*523fa7a6SAndroid Build Coastguard Worker      CACHE BOOL ""
255*523fa7a6SAndroid Build Coastguard Worker  )
256*523fa7a6SAndroid Build Coastguard Worker  set(CPUINFO_BUILD_UNIT_TESTS
257*523fa7a6SAndroid Build Coastguard Worker      OFF
258*523fa7a6SAndroid Build Coastguard Worker      CACHE BOOL ""
259*523fa7a6SAndroid Build Coastguard Worker  )
260*523fa7a6SAndroid Build Coastguard Worker  set(CPUINFO_BUILD_MOCK_TESTS
261*523fa7a6SAndroid Build Coastguard Worker      OFF
262*523fa7a6SAndroid Build Coastguard Worker      CACHE BOOL ""
263*523fa7a6SAndroid Build Coastguard Worker  )
264*523fa7a6SAndroid Build Coastguard Worker  set(CPUINFO_BUILD_BENCHMARKS
265*523fa7a6SAndroid Build Coastguard Worker      OFF
266*523fa7a6SAndroid Build Coastguard Worker      CACHE BOOL ""
267*523fa7a6SAndroid Build Coastguard Worker  )
268*523fa7a6SAndroid Build Coastguard Worker  set(CPUINFO_LIBRARY_TYPE
269*523fa7a6SAndroid Build Coastguard Worker      "static"
270*523fa7a6SAndroid Build Coastguard Worker      CACHE STRING ""
271*523fa7a6SAndroid Build Coastguard Worker  )
272*523fa7a6SAndroid Build Coastguard Worker  set(CPUINFO_LOG_LEVEL
273*523fa7a6SAndroid Build Coastguard Worker      "error"
274*523fa7a6SAndroid Build Coastguard Worker      CACHE STRING ""
275*523fa7a6SAndroid Build Coastguard Worker  )
276*523fa7a6SAndroid Build Coastguard Worker  set(CLOG_SOURCE_DIR "${CPUINFO_SOURCE_DIR}/deps/clog")
277*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory("${CPUINFO_SOURCE_DIR}")
278*523fa7a6SAndroid Build Coastguard Worker  set(CMAKE_POSITION_INDEPENDENT_CODE
279*523fa7a6SAndroid Build Coastguard Worker      ${ORIGINAL_CMAKE_POSITION_INDEPENDENT_CODE_FLAG}
280*523fa7a6SAndroid Build Coastguard Worker  )
281*523fa7a6SAndroid Build Coastguard Workerendif()
282*523fa7a6SAndroid Build Coastguard Worker
283*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_PTHREADPOOL)
284*523fa7a6SAndroid Build Coastguard Worker  # --- pthreadpool
285*523fa7a6SAndroid Build Coastguard Worker  set(ORIGINAL_CMAKE_POSITION_INDEPENDENT_CODE_FLAG
286*523fa7a6SAndroid Build Coastguard Worker      ${CMAKE_POSITION_INDEPENDENT_CODE}
287*523fa7a6SAndroid Build Coastguard Worker  )
288*523fa7a6SAndroid Build Coastguard Worker  set(CMAKE_POSITION_INDEPENDENT_CODE ON)
289*523fa7a6SAndroid Build Coastguard Worker  set(PTHREADPOOL_SOURCE_DIR "backends/xnnpack/third-party/pthreadpool")
290*523fa7a6SAndroid Build Coastguard Worker  set(PTHREADPOOL_BUILD_TESTS
291*523fa7a6SAndroid Build Coastguard Worker      OFF
292*523fa7a6SAndroid Build Coastguard Worker      CACHE BOOL ""
293*523fa7a6SAndroid Build Coastguard Worker  )
294*523fa7a6SAndroid Build Coastguard Worker  set(PTHREADPOOL_BUILD_BENCHMARKS
295*523fa7a6SAndroid Build Coastguard Worker      OFF
296*523fa7a6SAndroid Build Coastguard Worker      CACHE BOOL ""
297*523fa7a6SAndroid Build Coastguard Worker  )
298*523fa7a6SAndroid Build Coastguard Worker  set(PTHREADPOOL_LIBRARY_TYPE
299*523fa7a6SAndroid Build Coastguard Worker      "static"
300*523fa7a6SAndroid Build Coastguard Worker      CACHE STRING ""
301*523fa7a6SAndroid Build Coastguard Worker  )
302*523fa7a6SAndroid Build Coastguard Worker  set(PTHREADPOOL_ALLOW_DEPRECATED_API
303*523fa7a6SAndroid Build Coastguard Worker      ON
304*523fa7a6SAndroid Build Coastguard Worker      CACHE BOOL ""
305*523fa7a6SAndroid Build Coastguard Worker  )
306*523fa7a6SAndroid Build Coastguard Worker  if(APPLE)
307*523fa7a6SAndroid Build Coastguard Worker    set(PTHREADPOOL_SYNC_PRIMITIVE
308*523fa7a6SAndroid Build Coastguard Worker        "condvar"
309*523fa7a6SAndroid Build Coastguard Worker        CACHE STRING ""
310*523fa7a6SAndroid Build Coastguard Worker    )
311*523fa7a6SAndroid Build Coastguard Worker  endif()
312*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory("${PTHREADPOOL_SOURCE_DIR}")
313*523fa7a6SAndroid Build Coastguard Worker  set(CMAKE_POSITION_INDEPENDENT_CODE
314*523fa7a6SAndroid Build Coastguard Worker      ${ORIGINAL_CMAKE_POSITION_INDEPENDENT_CODE_FLAG}
315*523fa7a6SAndroid Build Coastguard Worker  )
316*523fa7a6SAndroid Build Coastguard Workerendif()
317*523fa7a6SAndroid Build Coastguard Worker
318*523fa7a6SAndroid Build Coastguard Workerif(NOT PYTHON_EXECUTABLE)
319*523fa7a6SAndroid Build Coastguard Worker  resolve_python_executable()
320*523fa7a6SAndroid Build Coastguard Workerendif()
321*523fa7a6SAndroid Build Coastguard Workermessage(STATUS "Using python executable '${PYTHON_EXECUTABLE}'")
322*523fa7a6SAndroid Build Coastguard Worker
323*523fa7a6SAndroid Build Coastguard Worker# TODO(dbort): Fix these warnings and remove this flag.
324*523fa7a6SAndroid Build Coastguard Workerset(_common_compile_options -Wno-deprecated-declarations -fPIC)
325*523fa7a6SAndroid Build Coastguard Worker
326*523fa7a6SAndroid Build Coastguard Worker# Let files say "include <executorch/path/to/header.h>".
327*523fa7a6SAndroid Build Coastguard Worker# TODO(#6475): This requires/assumes that the repo lives in a directory named
328*523fa7a6SAndroid Build Coastguard Worker# exactly `executorch`. Check the assumption first. Remove this check once we
329*523fa7a6SAndroid Build Coastguard Worker# stop relying on the assumption.
330*523fa7a6SAndroid Build Coastguard Workercmake_path(GET CMAKE_CURRENT_SOURCE_DIR FILENAME _repo_dir_name)
331*523fa7a6SAndroid Build Coastguard Workerif(NOT "${_repo_dir_name}" STREQUAL "executorch")
332*523fa7a6SAndroid Build Coastguard Worker  message(
333*523fa7a6SAndroid Build Coastguard Worker    FATAL_ERROR
334*523fa7a6SAndroid Build Coastguard Worker      "The ExecuTorch repo must be cloned into a directory named exactly "
335*523fa7a6SAndroid Build Coastguard Worker      "`executorch`; found `${_repo_dir_name}`. See "
336*523fa7a6SAndroid Build Coastguard Worker      "https://github.com/pytorch/executorch/issues/6475 for progress on a "
337*523fa7a6SAndroid Build Coastguard Worker      "fix for this restriction."
338*523fa7a6SAndroid Build Coastguard Worker  )
339*523fa7a6SAndroid Build Coastguard Workerendif()
340*523fa7a6SAndroid Build Coastguard Workerset(_common_include_directories ${CMAKE_CURRENT_SOURCE_DIR}/..)
341*523fa7a6SAndroid Build Coastguard Worker
342*523fa7a6SAndroid Build Coastguard Worker#
343*523fa7a6SAndroid Build Coastguard Worker# The `_<target>_srcs` lists are defined by including ${EXECUTORCH_SRCS_FILE}.
344*523fa7a6SAndroid Build Coastguard Worker#
345*523fa7a6SAndroid Build Coastguard Worker
346*523fa7a6SAndroid Build Coastguard Workerif(NOT EXECUTORCH_SRCS_FILE)
347*523fa7a6SAndroid Build Coastguard Worker  # Find or download buck2 binary.
348*523fa7a6SAndroid Build Coastguard Worker  resolve_buck2()
349*523fa7a6SAndroid Build Coastguard Worker
350*523fa7a6SAndroid Build Coastguard Worker  # A file wasn't provided. Run a script to extract the source lists from the
351*523fa7a6SAndroid Build Coastguard Worker  # buck2 build system and write them to a file we can include.
352*523fa7a6SAndroid Build Coastguard Worker  #
353*523fa7a6SAndroid Build Coastguard Worker  # NOTE: This will only happen once during cmake setup, so it will not re-run
354*523fa7a6SAndroid Build Coastguard Worker  # if the buck2 targets change.
355*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "executorch: Generating source lists")
356*523fa7a6SAndroid Build Coastguard Worker  set(EXECUTORCH_SRCS_FILE "${CMAKE_CURRENT_BINARY_DIR}/executorch_srcs.cmake")
357*523fa7a6SAndroid Build Coastguard Worker  extract_sources(${EXECUTORCH_SRCS_FILE})
358*523fa7a6SAndroid Build Coastguard Workerendif()
359*523fa7a6SAndroid Build Coastguard Worker
360*523fa7a6SAndroid Build Coastguard Worker# This file defines the `_<target>__srcs` variables used below.
361*523fa7a6SAndroid Build Coastguard Workermessage(STATUS "executorch: Using sources file ${EXECUTORCH_SRCS_FILE}")
362*523fa7a6SAndroid Build Coastguard Workerinclude(${EXECUTORCH_SRCS_FILE})
363*523fa7a6SAndroid Build Coastguard Worker
364*523fa7a6SAndroid Build Coastguard Worker#
365*523fa7a6SAndroid Build Coastguard Worker# Modify default options when cross-compiling.
366*523fa7a6SAndroid Build Coastguard Worker#
367*523fa7a6SAndroid Build Coastguard Worker# The intent is for the EXECUTORCH_BUILD_HOST_TARGETS option to affect the
368*523fa7a6SAndroid Build Coastguard Worker# default ON/OFF values of host targets around the tree. This way, a user can
369*523fa7a6SAndroid Build Coastguard Worker# disable EXECUTORCH_BUILD_HOST_TARGETS to disable all host targets, and then
370*523fa7a6SAndroid Build Coastguard Worker# optionally re-enable some of those targets. Or they could leave
371*523fa7a6SAndroid Build Coastguard Worker# EXECUTORCH_BUILD_HOST_TARGETS enabled and then optionally disable any given
372*523fa7a6SAndroid Build Coastguard Worker# host target.
373*523fa7a6SAndroid Build Coastguard Worker#
374*523fa7a6SAndroid Build Coastguard Worker# We can then use various cross-compilation hints to set the default value of
375*523fa7a6SAndroid Build Coastguard Worker# EXECUTORCH_BUILD_HOST_TARGETS, which can still be overridden if desired.
376*523fa7a6SAndroid Build Coastguard Worker#
377*523fa7a6SAndroid Build Coastguard Worker
378*523fa7a6SAndroid Build Coastguard Worker# Detect if an iOS toolchain is set.
379*523fa7a6SAndroid Build Coastguard Workerif(CMAKE_TOOLCHAIN_FILE MATCHES ".*(iOS|ios\.toolchain)\.cmake$")
380*523fa7a6SAndroid Build Coastguard Worker  set(CMAKE_TOOLCHAIN_IOS ON)
381*523fa7a6SAndroid Build Coastguard Workerelse()
382*523fa7a6SAndroid Build Coastguard Worker  set(CMAKE_TOOLCHAIN_IOS OFF)
383*523fa7a6SAndroid Build Coastguard Workerendif()
384*523fa7a6SAndroid Build Coastguard Worker
385*523fa7a6SAndroid Build Coastguard Worker# Detect if an Android toolchain is set.
386*523fa7a6SAndroid Build Coastguard Workerif(CMAKE_TOOLCHAIN_FILE MATCHES ".*android\.toolchain\.cmake$")
387*523fa7a6SAndroid Build Coastguard Worker  set(CMAKE_TOOLCHAIN_ANDROID ON)
388*523fa7a6SAndroid Build Coastguard Workerif(NOT ANDROID_PLATFORM)
389*523fa7a6SAndroid Build Coastguard Worker  set(ANDROID_PLATFORM android-30)
390*523fa7a6SAndroid Build Coastguard Workerendif()
391*523fa7a6SAndroid Build Coastguard Workerelse()
392*523fa7a6SAndroid Build Coastguard Worker  set(CMAKE_TOOLCHAIN_ANDROID OFF)
393*523fa7a6SAndroid Build Coastguard Workerendif()
394*523fa7a6SAndroid Build Coastguard Worker
395*523fa7a6SAndroid Build Coastguard Worker# Add code coverage flags to supported compilers
396*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_USE_CPP_CODE_COVERAGE)
397*523fa7a6SAndroid Build Coastguard Worker  if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
398*523fa7a6SAndroid Build Coastguard Worker    string(APPEND CMAKE_C_FLAGS " --coverage -fprofile-abs-path")
399*523fa7a6SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS " --coverage -fprofile-abs-path")
400*523fa7a6SAndroid Build Coastguard Worker  elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
401*523fa7a6SAndroid Build Coastguard Worker    string(APPEND CMAKE_C_FLAGS " -fprofile-instr-generate -fcoverage-mapping")
402*523fa7a6SAndroid Build Coastguard Worker    string(APPEND CMAKE_CXX_FLAGS
403*523fa7a6SAndroid Build Coastguard Worker           " -fprofile-instr-generate -fcoverage-mapping"
404*523fa7a6SAndroid Build Coastguard Worker    )
405*523fa7a6SAndroid Build Coastguard Worker  else()
406*523fa7a6SAndroid Build Coastguard Worker    message(ERROR
407*523fa7a6SAndroid Build Coastguard Worker            "Code coverage for compiler ${CMAKE_CXX_COMPILER_ID} is unsupported"
408*523fa7a6SAndroid Build Coastguard Worker    )
409*523fa7a6SAndroid Build Coastguard Worker  endif()
410*523fa7a6SAndroid Build Coastguard Workerendif()
411*523fa7a6SAndroid Build Coastguard Worker
412*523fa7a6SAndroid Build Coastguard Worker# EXECUTORCH_BUILD_HOST_TARGETS: Option to control the building of host-only
413*523fa7a6SAndroid Build Coastguard Worker# tools like `flatc`, along with example executables like `executor_runner` and
414*523fa7a6SAndroid Build Coastguard Worker# libraries that it uses, like `gflags`. Disabling this can be helpful when
415*523fa7a6SAndroid Build Coastguard Worker# cross-compiling, but some required tools that would have been built need to be
416*523fa7a6SAndroid Build Coastguard Worker# provided directly (via, for example, FLATC_EXECUTABLE).
417*523fa7a6SAndroid Build Coastguard Workercmake_dependent_option(
418*523fa7a6SAndroid Build Coastguard Worker  EXECUTORCH_BUILD_HOST_TARGETS "Build host-only targets." ON
419*523fa7a6SAndroid Build Coastguard Worker  "NOT CMAKE_TOOLCHAIN_IOS" OFF
420*523fa7a6SAndroid Build Coastguard Worker)
421*523fa7a6SAndroid Build Coastguard Worker
422*523fa7a6SAndroid Build Coastguard Worker#
423*523fa7a6SAndroid Build Coastguard Worker# flatc: Flatbuffer commandline tool to generate .h files from .fbs files
424*523fa7a6SAndroid Build Coastguard Worker#
425*523fa7a6SAndroid Build Coastguard Workercmake_dependent_option(
426*523fa7a6SAndroid Build Coastguard Worker  EXECUTORCH_BUILD_FLATC "Build the flatc executable." ON
427*523fa7a6SAndroid Build Coastguard Worker  "NOT FLATC_EXECUTABLE;EXECUTORCH_BUILD_HOST_TARGETS" OFF
428*523fa7a6SAndroid Build Coastguard Worker)
429*523fa7a6SAndroid Build Coastguard Worker
430*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_FLATC)
431*523fa7a6SAndroid Build Coastguard Worker  if(FLATC_EXECUTABLE)
432*523fa7a6SAndroid Build Coastguard Worker    # We could ignore this, but it could lead to confusion about which `flatc`
433*523fa7a6SAndroid Build Coastguard Worker    # is actually being used.
434*523fa7a6SAndroid Build Coastguard Worker    message(
435*523fa7a6SAndroid Build Coastguard Worker      FATAL_ERROR "May not set both EXECUTORCH_BUILD_FLATC and FLATC_EXECUTABLE"
436*523fa7a6SAndroid Build Coastguard Worker    )
437*523fa7a6SAndroid Build Coastguard Worker  endif()
438*523fa7a6SAndroid Build Coastguard Worker  set(FLATC_EXECUTABLE flatc)
439*523fa7a6SAndroid Build Coastguard Worker  set(FLATBUFFERS_BUILD_FLATC
440*523fa7a6SAndroid Build Coastguard Worker      ON
441*523fa7a6SAndroid Build Coastguard Worker      CACHE BOOL ""
442*523fa7a6SAndroid Build Coastguard Worker  )
443*523fa7a6SAndroid Build Coastguard Worker  set(FLATBUFFERS_BUILD_FLATHASH
444*523fa7a6SAndroid Build Coastguard Worker      OFF
445*523fa7a6SAndroid Build Coastguard Worker      CACHE BOOL ""
446*523fa7a6SAndroid Build Coastguard Worker  )
447*523fa7a6SAndroid Build Coastguard Worker  set(FLATBUFFERS_BUILD_FLATLIB
448*523fa7a6SAndroid Build Coastguard Worker      OFF
449*523fa7a6SAndroid Build Coastguard Worker      CACHE BOOL ""
450*523fa7a6SAndroid Build Coastguard Worker  )
451*523fa7a6SAndroid Build Coastguard Worker  set(FLATBUFFERS_BUILD_TESTS
452*523fa7a6SAndroid Build Coastguard Worker      OFF
453*523fa7a6SAndroid Build Coastguard Worker      CACHE BOOL ""
454*523fa7a6SAndroid Build Coastguard Worker  )
455*523fa7a6SAndroid Build Coastguard Worker  set(FLATBUFFERS_INSTALL
456*523fa7a6SAndroid Build Coastguard Worker      OFF
457*523fa7a6SAndroid Build Coastguard Worker      CACHE BOOL ""
458*523fa7a6SAndroid Build Coastguard Worker  )
459*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(third-party/flatbuffers)
460*523fa7a6SAndroid Build Coastguard Worker
461*523fa7a6SAndroid Build Coastguard Worker  # exir lets users set the alignment of tensor data embedded in the flatbuffer,
462*523fa7a6SAndroid Build Coastguard Worker  # and some users need an alignment larger than the default, which is typically
463*523fa7a6SAndroid Build Coastguard Worker  # 32.
464*523fa7a6SAndroid Build Coastguard Worker  target_compile_definitions(flatc PRIVATE FLATBUFFERS_MAX_ALIGNMENT=1024)
465*523fa7a6SAndroid Build Coastguard Workerendif()
466*523fa7a6SAndroid Build Coastguard Workerif(NOT FLATC_EXECUTABLE)
467*523fa7a6SAndroid Build Coastguard Worker  message(
468*523fa7a6SAndroid Build Coastguard Worker    FATAL_ERROR
469*523fa7a6SAndroid Build Coastguard Worker      "FLATC_EXECUTABLE must be set when EXECUTORCH_BUILD_FLATC is disabled. "
470*523fa7a6SAndroid Build Coastguard Worker      "Note that EXECUTORCH_BUILD_FLATC may be disabled implicitly when "
471*523fa7a6SAndroid Build Coastguard Worker      "cross-compiling or when EXECUTORCH_BUILD_HOST_TARGETS is disabled."
472*523fa7a6SAndroid Build Coastguard Worker  )
473*523fa7a6SAndroid Build Coastguard Workerendif()
474*523fa7a6SAndroid Build Coastguard Worker
475*523fa7a6SAndroid Build Coastguard Worker#
476*523fa7a6SAndroid Build Coastguard Worker# program_schema: Generated .h files from schema/*.fbs inputs
477*523fa7a6SAndroid Build Coastguard Worker#
478*523fa7a6SAndroid Build Coastguard Workeradd_subdirectory(schema)
479*523fa7a6SAndroid Build Coastguard Worker
480*523fa7a6SAndroid Build Coastguard Worker#
481*523fa7a6SAndroid Build Coastguard Worker# executorch_core: Minimal runtime library
482*523fa7a6SAndroid Build Coastguard Worker#
483*523fa7a6SAndroid Build Coastguard Worker# The bare-minimum runtime library, supporting the Program and Method
484*523fa7a6SAndroid Build Coastguard Worker# interfaces. Does not contain any operators, including primitive ops. Does not
485*523fa7a6SAndroid Build Coastguard Worker# contain any backends.
486*523fa7a6SAndroid Build Coastguard Worker#
487*523fa7a6SAndroid Build Coastguard Worker
488*523fa7a6SAndroid Build Coastguard Worker# Remove any PAL-definition files from the sources.
489*523fa7a6SAndroid Build Coastguard Workerlist(FILTER _executorch_core__srcs EXCLUDE REGEX
490*523fa7a6SAndroid Build Coastguard Worker     "runtime/platform/default/[^/]*.cpp$"
491*523fa7a6SAndroid Build Coastguard Worker)
492*523fa7a6SAndroid Build Coastguard Worker
493*523fa7a6SAndroid Build Coastguard Worker# Add the source file that maps to the requested default PAL implementation.
494*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_PAL_DEFAULT MATCHES "^(posix|minimal)$")
495*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "executorch: Using PAL default '${EXECUTORCH_PAL_DEFAULT}'")
496*523fa7a6SAndroid Build Coastguard Worker  list(APPEND _executorch_core__srcs
497*523fa7a6SAndroid Build Coastguard Worker       "runtime/platform/default/${EXECUTORCH_PAL_DEFAULT}.cpp"
498*523fa7a6SAndroid Build Coastguard Worker  )
499*523fa7a6SAndroid Build Coastguard Workerelse()
500*523fa7a6SAndroid Build Coastguard Worker  message(
501*523fa7a6SAndroid Build Coastguard Worker    FATAL_ERROR "Unknown EXECUTORCH_PAL_DEFAULT \"${EXECUTORCH_PAL_DEFAULT}\". "
502*523fa7a6SAndroid Build Coastguard Worker                "Expected one of {posix, minimal}."
503*523fa7a6SAndroid Build Coastguard Worker  )
504*523fa7a6SAndroid Build Coastguard Workerendif()
505*523fa7a6SAndroid Build Coastguard Worker
506*523fa7a6SAndroid Build Coastguard Workeradd_library(executorch_core ${_executorch_core__srcs})
507*523fa7a6SAndroid Build Coastguard Worker
508*523fa7a6SAndroid Build Coastguard Worker# Legacy name alias.
509*523fa7a6SAndroid Build Coastguard Workeradd_library(executorch_no_prim_ops ALIAS executorch_core)
510*523fa7a6SAndroid Build Coastguard Worker
511*523fa7a6SAndroid Build Coastguard Workertarget_link_libraries(executorch_core PRIVATE program_schema)
512*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_USE_DL)
513*523fa7a6SAndroid Build Coastguard Worker  # Check if dl exists for this toolchain and only then link it.
514*523fa7a6SAndroid Build Coastguard Worker  find_library(DL_LIBRARY_EXISTS NAMES dl)
515*523fa7a6SAndroid Build Coastguard Worker  # Check if the library was found
516*523fa7a6SAndroid Build Coastguard Worker  if(DL_LIBRARY_EXISTS)
517*523fa7a6SAndroid Build Coastguard Worker    target_link_libraries(executorch_core PRIVATE dl) # For dladdr()
518*523fa7a6SAndroid Build Coastguard Worker  endif()
519*523fa7a6SAndroid Build Coastguard Workerendif()
520*523fa7a6SAndroid Build Coastguard Workertarget_include_directories(
521*523fa7a6SAndroid Build Coastguard Worker  executorch_core PUBLIC ${_common_include_directories}
522*523fa7a6SAndroid Build Coastguard Worker)
523*523fa7a6SAndroid Build Coastguard Workertarget_compile_options(executorch_core PUBLIC ${_common_compile_options})
524*523fa7a6SAndroid Build Coastguard Workerif(MAX_KERNEL_NUM)
525*523fa7a6SAndroid Build Coastguard Worker  target_compile_definitions(
526*523fa7a6SAndroid Build Coastguard Worker    executorch_core PRIVATE MAX_KERNEL_NUM=${MAX_KERNEL_NUM}
527*523fa7a6SAndroid Build Coastguard Worker  )
528*523fa7a6SAndroid Build Coastguard Workerendif()
529*523fa7a6SAndroid Build Coastguard Worker
530*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_PYBIND AND APPLE)
531*523fa7a6SAndroid Build Coastguard Worker  # shared version
532*523fa7a6SAndroid Build Coastguard Worker  add_library(
533*523fa7a6SAndroid Build Coastguard Worker    executorch_core_shared SHARED ${_executorch_core__srcs}
534*523fa7a6SAndroid Build Coastguard Worker  )
535*523fa7a6SAndroid Build Coastguard Worker  target_link_libraries(executorch_core_shared PRIVATE program_schema)
536*523fa7a6SAndroid Build Coastguard Worker  if(DL_LIBRARY_EXISTS)
537*523fa7a6SAndroid Build Coastguard Worker    # For dladdr()
538*523fa7a6SAndroid Build Coastguard Worker    target_link_libraries(executorch_core_shared PRIVATE dl)
539*523fa7a6SAndroid Build Coastguard Worker  endif()
540*523fa7a6SAndroid Build Coastguard Worker  target_include_directories(
541*523fa7a6SAndroid Build Coastguard Worker    executorch_core_shared PUBLIC ${_common_include_directories}
542*523fa7a6SAndroid Build Coastguard Worker  )
543*523fa7a6SAndroid Build Coastguard Worker  target_compile_options(
544*523fa7a6SAndroid Build Coastguard Worker    executorch_core_shared PUBLIC ${_common_compile_options}
545*523fa7a6SAndroid Build Coastguard Worker  )
546*523fa7a6SAndroid Build Coastguard Worker  if(MAX_KERNEL_NUM)
547*523fa7a6SAndroid Build Coastguard Worker    target_compile_definitions(
548*523fa7a6SAndroid Build Coastguard Worker      executorch_core_shared PRIVATE MAX_KERNEL_NUM=${MAX_KERNEL_NUM}
549*523fa7a6SAndroid Build Coastguard Worker    )
550*523fa7a6SAndroid Build Coastguard Worker  endif()
551*523fa7a6SAndroid Build Coastguard Workerendif()
552*523fa7a6SAndroid Build Coastguard Worker
553*523fa7a6SAndroid Build Coastguard Worker#
554*523fa7a6SAndroid Build Coastguard Worker# executorch: Primary runtime library with primitive operators.
555*523fa7a6SAndroid Build Coastguard Worker#
556*523fa7a6SAndroid Build Coastguard Worker# Provides the Program and Method interfaces, along with primitive operators.
557*523fa7a6SAndroid Build Coastguard Worker# Does not contain portable kernels or other full operators. Does not contain
558*523fa7a6SAndroid Build Coastguard Worker# any backends.
559*523fa7a6SAndroid Build Coastguard Worker#
560*523fa7a6SAndroid Build Coastguard Workeradd_library(executorch ${_executorch__srcs})
561*523fa7a6SAndroid Build Coastguard Workertarget_link_libraries(executorch PRIVATE executorch_core)
562*523fa7a6SAndroid Build Coastguard Workertarget_include_directories(executorch PUBLIC ${_common_include_directories})
563*523fa7a6SAndroid Build Coastguard Workertarget_compile_options(executorch PUBLIC ${_common_compile_options})
564*523fa7a6SAndroid Build Coastguard Workertarget_link_options_shared_lib(executorch)
565*523fa7a6SAndroid Build Coastguard Worker
566*523fa7a6SAndroid Build Coastguard Worker#
567*523fa7a6SAndroid Build Coastguard Worker# portable_ops_lib: A library to register core ATen ops using portable kernels,
568*523fa7a6SAndroid Build Coastguard Worker# see kernels/portable/CMakeLists.txt.
569*523fa7a6SAndroid Build Coastguard Worker#
570*523fa7a6SAndroid Build Coastguard Worker# Real integrations should supply their own YAML file that only lists the
571*523fa7a6SAndroid Build Coastguard Worker# operators necessary for the models that will run.
572*523fa7a6SAndroid Build Coastguard Worker#
573*523fa7a6SAndroid Build Coastguard Workerif(BUILD_EXECUTORCH_PORTABLE_OPS)
574*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/kernels/portable)
575*523fa7a6SAndroid Build Coastguard Workerendif()
576*523fa7a6SAndroid Build Coastguard Worker
577*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_KERNELS_OPTIMIZED)
578*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/kernels/optimized)
579*523fa7a6SAndroid Build Coastguard Workerendif()
580*523fa7a6SAndroid Build Coastguard Worker
581*523fa7a6SAndroid Build Coastguard Workeradd_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/configurations)
582*523fa7a6SAndroid Build Coastguard Worker
583*523fa7a6SAndroid Build Coastguard Worker#
584*523fa7a6SAndroid Build Coastguard Worker# gflags: Commandline flag host library.
585*523fa7a6SAndroid Build Coastguard Worker#
586*523fa7a6SAndroid Build Coastguard Workercmake_dependent_option(
587*523fa7a6SAndroid Build Coastguard Worker  EXECUTORCH_BUILD_GFLAGS "Build the gflags library." ON
588*523fa7a6SAndroid Build Coastguard Worker  EXECUTORCH_BUILD_HOST_TARGETS OFF
589*523fa7a6SAndroid Build Coastguard Worker)
590*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_GFLAGS)
591*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(third-party/gflags)
592*523fa7a6SAndroid Build Coastguard Workerendif()
593*523fa7a6SAndroid Build Coastguard Worker
594*523fa7a6SAndroid Build Coastguard Worker# Install `executorch` library as well as `executorch-config.cmake` under
595*523fa7a6SAndroid Build Coastguard Worker# ${CMAKE_INSTALL_PREFIX}/
596*523fa7a6SAndroid Build Coastguard Workerinstall(
597*523fa7a6SAndroid Build Coastguard Worker  TARGETS executorch executorch_core
598*523fa7a6SAndroid Build Coastguard Worker  DESTINATION lib
599*523fa7a6SAndroid Build Coastguard Worker  INCLUDES
600*523fa7a6SAndroid Build Coastguard Worker  DESTINATION ${_common_include_directories}
601*523fa7a6SAndroid Build Coastguard Worker)
602*523fa7a6SAndroid Build Coastguard Workerinstall(FILES build/executorch-config.cmake DESTINATION lib/cmake/ExecuTorch)
603*523fa7a6SAndroid Build Coastguard Worker
604*523fa7a6SAndroid Build Coastguard Worker#
605*523fa7a6SAndroid Build Coastguard Worker# executor_runner: Host tool that demonstrates program execution.
606*523fa7a6SAndroid Build Coastguard Worker#
607*523fa7a6SAndroid Build Coastguard Workercmake_dependent_option(
608*523fa7a6SAndroid Build Coastguard Worker  EXECUTORCH_BUILD_EXECUTOR_RUNNER "Build the executor_runner executable" ON
609*523fa7a6SAndroid Build Coastguard Worker  EXECUTORCH_BUILD_HOST_TARGETS OFF
610*523fa7a6SAndroid Build Coastguard Worker)
611*523fa7a6SAndroid Build Coastguard Worker
612*523fa7a6SAndroid Build Coastguard Worker# Add googletest if any test targets should be built
613*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_GTESTS)
614*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/third-party/googletest)
615*523fa7a6SAndroid Build Coastguard Workerendif()
616*523fa7a6SAndroid Build Coastguard Worker
617*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_ARM_BAREMETAL)
618*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/backends/arm)
619*523fa7a6SAndroid Build Coastguard Workerendif()
620*523fa7a6SAndroid Build Coastguard Worker
621*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_CADENCE)
622*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/backends/cadence)
623*523fa7a6SAndroid Build Coastguard Workerendif()
624*523fa7a6SAndroid Build Coastguard Worker
625*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_COREML)
626*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/backends/apple/coreml)
627*523fa7a6SAndroid Build Coastguard Workerendif()
628*523fa7a6SAndroid Build Coastguard Worker
629*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_MPS)
630*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/backends/apple/mps)
631*523fa7a6SAndroid Build Coastguard Workerendif()
632*523fa7a6SAndroid Build Coastguard Worker
633*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_NEURON)
634*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/backends/mediatek)
635*523fa7a6SAndroid Build Coastguard Workerendif()
636*523fa7a6SAndroid Build Coastguard Worker
637*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_QNN)
638*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/backends/qualcomm)
639*523fa7a6SAndroid Build Coastguard Workerendif()
640*523fa7a6SAndroid Build Coastguard Worker
641*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_XNNPACK)
642*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/backends/xnnpack)
643*523fa7a6SAndroid Build Coastguard Workerendif()
644*523fa7a6SAndroid Build Coastguard Worker
645*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_DEVTOOLS)
646*523fa7a6SAndroid Build Coastguard Worker  set(EXECUTORCH_BUILD_EXTENSION_DATA_LOADER
647*523fa7a6SAndroid Build Coastguard Worker      ON
648*523fa7a6SAndroid Build Coastguard Worker      CACHE BOOL "EXECUTORCH_BUILD_EXTENSION_DATA_LOADER" FORCE
649*523fa7a6SAndroid Build Coastguard Worker  )
650*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/devtools)
651*523fa7a6SAndroid Build Coastguard Workerendif()
652*523fa7a6SAndroid Build Coastguard Worker
653*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_EXTENSION_APPLE)
654*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/extension/apple)
655*523fa7a6SAndroid Build Coastguard Workerendif()
656*523fa7a6SAndroid Build Coastguard Worker
657*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_EXTENSION_DATA_LOADER)
658*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/extension/data_loader)
659*523fa7a6SAndroid Build Coastguard Workerendif()
660*523fa7a6SAndroid Build Coastguard Worker
661*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_EXTENSION_MODULE)
662*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/extension/module)
663*523fa7a6SAndroid Build Coastguard Workerendif()
664*523fa7a6SAndroid Build Coastguard Worker
665*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_EXTENSION_TRAINING)
666*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/extension/training)
667*523fa7a6SAndroid Build Coastguard Workerendif()
668*523fa7a6SAndroid Build Coastguard Worker
669*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_EXTENSION_RUNNER_UTIL)
670*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/extension/runner_util)
671*523fa7a6SAndroid Build Coastguard Workerendif()
672*523fa7a6SAndroid Build Coastguard Worker
673*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_EXTENSION_TENSOR)
674*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/extension/tensor)
675*523fa7a6SAndroid Build Coastguard Workerendif()
676*523fa7a6SAndroid Build Coastguard Worker
677*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_PTHREADPOOL
678*523fa7a6SAndroid Build Coastguard Worker   AND EXECUTORCH_BUILD_CPUINFO
679*523fa7a6SAndroid Build Coastguard Worker   AND CMAKE_CXX_STANDARD GREATER_EQUAL 14
680*523fa7a6SAndroid Build Coastguard Worker)
681*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/extension/threadpool)
682*523fa7a6SAndroid Build Coastguard Workerendif()
683*523fa7a6SAndroid Build Coastguard Worker
684*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_PYBIND)
685*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/third-party/pybind11)
686*523fa7a6SAndroid Build Coastguard Worker
687*523fa7a6SAndroid Build Coastguard Worker  if(NOT EXECUTORCH_BUILD_EXTENSION_DATA_LOADER)
688*523fa7a6SAndroid Build Coastguard Worker    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/extension/data_loader)
689*523fa7a6SAndroid Build Coastguard Worker  endif()
690*523fa7a6SAndroid Build Coastguard Worker
691*523fa7a6SAndroid Build Coastguard Worker  if(NOT EXECUTORCH_BUILD_DEVTOOLS)
692*523fa7a6SAndroid Build Coastguard Worker    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/devtools)
693*523fa7a6SAndroid Build Coastguard Worker  endif()
694*523fa7a6SAndroid Build Coastguard Worker
695*523fa7a6SAndroid Build Coastguard Worker  # find pytorch lib, to allow pybind to take at::Tensor as input/output
696*523fa7a6SAndroid Build Coastguard Worker  find_package(Torch CONFIG REQUIRED)
697*523fa7a6SAndroid Build Coastguard Worker  find_library(
698*523fa7a6SAndroid Build Coastguard Worker    TORCH_PYTHON_LIBRARY torch_python PATHS "${TORCH_INSTALL_PREFIX}/lib"
699*523fa7a6SAndroid Build Coastguard Worker  )
700*523fa7a6SAndroid Build Coastguard Worker
701*523fa7a6SAndroid Build Coastguard Worker  set(_dep_libs
702*523fa7a6SAndroid Build Coastguard Worker      ${TORCH_PYTHON_LIBRARY}
703*523fa7a6SAndroid Build Coastguard Worker      bundled_program
704*523fa7a6SAndroid Build Coastguard Worker      etdump
705*523fa7a6SAndroid Build Coastguard Worker      executorch
706*523fa7a6SAndroid Build Coastguard Worker      extension_data_loader
707*523fa7a6SAndroid Build Coastguard Worker      util
708*523fa7a6SAndroid Build Coastguard Worker      torch
709*523fa7a6SAndroid Build Coastguard Worker  )
710*523fa7a6SAndroid Build Coastguard Worker
711*523fa7a6SAndroid Build Coastguard Worker  if(EXECUTORCH_BUILD_KERNELS_OPTIMIZED)
712*523fa7a6SAndroid Build Coastguard Worker    list(APPEND _dep_libs optimized_native_cpu_ops_lib)
713*523fa7a6SAndroid Build Coastguard Worker  else()
714*523fa7a6SAndroid Build Coastguard Worker    list(APPEND _dep_libs portable_ops_lib)
715*523fa7a6SAndroid Build Coastguard Worker  endif()
716*523fa7a6SAndroid Build Coastguard Worker
717*523fa7a6SAndroid Build Coastguard Worker  if(EXECUTORCH_BUILD_COREML)
718*523fa7a6SAndroid Build Coastguard Worker    list(APPEND _dep_libs coremldelegate)
719*523fa7a6SAndroid Build Coastguard Worker  endif()
720*523fa7a6SAndroid Build Coastguard Worker
721*523fa7a6SAndroid Build Coastguard Worker  if(EXECUTORCH_BUILD_MPS)
722*523fa7a6SAndroid Build Coastguard Worker    list(APPEND _dep_libs mpsdelegate)
723*523fa7a6SAndroid Build Coastguard Worker  endif()
724*523fa7a6SAndroid Build Coastguard Worker
725*523fa7a6SAndroid Build Coastguard Worker  if(EXECUTORCH_BUILD_XNNPACK)
726*523fa7a6SAndroid Build Coastguard Worker    # need to explicitly specify XNNPACK here otherwise uses XNNPACK symbols
727*523fa7a6SAndroid Build Coastguard Worker    # from libtorch_cpu
728*523fa7a6SAndroid Build Coastguard Worker    list(APPEND _dep_libs xnnpack_backend XNNPACK)
729*523fa7a6SAndroid Build Coastguard Worker  endif()
730*523fa7a6SAndroid Build Coastguard Worker
731*523fa7a6SAndroid Build Coastguard Worker  # compile options for pybind
732*523fa7a6SAndroid Build Coastguard Worker  set(_pybind_compile_options
733*523fa7a6SAndroid Build Coastguard Worker      -Wno-deprecated-declarations
734*523fa7a6SAndroid Build Coastguard Worker      -fPIC
735*523fa7a6SAndroid Build Coastguard Worker      -frtti
736*523fa7a6SAndroid Build Coastguard Worker      -fexceptions
737*523fa7a6SAndroid Build Coastguard Worker  )
738*523fa7a6SAndroid Build Coastguard Worker  if(EXECUTORCH_DO_NOT_USE_CXX11_ABI)
739*523fa7a6SAndroid Build Coastguard Worker      # libtorch is built with the old ABI, so we need to do the same for any
740*523fa7a6SAndroid Build Coastguard Worker      # .cpp files that include torch, c10, or ATen targets. Note that PyTorch
741*523fa7a6SAndroid Build Coastguard Worker      # nightly binary is built with _GLIBCXX_USE_CXX11_ABI set to 0 while its
742*523fa7a6SAndroid Build Coastguard Worker      # CI build sets this to 1 (default)
743*523fa7a6SAndroid Build Coastguard Worker    list(APPEND _pybind_compile_options -D_GLIBCXX_USE_CXX11_ABI=0)
744*523fa7a6SAndroid Build Coastguard Worker  endif()
745*523fa7a6SAndroid Build Coastguard Worker
746*523fa7a6SAndroid Build Coastguard Worker  # util lib
747*523fa7a6SAndroid Build Coastguard Worker  add_library(
748*523fa7a6SAndroid Build Coastguard Worker    util ${CMAKE_CURRENT_SOURCE_DIR}/extension/evalue_util/print_evalue.cpp
749*523fa7a6SAndroid Build Coastguard Worker         ${CMAKE_CURRENT_SOURCE_DIR}/extension/aten_util/aten_bridge.cpp
750*523fa7a6SAndroid Build Coastguard Worker  )
751*523fa7a6SAndroid Build Coastguard Worker  target_include_directories(
752*523fa7a6SAndroid Build Coastguard Worker    util PUBLIC ${_common_include_directories} ${TORCH_INCLUDE_DIRS}
753*523fa7a6SAndroid Build Coastguard Worker  )
754*523fa7a6SAndroid Build Coastguard Worker  target_compile_options(util PUBLIC ${_pybind_compile_options})
755*523fa7a6SAndroid Build Coastguard Worker  target_link_libraries(util PRIVATE torch c10 executorch extension_tensor)
756*523fa7a6SAndroid Build Coastguard Worker
757*523fa7a6SAndroid Build Coastguard Worker  # pybind portable_lib
758*523fa7a6SAndroid Build Coastguard Worker  pybind11_add_module(portable_lib SHARED extension/pybindings/pybindings.cpp)
759*523fa7a6SAndroid Build Coastguard Worker  # The actual output file needs a leading underscore so it can coexist with
760*523fa7a6SAndroid Build Coastguard Worker  # portable_lib.py in the same python package.
761*523fa7a6SAndroid Build Coastguard Worker  set_target_properties(portable_lib PROPERTIES OUTPUT_NAME "_portable_lib")
762*523fa7a6SAndroid Build Coastguard Worker  target_compile_definitions(
763*523fa7a6SAndroid Build Coastguard Worker    portable_lib PUBLIC EXECUTORCH_PYTHON_MODULE_NAME=_portable_lib
764*523fa7a6SAndroid Build Coastguard Worker  )
765*523fa7a6SAndroid Build Coastguard Worker  target_include_directories(portable_lib PRIVATE ${TORCH_INCLUDE_DIRS})
766*523fa7a6SAndroid Build Coastguard Worker  target_compile_options(portable_lib PUBLIC ${_pybind_compile_options})
767*523fa7a6SAndroid Build Coastguard Worker  target_link_libraries(portable_lib PRIVATE ${_dep_libs})
768*523fa7a6SAndroid Build Coastguard Worker  if(APPLE)
769*523fa7a6SAndroid Build Coastguard Worker    # pip wheels will need to be able to find the torch libraries. On Linux, the
770*523fa7a6SAndroid Build Coastguard Worker    # .so has non-absolute dependencies on libs like "libtorch.so" without
771*523fa7a6SAndroid Build Coastguard Worker    # paths; as long as we `import torch` first, those dependencies will work.
772*523fa7a6SAndroid Build Coastguard Worker    # But Apple dylibs do not support non-absolute dependencies, so we need to
773*523fa7a6SAndroid Build Coastguard Worker    # tell the loader where to look for its libraries. The LC_LOAD_DYLIB entries
774*523fa7a6SAndroid Build Coastguard Worker    # for the torch libraries will look like "@rpath/libtorch.dylib", so we can
775*523fa7a6SAndroid Build Coastguard Worker    # add an LC_RPATH entry to look in a directory relative to the installed
776*523fa7a6SAndroid Build Coastguard Worker    # location of our _portable_lib.so file. To see these LC_* values, run
777*523fa7a6SAndroid Build Coastguard Worker    # `otool -l _portable_lib*.so`.
778*523fa7a6SAndroid Build Coastguard Worker    set_target_properties(
779*523fa7a6SAndroid Build Coastguard Worker      portable_lib
780*523fa7a6SAndroid Build Coastguard Worker      PROPERTIES # Assume that this library will be installed in
781*523fa7a6SAndroid Build Coastguard Worker                 # `site-packages/executorch/extension/pybindings`, and that
782*523fa7a6SAndroid Build Coastguard Worker                 # the torch libs are in `site-packages/torch/lib`.
783*523fa7a6SAndroid Build Coastguard Worker                 BUILD_RPATH "@loader_path/../../../torch/lib"
784*523fa7a6SAndroid Build Coastguard Worker                 INSTALL_RPATH "@loader_path/../../../torch/lib"
785*523fa7a6SAndroid Build Coastguard Worker                 # Assume <executorch> is the root `site-packages/executorch`
786*523fa7a6SAndroid Build Coastguard Worker                 # Need to add <executorch>/extension/llm/custom_ops for
787*523fa7a6SAndroid Build Coastguard Worker                 # libcustom_ops_aot_lib.dylib
788*523fa7a6SAndroid Build Coastguard Worker                 BUILD_RPATH "@loader_path/../../extension/llm/custom_ops"
789*523fa7a6SAndroid Build Coastguard Worker                 INSTALL_RPATH "@loader_path/../../extension/llm/custom_ops"
790*523fa7a6SAndroid Build Coastguard Worker                 # Need to add <executorch>/kernels/quantized for
791*523fa7a6SAndroid Build Coastguard Worker                 # libquantized_ops_aot_lib.dylib
792*523fa7a6SAndroid Build Coastguard Worker                 BUILD_RPATH "@loader_path/../../kernels/quantized"
793*523fa7a6SAndroid Build Coastguard Worker                 INSTALL_RPATH "@loader_path/../../kernels/quantized"
794*523fa7a6SAndroid Build Coastguard Worker    )
795*523fa7a6SAndroid Build Coastguard Worker  else()
796*523fa7a6SAndroid Build Coastguard Worker    set_target_properties(
797*523fa7a6SAndroid Build Coastguard Worker      portable_lib
798*523fa7a6SAndroid Build Coastguard Worker      PROPERTIES
799*523fa7a6SAndroid Build Coastguard Worker        # Assume <executorch> is the root `site-packages/executorch`
800*523fa7a6SAndroid Build Coastguard Worker        # Need to add <executorch>/extension/llm/custom_ops for
801*523fa7a6SAndroid Build Coastguard Worker        # libcustom_ops_aot_lib
802*523fa7a6SAndroid Build Coastguard Worker        # Need to add <executorch>/kernels/quantized for
803*523fa7a6SAndroid Build Coastguard Worker        # libquantized_ops_aot_lib
804*523fa7a6SAndroid Build Coastguard Worker        BUILD_RPATH
805*523fa7a6SAndroid Build Coastguard Worker        "$ORIGIN:$ORIGIN/../../extension/llm/custom_ops:$ORIGIN/../../kernels/quantized"
806*523fa7a6SAndroid Build Coastguard Worker    )
807*523fa7a6SAndroid Build Coastguard Worker  endif()
808*523fa7a6SAndroid Build Coastguard Worker
809*523fa7a6SAndroid Build Coastguard Worker  install(TARGETS portable_lib
810*523fa7a6SAndroid Build Coastguard Worker          LIBRARY DESTINATION executorch/extension/pybindings
811*523fa7a6SAndroid Build Coastguard Worker  )
812*523fa7a6SAndroid Build Coastguard Workerendif()
813*523fa7a6SAndroid Build Coastguard Worker
814*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_KERNELS_CUSTOM)
815*523fa7a6SAndroid Build Coastguard Worker  # TODO: move all custom kernels to ${CMAKE_CURRENT_SOURCE_DIR}/kernels/custom
816*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/extension/llm/custom_ops)
817*523fa7a6SAndroid Build Coastguard Workerendif()
818*523fa7a6SAndroid Build Coastguard Worker
819*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_KERNELS_QUANTIZED)
820*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/kernels/quantized)
821*523fa7a6SAndroid Build Coastguard Worker  target_link_options_shared_lib(quantized_ops_lib)
822*523fa7a6SAndroid Build Coastguard Workerendif()
823*523fa7a6SAndroid Build Coastguard Worker
824*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_EXECUTOR_RUNNER)
825*523fa7a6SAndroid Build Coastguard Worker  # Baseline libraries that executor_runner will link against.
826*523fa7a6SAndroid Build Coastguard Worker  set(_executor_runner_libs executorch gflags)
827*523fa7a6SAndroid Build Coastguard Worker
828*523fa7a6SAndroid Build Coastguard Worker  if(EXECUTORCH_BUILD_KERNELS_OPTIMIZED)
829*523fa7a6SAndroid Build Coastguard Worker    list(APPEND _executor_runner_libs optimized_native_cpu_ops_lib)
830*523fa7a6SAndroid Build Coastguard Worker  elseif(EXECUTORCH_BUILD_CADENCE)
831*523fa7a6SAndroid Build Coastguard Worker    list(APPEND _executor_runner_libs cadence_ops_lib)
832*523fa7a6SAndroid Build Coastguard Worker  else()
833*523fa7a6SAndroid Build Coastguard Worker    list(APPEND _executor_runner_libs portable_ops_lib)
834*523fa7a6SAndroid Build Coastguard Worker  endif()
835*523fa7a6SAndroid Build Coastguard Worker
836*523fa7a6SAndroid Build Coastguard Worker  # Generate lib to register quantized ops
837*523fa7a6SAndroid Build Coastguard Worker  if(EXECUTORCH_BUILD_KERNELS_QUANTIZED)
838*523fa7a6SAndroid Build Coastguard Worker    list(APPEND _executor_runner_libs quantized_ops_lib)
839*523fa7a6SAndroid Build Coastguard Worker  endif()
840*523fa7a6SAndroid Build Coastguard Worker
841*523fa7a6SAndroid Build Coastguard Worker  add_executable(executor_runner ${_executor_runner__srcs})
842*523fa7a6SAndroid Build Coastguard Worker  if(CMAKE_BUILD_TYPE STREQUAL "Release")
843*523fa7a6SAndroid Build Coastguard Worker    if(APPLE)
844*523fa7a6SAndroid Build Coastguard Worker      target_link_options(executor_runner PRIVATE "LINKER:-dead_strip")
845*523fa7a6SAndroid Build Coastguard Worker    else()
846*523fa7a6SAndroid Build Coastguard Worker      target_link_options(executor_runner PRIVATE "LINKER:--gc-sections")
847*523fa7a6SAndroid Build Coastguard Worker    endif()
848*523fa7a6SAndroid Build Coastguard Worker  endif()
849*523fa7a6SAndroid Build Coastguard Worker  target_link_libraries(executor_runner ${_executor_runner_libs})
850*523fa7a6SAndroid Build Coastguard Worker  target_compile_options(executor_runner PUBLIC ${_common_compile_options})
851*523fa7a6SAndroid Build Coastguard Workerendif()
852*523fa7a6SAndroid Build Coastguard Worker
853*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_BUILD_VULKAN)
854*523fa7a6SAndroid Build Coastguard Worker  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/backends/vulkan)
855*523fa7a6SAndroid Build Coastguard Workerendif()
856*523fa7a6SAndroid Build Coastguard Worker
857*523fa7a6SAndroid Build Coastguard Worker# Print all summary
858*523fa7a6SAndroid Build Coastguard Workerexecutorch_print_configuration_summary()
859