xref: /aosp_15_r20/external/executorch/devtools/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# Please this file formatted by running:
8*523fa7a6SAndroid Build Coastguard Worker# ~~~
9*523fa7a6SAndroid Build Coastguard Worker# cmake-format -i CMakeLists.txt
10*523fa7a6SAndroid Build Coastguard Worker# ~~~
11*523fa7a6SAndroid Build Coastguard Worker
12*523fa7a6SAndroid Build Coastguard Workercmake_minimum_required(VERSION 3.19)
13*523fa7a6SAndroid Build Coastguard Worker
14*523fa7a6SAndroid Build Coastguard Workerset(CMAKE_EXPORT_COMPILE_COMMANDS ON)
15*523fa7a6SAndroid Build Coastguard Worker
16*523fa7a6SAndroid Build Coastguard Workerif(NOT CMAKE_CXX_STANDARD)
17*523fa7a6SAndroid Build Coastguard Worker  set(CMAKE_CXX_STANDARD 17)
18*523fa7a6SAndroid Build Coastguard Workerendif()
19*523fa7a6SAndroid Build Coastguard Worker
20*523fa7a6SAndroid Build Coastguard Workerif(NOT FLATCC_EXECUTABLE)
21*523fa7a6SAndroid Build Coastguard Worker  set(FLATCC_EXECUTABLE flatcc)
22*523fa7a6SAndroid Build Coastguard Workerendif()
23*523fa7a6SAndroid Build Coastguard Worker
24*523fa7a6SAndroid Build Coastguard Worker# Source root directory for executorch.
25*523fa7a6SAndroid Build Coastguard Workerif(NOT EXECUTORCH_ROOT)
26*523fa7a6SAndroid Build Coastguard Worker  set(EXECUTORCH_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/..)
27*523fa7a6SAndroid Build Coastguard Workerendif()
28*523fa7a6SAndroid Build Coastguard Worker
29*523fa7a6SAndroid Build Coastguard Workerinclude(${EXECUTORCH_ROOT}/build/Utils.cmake)
30*523fa7a6SAndroid Build Coastguard Worker
31*523fa7a6SAndroid Build Coastguard Workerif(NOT PYTHON_EXECUTABLE)
32*523fa7a6SAndroid Build Coastguard Worker  resolve_python_executable()
33*523fa7a6SAndroid Build Coastguard Workerendif()
34*523fa7a6SAndroid Build Coastguard Worker
35*523fa7a6SAndroid Build Coastguard Workerif(NOT FLATC_EXECUTABLE)
36*523fa7a6SAndroid Build Coastguard Worker  set(FLATC_EXECUTABLE flatc)
37*523fa7a6SAndroid Build Coastguard Workerendif()
38*523fa7a6SAndroid Build Coastguard Worker
39*523fa7a6SAndroid Build Coastguard Worker# Paths to headers generated from the .fbs files. set(_etdump_schemas
40*523fa7a6SAndroid Build Coastguard Worker# etdump_schema_flatcc.fbs scalar_type.fbs)
41*523fa7a6SAndroid Build Coastguard Worker
42*523fa7a6SAndroid Build Coastguard Workerset(_etdump_schema_names "etdump_schema_flatcc.fbs" "scalar_type.fbs")
43*523fa7a6SAndroid Build Coastguard Workerset(_bundled_input_schema_names "bundled_program_schema.fbs" "scalar_type.fbs")
44*523fa7a6SAndroid Build Coastguard Worker
45*523fa7a6SAndroid Build Coastguard Workerforeach(schema_file ${_etdump_schema_names})
46*523fa7a6SAndroid Build Coastguard Worker  list(APPEND _etdump_schema__srcs
47*523fa7a6SAndroid Build Coastguard Worker       "${CMAKE_CURRENT_SOURCE_DIR}/etdump/${schema_file}"
48*523fa7a6SAndroid Build Coastguard Worker  )
49*523fa7a6SAndroid Build Coastguard Workerendforeach()
50*523fa7a6SAndroid Build Coastguard Worker
51*523fa7a6SAndroid Build Coastguard Workerforeach(schema_file ${_bundled_input_schema_names})
52*523fa7a6SAndroid Build Coastguard Worker  list(APPEND _bundled_program_schema__srcs
53*523fa7a6SAndroid Build Coastguard Worker       "${CMAKE_CURRENT_SOURCE_DIR}/bundled_program/schema/${schema_file}"
54*523fa7a6SAndroid Build Coastguard Worker  )
55*523fa7a6SAndroid Build Coastguard Workerendforeach()
56*523fa7a6SAndroid Build Coastguard Worker
57*523fa7a6SAndroid Build Coastguard Workerset(FLATCC_TEST
58*523fa7a6SAndroid Build Coastguard Worker    OFF
59*523fa7a6SAndroid Build Coastguard Worker    CACHE BOOL ""
60*523fa7a6SAndroid Build Coastguard Worker)
61*523fa7a6SAndroid Build Coastguard Workerset(FLATCC_REFLECTION
62*523fa7a6SAndroid Build Coastguard Worker    OFF
63*523fa7a6SAndroid Build Coastguard Worker    CACHE BOOL ""
64*523fa7a6SAndroid Build Coastguard Worker)
65*523fa7a6SAndroid Build Coastguard Workerset(FLATCC_DEBUG_CLANG_SANITIZE
66*523fa7a6SAndroid Build Coastguard Worker    OFF
67*523fa7a6SAndroid Build Coastguard Worker    CACHE BOOL ""
68*523fa7a6SAndroid Build Coastguard Worker)
69*523fa7a6SAndroid Build Coastguard Workerset(_flatcc_source_dir ${CMAKE_CURRENT_SOURCE_DIR}/../third-party/flatcc)
70*523fa7a6SAndroid Build Coastguard Workeradd_subdirectory(${_flatcc_source_dir} ${CMAKE_BINARY_DIR}/third-party/flatcc)
71*523fa7a6SAndroid Build Coastguard Worker
72*523fa7a6SAndroid Build Coastguard Worker# Fix for "relocation R_X86_64_32 against `.rodata' can not be used when making
73*523fa7a6SAndroid Build Coastguard Worker# a shared object; recompile with -fPIC" when building on some x86 linux
74*523fa7a6SAndroid Build Coastguard Worker# systems.
75*523fa7a6SAndroid Build Coastguard Workerset_property(TARGET flatccrt PROPERTY POSITION_INDEPENDENT_CODE ON)
76*523fa7a6SAndroid Build Coastguard Worker
77*523fa7a6SAndroid Build Coastguard Worker# Assume we are cross-compiling and the CMAKE_TOOLCHAIN_FILE is set
78*523fa7a6SAndroid Build Coastguard Workerinclude(ExternalProject)
79*523fa7a6SAndroid Build Coastguard Worker
80*523fa7a6SAndroid Build Coastguard Worker# The include directory that will contain the generated schema headers.
81*523fa7a6SAndroid Build Coastguard Workerset(_program_schema__include_dir "${CMAKE_BINARY_DIR}/devtools/include")
82*523fa7a6SAndroid Build Coastguard Workerset(_bundled_schema__include_dir "${CMAKE_BINARY_DIR}/devtools/bundled_program")
83*523fa7a6SAndroid Build Coastguard Worker
84*523fa7a6SAndroid Build Coastguard Worker# TODO(dbort): Only enable this when cross-compiling. It can cause build race
85*523fa7a6SAndroid Build Coastguard Worker# conditions (libflatcc.a errors) when enabled.
86*523fa7a6SAndroid Build Coastguard Workeroption(EXECUTORCH_SEPARATE_FLATCC_HOST_PROJECT
87*523fa7a6SAndroid Build Coastguard Worker       "Whether to build the flatcc commandline tool as a separate project" ON
88*523fa7a6SAndroid Build Coastguard Worker)
89*523fa7a6SAndroid Build Coastguard Worker
90*523fa7a6SAndroid Build Coastguard Workerif(EXECUTORCH_SEPARATE_FLATCC_HOST_PROJECT)
91*523fa7a6SAndroid Build Coastguard Worker  # Add the host project. We build this separately so that we can generate
92*523fa7a6SAndroid Build Coastguard Worker  # headers on the host during the build, even if we're cross-compiling the
93*523fa7a6SAndroid Build Coastguard Worker  # flatcc runtime to a different architecture.
94*523fa7a6SAndroid Build Coastguard Worker  execute_process(
95*523fa7a6SAndroid Build Coastguard Worker    COMMAND
96*523fa7a6SAndroid Build Coastguard Worker      ${CMAKE_COMMAND} ${_flatcc_source_dir} -DFLATCC_TEST=OFF
97*523fa7a6SAndroid Build Coastguard Worker      -DFLATCC_REFLECTION=OFF
98*523fa7a6SAndroid Build Coastguard Worker      # See above comment about POSITION_INDEPENDENT_CODE.
99*523fa7a6SAndroid Build Coastguard Worker      -DCMAKE_POSITION_INDEPENDENT_CODE=ON -B${CMAKE_BINARY_DIR}/_host_build
100*523fa7a6SAndroid Build Coastguard Worker  )
101*523fa7a6SAndroid Build Coastguard Worker  execute_process(
102*523fa7a6SAndroid Build Coastguard Worker    COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/_host_build
103*523fa7a6SAndroid Build Coastguard Worker  )
104*523fa7a6SAndroid Build Coastguard Worker  set(_etdump_schema_gen_dep)
105*523fa7a6SAndroid Build Coastguard Worker  # TODO(dbort): flatcc installs its files directly in its source directory
106*523fa7a6SAndroid Build Coastguard Worker  # instead of under CMAKE_BINARY_DIR, and it has no options to avoid doing
107*523fa7a6SAndroid Build Coastguard Worker  # this. We build flatcc twice in the executorch build: once to get the
108*523fa7a6SAndroid Build Coastguard Worker  # `flatcc` host commandline tool, and once to get the (potentially
109*523fa7a6SAndroid Build Coastguard Worker  # cross-compiled) target runtime library. The host build will put its outputs
110*523fa7a6SAndroid Build Coastguard Worker  # in the source tree, making the cross-compiling target build think that the
111*523fa7a6SAndroid Build Coastguard Worker  # outputs have already been built. It will then try to link against the
112*523fa7a6SAndroid Build Coastguard Worker  # host-architecture libraries, failing when cross-compiling. To work around
113*523fa7a6SAndroid Build Coastguard Worker  # this, delete the host outputs after running this command (which only runs
114*523fa7a6SAndroid Build Coastguard Worker  # when setting up the cmake files, not when actually building). This leaves
115*523fa7a6SAndroid Build Coastguard Worker  # room for the target build to put its own files in the source tree. We should
116*523fa7a6SAndroid Build Coastguard Worker  # try to remove this hack, ideally by submitting an upstream PR that adds an
117*523fa7a6SAndroid Build Coastguard Worker  # option to change the installation location.
118*523fa7a6SAndroid Build Coastguard Worker  set(_etdump_schema_cleanup_paths ${_flatcc_source_dir}/bin/*
119*523fa7a6SAndroid Build Coastguard Worker                                   ${_flatcc_source_dir}/lib/*
120*523fa7a6SAndroid Build Coastguard Worker  )
121*523fa7a6SAndroid Build Coastguard Workerelse()
122*523fa7a6SAndroid Build Coastguard Worker  # If we're not cross-compiling, we can just use the plain commandline target.
123*523fa7a6SAndroid Build Coastguard Worker  set(_etdump_schema_gen_dep flatcc_cli)
124*523fa7a6SAndroid Build Coastguard Worker  set(_etdump_schema_cleanup_paths "")
125*523fa7a6SAndroid Build Coastguard Workerendif()
126*523fa7a6SAndroid Build Coastguard Worker
127*523fa7a6SAndroid Build Coastguard Workerset(_etdump_schema__outputs)
128*523fa7a6SAndroid Build Coastguard Workerforeach(fbs_file ${_etdump_schema_names})
129*523fa7a6SAndroid Build Coastguard Worker  string(REGEX REPLACE "[.]fbs$" "_reader.h" generated "${fbs_file}")
130*523fa7a6SAndroid Build Coastguard Worker  list(APPEND _etdump_schema__outputs
131*523fa7a6SAndroid Build Coastguard Worker       "${_program_schema__include_dir}/executorch/devtools/etdump/${generated}"
132*523fa7a6SAndroid Build Coastguard Worker  )
133*523fa7a6SAndroid Build Coastguard Worker  string(REGEX REPLACE "[.]fbs$" "_builder.h" generated "${fbs_file}")
134*523fa7a6SAndroid Build Coastguard Worker  list(APPEND _etdump_schema__outputs
135*523fa7a6SAndroid Build Coastguard Worker       "${_program_schema__include_dir}/executorch/devtools/etdump/${generated}"
136*523fa7a6SAndroid Build Coastguard Worker  )
137*523fa7a6SAndroid Build Coastguard Workerendforeach()
138*523fa7a6SAndroid Build Coastguard Worker
139*523fa7a6SAndroid Build Coastguard Worker# lint_cmake: -linelength
140*523fa7a6SAndroid Build Coastguard Workerset(_bundled_program_schema__outputs)
141*523fa7a6SAndroid Build Coastguard Workerforeach(fbs_file ${_bundled_input_schema_names})
142*523fa7a6SAndroid Build Coastguard Worker  string(REGEX REPLACE "[.]fbs$" "_generated.h" generated "${fbs_file}")
143*523fa7a6SAndroid Build Coastguard Worker  list(
144*523fa7a6SAndroid Build Coastguard Worker    APPEND
145*523fa7a6SAndroid Build Coastguard Worker    _bundled_program_schema__outputs
146*523fa7a6SAndroid Build Coastguard Worker    "${_bundled_schema__include_dir}/executorch/devtools/bundled_program/schema/${generated}"
147*523fa7a6SAndroid Build Coastguard Worker  )
148*523fa7a6SAndroid Build Coastguard Workerendforeach()
149*523fa7a6SAndroid Build Coastguard Worker
150*523fa7a6SAndroid Build Coastguard Workeradd_library(etdump_schema INTERFACE ${_etdump_schema__outputs})
151*523fa7a6SAndroid Build Coastguard Workeradd_library(
152*523fa7a6SAndroid Build Coastguard Worker  bundled_program_schema INTERFACE ${_bundled_program_schema__outputs}
153*523fa7a6SAndroid Build Coastguard Worker)
154*523fa7a6SAndroid Build Coastguard Worker
155*523fa7a6SAndroid Build Coastguard Workerfile(MAKE_DIRECTORY ${_program_schema__include_dir}/executorch/devtools/etdump)
156*523fa7a6SAndroid Build Coastguard Workerfile(MAKE_DIRECTORY
157*523fa7a6SAndroid Build Coastguard Worker     ${_program_schema__include_dir}/executorch/devtools/bundled_program
158*523fa7a6SAndroid Build Coastguard Worker)
159*523fa7a6SAndroid Build Coastguard Worker
160*523fa7a6SAndroid Build Coastguard Workeradd_custom_command(
161*523fa7a6SAndroid Build Coastguard Worker  OUTPUT ${_etdump_schema__outputs}
162*523fa7a6SAndroid Build Coastguard Worker  COMMAND
163*523fa7a6SAndroid Build Coastguard Worker    # Note that the flatcc project actually writes its outputs into the source
164*523fa7a6SAndroid Build Coastguard Worker    # tree instead of under the binary directory, and there's no way to change
165*523fa7a6SAndroid Build Coastguard Worker    # that behavior.
166*523fa7a6SAndroid Build Coastguard Worker    ${_flatcc_source_dir}/bin/flatcc -cwr -o
167*523fa7a6SAndroid Build Coastguard Worker    ${_program_schema__include_dir}/executorch/devtools/etdump
168*523fa7a6SAndroid Build Coastguard Worker    ${_etdump_schema__srcs}
169*523fa7a6SAndroid Build Coastguard Worker  COMMAND rm -f ${_etdump_schema_cleanup_paths}
170*523fa7a6SAndroid Build Coastguard Worker  DEPENDS ${_etdump_schema_gen_dep}
171*523fa7a6SAndroid Build Coastguard Worker  COMMENT "Generating etdump headers"
172*523fa7a6SAndroid Build Coastguard Worker)
173*523fa7a6SAndroid Build Coastguard Worker
174*523fa7a6SAndroid Build Coastguard Workeradd_library(
175*523fa7a6SAndroid Build Coastguard Worker  etdump ${CMAKE_CURRENT_SOURCE_DIR}/etdump/etdump_flatcc.cpp
176*523fa7a6SAndroid Build Coastguard Worker         ${CMAKE_CURRENT_SOURCE_DIR}/etdump/emitter.cpp
177*523fa7a6SAndroid Build Coastguard Worker)
178*523fa7a6SAndroid Build Coastguard Worker
179*523fa7a6SAndroid Build Coastguard Workertarget_link_libraries(
180*523fa7a6SAndroid Build Coastguard Worker  etdump
181*523fa7a6SAndroid Build Coastguard Worker  PUBLIC etdump_schema flatccrt
182*523fa7a6SAndroid Build Coastguard Worker  PRIVATE executorch
183*523fa7a6SAndroid Build Coastguard Worker)
184*523fa7a6SAndroid Build Coastguard Worker
185*523fa7a6SAndroid Build Coastguard Workeradd_custom_command(
186*523fa7a6SAndroid Build Coastguard Worker  OUTPUT ${_bundled_program_schema__outputs}
187*523fa7a6SAndroid Build Coastguard Worker  COMMAND
188*523fa7a6SAndroid Build Coastguard Worker    ${FLATC_EXECUTABLE} --cpp --cpp-std c++11 --gen-mutable --scoped-enums -o
189*523fa7a6SAndroid Build Coastguard Worker    "${_bundled_schema__include_dir}/executorch/devtools/bundled_program/schema"
190*523fa7a6SAndroid Build Coastguard Worker    ${_bundled_program_schema__srcs}
191*523fa7a6SAndroid Build Coastguard Worker  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/devtools
192*523fa7a6SAndroid Build Coastguard Worker  DEPENDS ${FLATC_EXECUTABLE} ${_bundled_program_schema__srcs}
193*523fa7a6SAndroid Build Coastguard Worker  COMMENT "Generating bundled_program headers"
194*523fa7a6SAndroid Build Coastguard Worker  VERBATIM
195*523fa7a6SAndroid Build Coastguard Worker)
196*523fa7a6SAndroid Build Coastguard Worker
197*523fa7a6SAndroid Build Coastguard Worker# add_library(bundled_program INTERFACE ${_bundled_program_schema__outputs})
198*523fa7a6SAndroid Build Coastguard Workeradd_library(
199*523fa7a6SAndroid Build Coastguard Worker  bundled_program
200*523fa7a6SAndroid Build Coastguard Worker  ${CMAKE_CURRENT_SOURCE_DIR}/bundled_program/bundled_program.cpp
201*523fa7a6SAndroid Build Coastguard Worker)
202*523fa7a6SAndroid Build Coastguard Workertarget_link_libraries(bundled_program executorch bundled_program_schema)
203*523fa7a6SAndroid Build Coastguard Worker
204*523fa7a6SAndroid Build Coastguard Workerset_target_properties(bundled_program PROPERTIES LINKER_LANGUAGE CXX)
205*523fa7a6SAndroid Build Coastguard Workertarget_include_directories(
206*523fa7a6SAndroid Build Coastguard Worker  bundled_program PUBLIC ${_bundled_schema__include_dir}
207*523fa7a6SAndroid Build Coastguard Worker                         ${EXECUTORCH_ROOT}/third-party/flatbuffers/include
208*523fa7a6SAndroid Build Coastguard Worker)
209*523fa7a6SAndroid Build Coastguard Worker
210*523fa7a6SAndroid Build Coastguard Workertarget_include_directories(
211*523fa7a6SAndroid Build Coastguard Worker  etdump PUBLIC ${_program_schema__include_dir} ${_flatcc_source_dir}/include
212*523fa7a6SAndroid Build Coastguard Worker)
213*523fa7a6SAndroid Build Coastguard Worker
214*523fa7a6SAndroid Build Coastguard Worker# Install libraries
215*523fa7a6SAndroid Build Coastguard Workerinstall(
216*523fa7a6SAndroid Build Coastguard Worker  TARGETS bundled_program etdump flatccrt
217*523fa7a6SAndroid Build Coastguard Worker  DESTINATION ${CMAKE_BINARY_DIR}/lib
218*523fa7a6SAndroid Build Coastguard Worker  INCLUDES
219*523fa7a6SAndroid Build Coastguard Worker  DESTINATION ${_common_include_directories}
220*523fa7a6SAndroid Build Coastguard Worker)
221