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