xref: /aosp_15_r20/external/executorch/build/Utils.cmake (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# This file is intended to have helper functions to keep the CMakeLists.txt
9*523fa7a6SAndroid Build Coastguard Worker# concise. If there are any helper function can be re-used, it's recommented to
10*523fa7a6SAndroid Build Coastguard Worker# add them here.
11*523fa7a6SAndroid Build Coastguard Worker#
12*523fa7a6SAndroid Build Coastguard Worker# ### Editing this file ###
13*523fa7a6SAndroid Build Coastguard Worker#
14*523fa7a6SAndroid Build Coastguard Worker# This file should be formatted with
15*523fa7a6SAndroid Build Coastguard Worker# ~~~
16*523fa7a6SAndroid Build Coastguard Worker# cmake-format -i Utils.cmake
17*523fa7a6SAndroid Build Coastguard Worker# ~~~
18*523fa7a6SAndroid Build Coastguard Worker# It should also be cmake-lint clean.
19*523fa7a6SAndroid Build Coastguard Worker#
20*523fa7a6SAndroid Build Coastguard Worker
21*523fa7a6SAndroid Build Coastguard Worker# Public function to print summary for all configurations. For new variables,
22*523fa7a6SAndroid Build Coastguard Worker# it's recommended to add them here.
23*523fa7a6SAndroid Build Coastguard Workerfunction(executorch_print_configuration_summary)
24*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "")
25*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "******** Summary ********")
26*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  CMAKE_BUILD_TYPE              : ${CMAKE_BUILD_TYPE}")
27*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  CMAKE_CXX_STANDARD            : ${CMAKE_CXX_STANDARD}")
28*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  CMAKE_CXX_COMPILER_ID         : ${CMAKE_CXX_COMPILER_ID}")
29*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  CMAKE_TOOLCHAIN_FILE          : ${CMAKE_TOOLCHAIN_FILE}")
30*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  BUCK2                         : ${BUCK2}")
31*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  PYTHON_EXECUTABLE             : ${PYTHON_EXECUTABLE}")
32*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  FLATC_EXECUTABLE              : ${FLATC_EXECUTABLE}")
33*523fa7a6SAndroid Build Coastguard Worker  message(
34*523fa7a6SAndroid Build Coastguard Worker    STATUS
35*523fa7a6SAndroid Build Coastguard Worker      "  EXECUTORCH_ENABLE_LOGGING              : ${EXECUTORCH_ENABLE_LOGGING}"
36*523fa7a6SAndroid Build Coastguard Worker  )
37*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  EXECUTORCH_ENABLE_PROGRAM_VERIFICATION : "
38*523fa7a6SAndroid Build Coastguard Worker                 "${EXECUTORCH_ENABLE_PROGRAM_VERIFICATION}"
39*523fa7a6SAndroid Build Coastguard Worker  )
40*523fa7a6SAndroid Build Coastguard Worker  message(
41*523fa7a6SAndroid Build Coastguard Worker    STATUS "  EXECUTORCH_LOG_LEVEL                   : ${EXECUTORCH_LOG_LEVEL}"
42*523fa7a6SAndroid Build Coastguard Worker  )
43*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  EXECUTORCH_BUILD_ANDROID_JNI           : "
44*523fa7a6SAndroid Build Coastguard Worker                 "${EXECUTORCH_BUILD_ANDROID_JNI}"
45*523fa7a6SAndroid Build Coastguard Worker  )
46*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  EXECUTORCH_BUILD_ARM_BAREMETAL         : "
47*523fa7a6SAndroid Build Coastguard Worker                 "${EXECUTORCH_BUILD_ARM_BAREMETAL}"
48*523fa7a6SAndroid Build Coastguard Worker  )
49*523fa7a6SAndroid Build Coastguard Worker  message(
50*523fa7a6SAndroid Build Coastguard Worker    STATUS
51*523fa7a6SAndroid Build Coastguard Worker      "  EXECUTORCH_BUILD_COREML                : ${EXECUTORCH_BUILD_COREML}"
52*523fa7a6SAndroid Build Coastguard Worker  )
53*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  EXECUTORCH_BUILD_KERNELS_CUSTOM        : "
54*523fa7a6SAndroid Build Coastguard Worker                 "${EXECUTORCH_BUILD_KERNELS_CUSTOM}"
55*523fa7a6SAndroid Build Coastguard Worker  )
56*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  EXECUTORCH_BUILD_EXECUTOR_RUNNER       : "
57*523fa7a6SAndroid Build Coastguard Worker                 "${EXECUTORCH_BUILD_EXECUTOR_RUNNER}"
58*523fa7a6SAndroid Build Coastguard Worker  )
59*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  EXECUTORCH_BUILD_EXTENSION_DATA_LOADER : "
60*523fa7a6SAndroid Build Coastguard Worker                 "${EXECUTORCH_BUILD_EXTENSION_DATA_LOADER}"
61*523fa7a6SAndroid Build Coastguard Worker  )
62*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  EXECUTORCH_BUILD_EXTENSION_MODULE      : "
63*523fa7a6SAndroid Build Coastguard Worker                 "${EXECUTORCH_BUILD_EXTENSION_MODULE}"
64*523fa7a6SAndroid Build Coastguard Worker  )
65*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  EXECUTORCH_BUILD_EXTENSION_RUNNER_UTIL : "
66*523fa7a6SAndroid Build Coastguard Worker                 "${EXECUTORCH_BUILD_EXTENSION_RUNNER_UTIL}"
67*523fa7a6SAndroid Build Coastguard Worker  )
68*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  EXECUTORCH_BUILD_EXTENSION_TENSOR      : "
69*523fa7a6SAndroid Build Coastguard Worker                 "${EXECUTORCH_BUILD_EXTENSION_TENSOR}"
70*523fa7a6SAndroid Build Coastguard Worker  )
71*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  EXECUTORCH_BUILD_EXTENSION_TRAINING      : "
72*523fa7a6SAndroid Build Coastguard Worker                 "${EXECUTORCH_BUILD_EXTENSION_TRAINING}"
73*523fa7a6SAndroid Build Coastguard Worker  )
74*523fa7a6SAndroid Build Coastguard Worker  message(
75*523fa7a6SAndroid Build Coastguard Worker    STATUS
76*523fa7a6SAndroid Build Coastguard Worker      "  EXECUTORCH_BUILD_FLATC                 : ${EXECUTORCH_BUILD_FLATC}"
77*523fa7a6SAndroid Build Coastguard Worker  )
78*523fa7a6SAndroid Build Coastguard Worker  message(
79*523fa7a6SAndroid Build Coastguard Worker    STATUS
80*523fa7a6SAndroid Build Coastguard Worker      "  EXECUTORCH_BUILD_GFLAGS                : ${EXECUTORCH_BUILD_GFLAGS}"
81*523fa7a6SAndroid Build Coastguard Worker  )
82*523fa7a6SAndroid Build Coastguard Worker  message(
83*523fa7a6SAndroid Build Coastguard Worker    STATUS
84*523fa7a6SAndroid Build Coastguard Worker      "  EXECUTORCH_BUILD_GTESTS                : ${EXECUTORCH_BUILD_GTESTS}"
85*523fa7a6SAndroid Build Coastguard Worker  )
86*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  EXECUTORCH_BUILD_HOST_TARGETS          : "
87*523fa7a6SAndroid Build Coastguard Worker                 "${EXECUTORCH_BUILD_HOST_TARGETS}"
88*523fa7a6SAndroid Build Coastguard Worker  )
89*523fa7a6SAndroid Build Coastguard Worker  message(
90*523fa7a6SAndroid Build Coastguard Worker    STATUS "  EXECUTORCH_BUILD_MPS                   : ${EXECUTORCH_BUILD_MPS}"
91*523fa7a6SAndroid Build Coastguard Worker  )
92*523fa7a6SAndroid Build Coastguard Worker  message(
93*523fa7a6SAndroid Build Coastguard Worker    STATUS
94*523fa7a6SAndroid Build Coastguard Worker      "  EXECUTORCH_BUILD_PYBIND                : ${EXECUTORCH_BUILD_PYBIND}"
95*523fa7a6SAndroid Build Coastguard Worker  )
96*523fa7a6SAndroid Build Coastguard Worker  message(
97*523fa7a6SAndroid Build Coastguard Worker    STATUS "  EXECUTORCH_BUILD_QNN                   : ${EXECUTORCH_BUILD_QNN}"
98*523fa7a6SAndroid Build Coastguard Worker  )
99*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  EXECUTORCH_BUILD_KERNELS_OPTIMIZED     : "
100*523fa7a6SAndroid Build Coastguard Worker                 "${EXECUTORCH_BUILD_KERNELS_OPTIMIZED}"
101*523fa7a6SAndroid Build Coastguard Worker  )
102*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "  EXECUTORCH_BUILD_KERNELS_QUANTIZED     : "
103*523fa7a6SAndroid Build Coastguard Worker                 "${EXECUTORCH_BUILD_KERNELS_QUANTIZED}"
104*523fa7a6SAndroid Build Coastguard Worker  )
105*523fa7a6SAndroid Build Coastguard Worker  message(
106*523fa7a6SAndroid Build Coastguard Worker    STATUS "  EXECUTORCH_BUILD_DEVTOOLS              : ${EXECUTORCH_BUILD_DEVTOOLS}"
107*523fa7a6SAndroid Build Coastguard Worker  )
108*523fa7a6SAndroid Build Coastguard Worker  message(
109*523fa7a6SAndroid Build Coastguard Worker    STATUS
110*523fa7a6SAndroid Build Coastguard Worker      "  EXECUTORCH_BUILD_SIZE_TEST             : ${EXECUTORCH_BUILD_SIZE_TEST}"
111*523fa7a6SAndroid Build Coastguard Worker  )
112*523fa7a6SAndroid Build Coastguard Worker  message(
113*523fa7a6SAndroid Build Coastguard Worker    STATUS
114*523fa7a6SAndroid Build Coastguard Worker      "  EXECUTORCH_BUILD_XNNPACK               : ${EXECUTORCH_BUILD_XNNPACK}"
115*523fa7a6SAndroid Build Coastguard Worker  )
116*523fa7a6SAndroid Build Coastguard Worker  message(
117*523fa7a6SAndroid Build Coastguard Worker    STATUS
118*523fa7a6SAndroid Build Coastguard Worker      "  EXECUTORCH_BUILD_VULKAN                : ${EXECUTORCH_BUILD_VULKAN}"
119*523fa7a6SAndroid Build Coastguard Worker  )
120*523fa7a6SAndroid Build Coastguard Worker  message(
121*523fa7a6SAndroid Build Coastguard Worker    STATUS
122*523fa7a6SAndroid Build Coastguard Worker      "  EXECUTORCH_BUILD_PTHREADPOOL           : ${EXECUTORCH_BUILD_PTHREADPOOL}"
123*523fa7a6SAndroid Build Coastguard Worker  )
124*523fa7a6SAndroid Build Coastguard Worker  message(
125*523fa7a6SAndroid Build Coastguard Worker    STATUS
126*523fa7a6SAndroid Build Coastguard Worker      "  EXECUTORCH_BUILD_CPUINFO               : ${EXECUTORCH_BUILD_CPUINFO}"
127*523fa7a6SAndroid Build Coastguard Worker  )
128*523fa7a6SAndroid Build Coastguard Worker
129*523fa7a6SAndroid Build Coastguard Workerendfunction()
130*523fa7a6SAndroid Build Coastguard Worker
131*523fa7a6SAndroid Build Coastguard Worker# This is the funtion to use -Wl, --whole-archive to link static library NB:
132*523fa7a6SAndroid Build Coastguard Worker# target_link_options is broken for this case, it only append the interface link
133*523fa7a6SAndroid Build Coastguard Worker# options of the first library.
134*523fa7a6SAndroid Build Coastguard Workerfunction(kernel_link_options target_name)
135*523fa7a6SAndroid Build Coastguard Worker  # target_link_options(${target_name} INTERFACE
136*523fa7a6SAndroid Build Coastguard Worker  # "$<LINK_LIBRARY:WHOLE_ARCHIVE,target_name>")
137*523fa7a6SAndroid Build Coastguard Worker  target_link_options(
138*523fa7a6SAndroid Build Coastguard Worker    ${target_name} INTERFACE "SHELL:LINKER:--whole-archive \
139*523fa7a6SAndroid Build Coastguard Worker    $<TARGET_FILE:${target_name}> \
140*523fa7a6SAndroid Build Coastguard Worker    LINKER:--no-whole-archive"
141*523fa7a6SAndroid Build Coastguard Worker  )
142*523fa7a6SAndroid Build Coastguard Workerendfunction()
143*523fa7a6SAndroid Build Coastguard Worker
144*523fa7a6SAndroid Build Coastguard Worker# Same as kernel_link_options but it's for MacOS linker
145*523fa7a6SAndroid Build Coastguard Workerfunction(macos_kernel_link_options target_name)
146*523fa7a6SAndroid Build Coastguard Worker  target_link_options(
147*523fa7a6SAndroid Build Coastguard Worker    ${target_name} INTERFACE
148*523fa7a6SAndroid Build Coastguard Worker    "SHELL:LINKER:-force_load,$<TARGET_FILE:${target_name}>"
149*523fa7a6SAndroid Build Coastguard Worker  )
150*523fa7a6SAndroid Build Coastguard Workerendfunction()
151*523fa7a6SAndroid Build Coastguard Worker
152*523fa7a6SAndroid Build Coastguard Worker# Same as kernel_link_options but it's for MSVC linker
153*523fa7a6SAndroid Build Coastguard Workerfunction(msvc_kernel_link_options target_name)
154*523fa7a6SAndroid Build Coastguard Worker  target_link_options(
155*523fa7a6SAndroid Build Coastguard Worker    ${target_name} INTERFACE
156*523fa7a6SAndroid Build Coastguard Worker    "SHELL:LINKER:/WHOLEARCHIVE:$<TARGET_FILE:${target_name}>"
157*523fa7a6SAndroid Build Coastguard Worker  )
158*523fa7a6SAndroid Build Coastguard Workerendfunction()
159*523fa7a6SAndroid Build Coastguard Worker
160*523fa7a6SAndroid Build Coastguard Worker# Ensure that the load-time constructor functions run. By default, the linker
161*523fa7a6SAndroid Build Coastguard Worker# would remove them since there are no other references to them.
162*523fa7a6SAndroid Build Coastguard Workerfunction(target_link_options_shared_lib target_name)
163*523fa7a6SAndroid Build Coastguard Worker  if(APPLE)
164*523fa7a6SAndroid Build Coastguard Worker    macos_kernel_link_options(${target_name})
165*523fa7a6SAndroid Build Coastguard Worker  elseif(MSVC)
166*523fa7a6SAndroid Build Coastguard Worker    msvc_kernel_link_options(${target_name})
167*523fa7a6SAndroid Build Coastguard Worker  else()
168*523fa7a6SAndroid Build Coastguard Worker    kernel_link_options(${target_name})
169*523fa7a6SAndroid Build Coastguard Worker  endif()
170*523fa7a6SAndroid Build Coastguard Workerendfunction()
171*523fa7a6SAndroid Build Coastguard Worker
172*523fa7a6SAndroid Build Coastguard Worker# Extract source files based on toml config. This is useful to keep buck2 and
173*523fa7a6SAndroid Build Coastguard Worker# cmake aligned. Do not regenerate if file exists.
174*523fa7a6SAndroid Build Coastguard Workerfunction(extract_sources sources_file)
175*523fa7a6SAndroid Build Coastguard Worker  if(EXISTS "${sources_file}")
176*523fa7a6SAndroid Build Coastguard Worker    message(STATUS "executorch: Using source file list ${sources_file}")
177*523fa7a6SAndroid Build Coastguard Worker  else()
178*523fa7a6SAndroid Build Coastguard Worker    # A file wasn't generated. Run a script to extract the source lists from the
179*523fa7a6SAndroid Build Coastguard Worker    # buck2 build system and write them to a file we can include.
180*523fa7a6SAndroid Build Coastguard Worker    #
181*523fa7a6SAndroid Build Coastguard Worker    # NOTE: This will only happen once during cmake setup, so it will not re-run
182*523fa7a6SAndroid Build Coastguard Worker    # if the buck2 targets change.
183*523fa7a6SAndroid Build Coastguard Worker    message(STATUS "executorch: Generating source file list ${sources_file}")
184*523fa7a6SAndroid Build Coastguard Worker    if(EXECUTORCH_ROOT)
185*523fa7a6SAndroid Build Coastguard Worker      set(executorch_root ${EXECUTORCH_ROOT})
186*523fa7a6SAndroid Build Coastguard Worker    else()
187*523fa7a6SAndroid Build Coastguard Worker      set(executorch_root ${CMAKE_CURRENT_SOURCE_DIR})
188*523fa7a6SAndroid Build Coastguard Worker    endif()
189*523fa7a6SAndroid Build Coastguard Worker
190*523fa7a6SAndroid Build Coastguard Worker    if(ANDROID_ABI)
191*523fa7a6SAndroid Build Coastguard Worker      if("${ANDROID_ABI}" STREQUAL "arm64-v8a")
192*523fa7a6SAndroid Build Coastguard Worker        set(target_platforms_arg "--target-platforms=shim//:android-arm64")
193*523fa7a6SAndroid Build Coastguard Worker      elseif("${ANDROID_ABI}" STREQUAL "x86_64")
194*523fa7a6SAndroid Build Coastguard Worker        set(target_platforms_arg "--target-platforms=shim//:android-x86_64")
195*523fa7a6SAndroid Build Coastguard Worker      else()
196*523fa7a6SAndroid Build Coastguard Worker        message(FATAL_ERROR "Unsupported ANDROID_ABI setting ${ANDROID_ABI}. Please add it here!")
197*523fa7a6SAndroid Build Coastguard Worker      endif()
198*523fa7a6SAndroid Build Coastguard Worker    endif()
199*523fa7a6SAndroid Build Coastguard Worker    execute_process(
200*523fa7a6SAndroid Build Coastguard Worker      COMMAND
201*523fa7a6SAndroid Build Coastguard Worker        ${PYTHON_EXECUTABLE} ${executorch_root}/build/extract_sources.py
202*523fa7a6SAndroid Build Coastguard Worker        --config=${executorch_root}/build/cmake_deps.toml --out=${sources_file}
203*523fa7a6SAndroid Build Coastguard Worker        --buck2=${BUCK2} ${target_platforms_arg}
204*523fa7a6SAndroid Build Coastguard Worker      OUTPUT_VARIABLE gen_srcs_output
205*523fa7a6SAndroid Build Coastguard Worker      ERROR_VARIABLE gen_srcs_error
206*523fa7a6SAndroid Build Coastguard Worker      RESULT_VARIABLE gen_srcs_exit_code
207*523fa7a6SAndroid Build Coastguard Worker      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
208*523fa7a6SAndroid Build Coastguard Worker    )
209*523fa7a6SAndroid Build Coastguard Worker
210*523fa7a6SAndroid Build Coastguard Worker    if(NOT gen_srcs_exit_code EQUAL 0)
211*523fa7a6SAndroid Build Coastguard Worker      message("Error while generating ${sources_file}. "
212*523fa7a6SAndroid Build Coastguard Worker              "Exit code: ${gen_srcs_exit_code}"
213*523fa7a6SAndroid Build Coastguard Worker      )
214*523fa7a6SAndroid Build Coastguard Worker      message("Output:\n${gen_srcs_output}")
215*523fa7a6SAndroid Build Coastguard Worker      message("Error:\n${gen_srcs_error}")
216*523fa7a6SAndroid Build Coastguard Worker      message(FATAL_ERROR "executorch: source list generation failed")
217*523fa7a6SAndroid Build Coastguard Worker    endif()
218*523fa7a6SAndroid Build Coastguard Worker  endif()
219*523fa7a6SAndroid Build Coastguard Workerendfunction()
220*523fa7a6SAndroid Build Coastguard Worker
221*523fa7a6SAndroid Build Coastguard Worker# Sets the value of the BUCK2 variable by searching for a buck2 binary with the
222*523fa7a6SAndroid Build Coastguard Worker# correct version.
223*523fa7a6SAndroid Build Coastguard Worker#
224*523fa7a6SAndroid Build Coastguard Worker# The resolve_buck.py script uses the following logic to find buck2: 1) If BUCK2
225*523fa7a6SAndroid Build Coastguard Worker# argument is set explicitly, use it. Warn if the version is incorrect. 2) Look
226*523fa7a6SAndroid Build Coastguard Worker# for a binary named buck2 on the system path. Take it if it is the correct
227*523fa7a6SAndroid Build Coastguard Worker# version. 3) Check for a previously downloaded buck2 binary (from step 4). 4)
228*523fa7a6SAndroid Build Coastguard Worker# Download and cache correct version of buck2.
229*523fa7a6SAndroid Build Coastguard Workerfunction(resolve_buck2)
230*523fa7a6SAndroid Build Coastguard Worker  if(EXECUTORCH_ROOT)
231*523fa7a6SAndroid Build Coastguard Worker    set(executorch_root ${EXECUTORCH_ROOT})
232*523fa7a6SAndroid Build Coastguard Worker  else()
233*523fa7a6SAndroid Build Coastguard Worker    set(executorch_root ${CMAKE_CURRENT_SOURCE_DIR})
234*523fa7a6SAndroid Build Coastguard Worker  endif()
235*523fa7a6SAndroid Build Coastguard Worker
236*523fa7a6SAndroid Build Coastguard Worker  set(resolve_buck2_command
237*523fa7a6SAndroid Build Coastguard Worker      ${PYTHON_EXECUTABLE} ${executorch_root}/build/resolve_buck.py
238*523fa7a6SAndroid Build Coastguard Worker      --cache_dir=${CMAKE_CURRENT_BINARY_DIR}/buck2-bin
239*523fa7a6SAndroid Build Coastguard Worker  )
240*523fa7a6SAndroid Build Coastguard Worker
241*523fa7a6SAndroid Build Coastguard Worker  if(NOT ${BUCK2} STREQUAL "")
242*523fa7a6SAndroid Build Coastguard Worker    list(APPEND resolve_buck2_command --buck2=${BUCK2})
243*523fa7a6SAndroid Build Coastguard Worker  endif()
244*523fa7a6SAndroid Build Coastguard Worker
245*523fa7a6SAndroid Build Coastguard Worker  execute_process(
246*523fa7a6SAndroid Build Coastguard Worker    COMMAND ${resolve_buck2_command}
247*523fa7a6SAndroid Build Coastguard Worker    OUTPUT_VARIABLE resolve_buck2_output
248*523fa7a6SAndroid Build Coastguard Worker    ERROR_VARIABLE resolve_buck2_error
249*523fa7a6SAndroid Build Coastguard Worker    RESULT_VARIABLE resolve_buck2_exit_code
250*523fa7a6SAndroid Build Coastguard Worker    WORKING_DIRECTORY ${executorch_root}
251*523fa7a6SAndroid Build Coastguard Worker    OUTPUT_STRIP_TRAILING_WHITESPACE
252*523fa7a6SAndroid Build Coastguard Worker  )
253*523fa7a6SAndroid Build Coastguard Worker
254*523fa7a6SAndroid Build Coastguard Worker  # $BUCK2 is a copy of the var from the parent scope. This block will set
255*523fa7a6SAndroid Build Coastguard Worker  # $buck2 to the value we want to return.
256*523fa7a6SAndroid Build Coastguard Worker  if(resolve_buck2_exit_code EQUAL 0)
257*523fa7a6SAndroid Build Coastguard Worker    set(buck2 ${resolve_buck2_output})
258*523fa7a6SAndroid Build Coastguard Worker    message(STATUS "Resolved buck2 as ${resolve_buck2_output}.")
259*523fa7a6SAndroid Build Coastguard Worker  elseif(resolve_buck2_exit_code EQUAL 2)
260*523fa7a6SAndroid Build Coastguard Worker    # Wrong buck version used. Stop here to ensure that the user sees the error.
261*523fa7a6SAndroid Build Coastguard Worker    message(FATAL_ERROR "Failed to resolve buck2.\n${resolve_buck2_error}")
262*523fa7a6SAndroid Build Coastguard Worker  else()
263*523fa7a6SAndroid Build Coastguard Worker    # Unexpected failure of the script. Warn.
264*523fa7a6SAndroid Build Coastguard Worker    message(WARNING "Failed to resolve buck2.")
265*523fa7a6SAndroid Build Coastguard Worker    message(WARNING "${resolve_buck2_error}")
266*523fa7a6SAndroid Build Coastguard Worker
267*523fa7a6SAndroid Build Coastguard Worker    if("${BUCK2}" STREQUAL "")
268*523fa7a6SAndroid Build Coastguard Worker      set(buck2 "buck2")
269*523fa7a6SAndroid Build Coastguard Worker    endif()
270*523fa7a6SAndroid Build Coastguard Worker  endif()
271*523fa7a6SAndroid Build Coastguard Worker
272*523fa7a6SAndroid Build Coastguard Worker  # Update the var in the parent scope. Note that this does not modify our
273*523fa7a6SAndroid Build Coastguard Worker  # local $BUCK2 value.
274*523fa7a6SAndroid Build Coastguard Worker  set(BUCK2 "${buck2}" PARENT_SCOPE)
275*523fa7a6SAndroid Build Coastguard Worker
276*523fa7a6SAndroid Build Coastguard Worker  # The buck2 daemon can get stuck. Killing it can help.
277*523fa7a6SAndroid Build Coastguard Worker  message(STATUS "Killing buck2 daemon")
278*523fa7a6SAndroid Build Coastguard Worker  execute_process(
279*523fa7a6SAndroid Build Coastguard Worker    # Note that we need to use the local buck2 variable. BUCK2 is only set in
280*523fa7a6SAndroid Build Coastguard Worker    # the parent scope, and can still be empty in this scope.
281*523fa7a6SAndroid Build Coastguard Worker    COMMAND "${buck2} kill"
282*523fa7a6SAndroid Build Coastguard Worker    WORKING_DIRECTORY ${executorch_root}
283*523fa7a6SAndroid Build Coastguard Worker    COMMAND_ECHO STDOUT
284*523fa7a6SAndroid Build Coastguard Worker  )
285*523fa7a6SAndroid Build Coastguard Workerendfunction()
286*523fa7a6SAndroid Build Coastguard Worker
287*523fa7a6SAndroid Build Coastguard Worker# Sets the value of the PYTHON_EXECUTABLE variable to 'python' if in an active
288*523fa7a6SAndroid Build Coastguard Worker# (non-base) conda environment, and 'python3' otherwise. This maintains
289*523fa7a6SAndroid Build Coastguard Worker# backwards compatibility for non-conda users and avoids conda users needing to
290*523fa7a6SAndroid Build Coastguard Worker# explicitly set PYTHON_EXECUTABLE=python.
291*523fa7a6SAndroid Build Coastguard Workerfunction(resolve_python_executable)
292*523fa7a6SAndroid Build Coastguard Worker  # Counter-intuitively, CONDA_DEFAULT_ENV contains the name of the active
293*523fa7a6SAndroid Build Coastguard Worker  # environment.
294*523fa7a6SAndroid Build Coastguard Worker  if(DEFINED ENV{CONDA_DEFAULT_ENV} AND NOT $ENV{CONDA_DEFAULT_ENV} STREQUAL
295*523fa7a6SAndroid Build Coastguard Worker                                        "base"
296*523fa7a6SAndroid Build Coastguard Worker  )
297*523fa7a6SAndroid Build Coastguard Worker    set(PYTHON_EXECUTABLE
298*523fa7a6SAndroid Build Coastguard Worker        python
299*523fa7a6SAndroid Build Coastguard Worker        PARENT_SCOPE
300*523fa7a6SAndroid Build Coastguard Worker    )
301*523fa7a6SAndroid Build Coastguard Worker  else()
302*523fa7a6SAndroid Build Coastguard Worker    set(PYTHON_EXECUTABLE
303*523fa7a6SAndroid Build Coastguard Worker        python3
304*523fa7a6SAndroid Build Coastguard Worker        PARENT_SCOPE
305*523fa7a6SAndroid Build Coastguard Worker    )
306*523fa7a6SAndroid Build Coastguard Worker  endif()
307*523fa7a6SAndroid Build Coastguard Workerendfunction()
308